From 50622111d20d624a8d7ef636c04f7acda7a09766 Mon Sep 17 00:00:00 2001
From: Thomas Jahns <jahns@dkrz.de>
Date: Mon, 30 Sep 2024 09:57:14 +0200
Subject: [PATCH] Add automatically generated files.

---
 Makefile.in                       |   970 +
 aclocal.m4                        |  1462 +
 app/Makefile.in                   |   843 +
 config/compile                    |   348 +
 config/config.guess               |  1815 +
 config/config.sub                 |  2354 +
 config/depcomp                    |   791 +
 config/install-sh                 |   518 +
 config/ltmain.sh                  | 11269 ++++
 config/missing                    |   215 +
 config/py-compile                 |   170 +
 config/test-driver                |   148 +
 configure                         | 38347 ++++++++++++++
 doc/cdi_cman.pdf                  |   Bin 0 -> 356748 bytes
 doc/cdi_fman.pdf                  |   Bin 0 -> 383315 bytes
 examples/Makefile.in              |  1057 +
 examples/pio/Makefile.in          |   895 +
 interfaces/Makefile.in            |  1394 +
 interfaces/python/Cdi.py          |  1379 +
 interfaces/python/Makefile.in     |   861 +
 interfaces/python/cdi_wrapper.cpp | 29389 +++++++++++
 interfaces/ruby/cdi_wrapper.cpp   | 33805 ++++++++++++
 m4/libtool.m4                     |  8372 +++
 m4/ltoptions.m4                   |   437 +
 m4/ltsugar.m4                     |   124 +
 m4/ltversion.m4                   |    23 +
 m4/lt~obsolete.m4                 |    99 +
 src/Makefile.in                   |  1597 +
 src/cdi.inc                       |  2626 +
 src/cdiFortran.c                  |   813 +
 src/cdilib.c                      | 76205 ++++++++++++++++++++++++++++
 src/cdipio.inc                    |   318 +
 src/cdipioFortran.c               |   186 +
 src/config.h.in                   |   361 +
 src/mo_cdi.f90                    |  6161 +++
 tests/Makefile.in                 |  1678 +
 36 files changed, 227030 insertions(+)
 create mode 100644 Makefile.in
 create mode 100644 aclocal.m4
 create mode 100644 app/Makefile.in
 create mode 100755 config/compile
 create mode 100755 config/config.guess
 create mode 100755 config/config.sub
 create mode 100755 config/depcomp
 create mode 100755 config/install-sh
 create mode 100644 config/ltmain.sh
 create mode 100755 config/missing
 create mode 100755 config/py-compile
 create mode 100755 config/test-driver
 create mode 100755 configure
 create mode 100644 doc/cdi_cman.pdf
 create mode 100644 doc/cdi_fman.pdf
 create mode 100644 examples/Makefile.in
 create mode 100644 examples/pio/Makefile.in
 create mode 100644 interfaces/Makefile.in
 create mode 100644 interfaces/python/Cdi.py
 create mode 100644 interfaces/python/Makefile.in
 create mode 100644 interfaces/python/cdi_wrapper.cpp
 create mode 100644 interfaces/ruby/cdi_wrapper.cpp
 create mode 100644 m4/libtool.m4
 create mode 100644 m4/ltoptions.m4
 create mode 100644 m4/ltsugar.m4
 create mode 100644 m4/ltversion.m4
 create mode 100644 m4/lt~obsolete.m4
 create mode 100644 src/Makefile.in
 create mode 100644 src/cdi.inc
 create mode 100644 src/cdiFortran.c
 create mode 100644 src/cdilib.c
 create mode 100644 src/cdipio.inc
 create mode 100644 src/cdipioFortran.c
 create mode 100644 src/config.h.in
 create mode 100644 src/mo_cdi.f90
 create mode 100644 tests/Makefile.in

diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 000000000..ead66901f
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,970 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = cdi.settings \
+	src/cmake/cdi/cdi-config-version.cmake \
+	src/cmake/cdi/cdi-config.cmake src/pkgconfig/cdi.pc \
+	src/pkgconfig/cdi_f2003.pc src/pkgconfig/cdipio.pc \
+	tables/gen_tableheaderfile
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir distdir-am dist dist-all distcheck
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/cdi.settings.in \
+	$(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \
+	$(top_srcdir)/config/config.sub \
+	$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
+	$(top_srcdir)/config/missing \
+	$(top_srcdir)/src/cmake/cdi/cdi-config-version.cmake.in \
+	$(top_srcdir)/src/cmake/cdi/cdi-config.cmake.in \
+	$(top_srcdir)/src/pkgconfig/cdi.pc.in \
+	$(top_srcdir)/src/pkgconfig/cdi_f2003.pc.in \
+	$(top_srcdir)/src/pkgconfig/cdipio.pc.in \
+	$(top_srcdir)/tables/gen_tableheaderfile.in AUTHORS ChangeLog \
+	INSTALL NEWS README config/compile config/config.guess \
+	config/config.sub config/install-sh config/ltmain.sh \
+	config/missing config/py-compile
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = src interfaces app examples tests
+EXTRA_DIST = \
+  LICENSE \
+  config/interface.rb \
+  doc/cdi_cman.pdf \
+  doc/cdi_fman.pdf \
+  src/cfortran.doc
+
+ACLOCAL_AMFLAGS = -I m4
+all: all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+cdi.settings: $(top_builddir)/config.status $(srcdir)/cdi.settings.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/cmake/cdi/cdi-config-version.cmake: $(top_builddir)/config.status $(top_srcdir)/src/cmake/cdi/cdi-config-version.cmake.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/cmake/cdi/cdi-config.cmake: $(top_builddir)/config.status $(top_srcdir)/src/cmake/cdi/cdi-config.cmake.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/pkgconfig/cdi.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdi.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/pkgconfig/cdi_f2003.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdi_f2003.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+src/pkgconfig/cdipio.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdipio.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+tables/gen_tableheaderfile: $(top_builddir)/config.status $(top_srcdir)/tables/gen_tableheaderfile.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-libtool \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+examples: examples-recursive
+
+examples-am: examples-local
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool cscope cscopelist-am ctags ctags-am dist \
+	dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-generic \
+	distclean-libtool distclean-tags distcleancheck distdir \
+	distuninstallcheck dvi dvi-am examples-am examples-local html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# The pdf files below cannot be created in parallel:
+doc/cdi_cman.pdf: doc/cdi_fman.pdf
+
+doc/cdi_cman.pdf:
+	$(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_c && mv cdi_cman.pdf .. && ./cleanup
+
+doc/cdi_fman.pdf:
+	$(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_f && mv cdi_fman.pdf .. && ./cleanup
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 000000000..3bf66b005
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1462 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.16.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# AM_EXTRA_RECURSIVE_TARGETS                                -*- Autoconf -*-
+
+# Copyright (C) 2012-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_EXTRA_RECURSIVE_TARGETS
+# --------------------------
+# Define the list of user recursive targets.  This macro exists only to
+# be traced by Automake, which will ensure that a proper definition of
+# user-defined recursive targets (and associated rules) is propagated
+# into all the generated Makefiles.
+# TODO: We should really reject non-literal arguments here...
+AC_DEFUN([AM_EXTRA_RECURSIVE_TARGETS], [])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well.  Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+       [enable], [m4_define([am_maintainer_other], [disable])],
+       [disable], [m4_define([am_maintainer_other], [enable])],
+       [m4_define([am_maintainer_other], [enable])
+        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+  AC_ARG_ENABLE([maintainer-mode],
+    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+      am_maintainer_other[ make rules and dependencies not useful
+      (and sometimes confusing) to the casual installer])],
+    [USE_MAINTAINER_MODE=$enableval],
+    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages.  To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable.  To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement.  MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+  dnl Find a Python interpreter.  Python versions prior to 2.0 are not
+  dnl supported. (2.0 was released on October 16, 2000).
+  m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 dnl
+ python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl
+ python3.2 python3.1 python3.0 dnl
+ python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl
+ python2.0])
+
+  AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+  m4_if([$1],[],[
+    dnl No version check is needed.
+    # Find any Python interpreter.
+    if test -z "$PYTHON"; then
+      AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+    fi
+    am_display_PYTHON=python
+  ], [
+    dnl A version check is needed.
+    if test -n "$PYTHON"; then
+      # If the user set $PYTHON, use it and don't search something else.
+      AC_MSG_CHECKING([whether $PYTHON version is >= $1])
+      AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+			      [AC_MSG_RESULT([yes])],
+			      [AC_MSG_RESULT([no])
+			       AC_MSG_ERROR([Python interpreter is too old])])
+      am_display_PYTHON=$PYTHON
+    else
+      # Otherwise, try each interpreter until we find one that satisfies
+      # VERSION.
+      AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+	[am_cv_pathless_PYTHON],[
+	for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+	  test "$am_cv_pathless_PYTHON" = none && break
+	  AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+	done])
+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+      if test "$am_cv_pathless_PYTHON" = none; then
+	PYTHON=:
+      else
+        AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+      fi
+      am_display_PYTHON=$am_cv_pathless_PYTHON
+    fi
+  ])
+
+  if test "$PYTHON" = :; then
+  dnl Run any user-specified action, or abort.
+    m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+  else
+
+  dnl Query Python for its version number.  Getting [:3] seems to be
+  dnl the best way to do this; it's what "site.py" does in the standard
+  dnl library.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+    [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+  dnl Use the values of $prefix and $exec_prefix for the corresponding
+  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made
+  dnl distinct variables so they can be overridden if need be.  However,
+  dnl general consensus is that you shouldn't need this ability.
+
+  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+  dnl At times (like when building shared libraries) you may want
+  dnl to know which OS platform Python thinks this is.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+    [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+  # Just factor out some code duplication.
+  am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x.  See automake bug#10227.
+try:
+    import sysconfig
+except ImportError:
+    can_use_sysconfig = 0
+else:
+    can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+    from platform import python_implementation
+    if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7':
+        can_use_sysconfig = 0
+except ImportError:
+    pass"
+
+  dnl Set up 4 directories:
+
+  dnl pythondir -- where to install python scripts.  This is the
+  dnl   site-packages directory, not the python standard library
+  dnl   directory like in previous automake betas.  This behavior
+  dnl   is more consistent with lispdir.m4 for example.
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+    [am_cv_python_pythondir],
+    [if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	  ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
+  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is
+  dnl   more consistent with the rest of automake.
+
+  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+  dnl pyexecdir -- directory for installing python extension modules
+  dnl   (shared libraries)
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+    [am_cv_python_pyexecdir],
+    [if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	   ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+  dnl Run any user-specified action.
+  $2
+  fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+  AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/acx_assert_lang_is_fortran_variant.m4])
+m4_include([m4/acx_c_package.m4])
+m4_include([m4/acx_cfortran_flags.m4])
+m4_include([m4/acx_check_cfortran.m4])
+m4_include([m4/acx_check_strptr_convert.m4])
+m4_include([m4/acx_execinfo.m4])
+m4_include([m4/acx_fortran_check_include.m4])
+m4_include([m4/acx_fortran_include_flag.m4])
+m4_include([m4/acx_fortran_package.m4])
+m4_include([m4/acx_lang_check_include.m4])
+m4_include([m4/acx_lang_package.m4])
+m4_include([m4/acx_lt_problems.m4])
+m4_include([m4/acx_m4_list_to_quoted_strings.m4])
+m4_include([m4/acx_mpirun.m4])
+m4_include([m4/acx_mv_obj.m4])
+m4_include([m4/acx_option_search_libs.m4])
+m4_include([m4/acx_options.m4])
+m4_include([m4/acx_prog_cc_posix.m4])
+m4_include([m4/acx_sl_fc_mod_path_flag.m4])
+m4_include([m4/acx_sl_mod_suffix.m4])
+m4_include([m4/acx_tls_xlc_retry.m4])
+m4_include([m4/acx_use_libtool_configuration.m4])
+m4_include([m4/acx_uuid.m4])
+m4_include([m4/asx_tr_arg.m4])
+m4_include([m4/asx_unset.m4])
+m4_include([m4/ax_pthread.m4])
+m4_include([m4/ax_python_devel.m4])
+m4_include([m4/ax_tls.m4])
+m4_include([m4/kpse_libtool.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([m4/pkg.m4])
+m4_include([acinclude.m4])
diff --git a/app/Makefile.in b/app/Makefile.in
new file mode 100644
index 000000000..ada0578c5
--- /dev/null
+++ b/app/Makefile.in
@@ -0,0 +1,843 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = $(am__EXEEXT_1)
+noinst_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5)
+check_PROGRAMS = $(am__EXEEXT_2)
+@ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_TRUE@am__append_1 = cdi
+@ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@am__append_2 = cdi
+@ENABLE_CDI_APP_TRUE@am__append_3 = createtable
+@ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_TRUE@am__append_4 = cdi
+@ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_FALSE@am__append_5 = cdi
+@ENABLE_ALL_STATIC_TRUE@am__append_6 = -all-static
+subdir = app
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_TRUE@am__EXEEXT_1 = cdi$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)"
+@ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_TRUE@am__EXEEXT_2 = cdi$(EXEEXT)
+@ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@am__EXEEXT_3 =  \
+@ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@	cdi$(EXEEXT)
+@ENABLE_CDI_APP_TRUE@am__EXEEXT_4 = createtable$(EXEEXT)
+@ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_FALSE@am__EXEEXT_5 = cdi$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_cdi_OBJECTS = cdi.$(OBJEXT) printinfo.$(OBJEXT)
+cdi_OBJECTS = $(am_cdi_OBJECTS)
+cdi_LDADD = $(LDADD)
+cdi_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_createtable_OBJECTS = createtable.$(OBJEXT)
+createtable_OBJECTS = $(am_createtable_OBJECTS)
+createtable_LDADD = $(LDADD)
+createtable_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cdi.Po ./$(DEPDIR)/createtable.Po \
+	./$(DEPDIR)/printinfo.Po
+am__mv = mv -f
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+SOURCES = $(cdi_SOURCES) $(createtable_SOURCES)
+DIST_SOURCES = $(cdi_SOURCES) $(createtable_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = -I$(top_srcdir)/src
+AM_LDFLAGS = $(am__append_6)
+LDADD = $(top_builddir)/src/libcdi.la
+cdi_SOURCES = \
+  cdi.c \
+  printinfo.c \
+  printinfo.h
+
+createtable_SOURCES = createtable.c
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+
+# Avoid compiling twice by running Libtool with '-static'
+#   This is safe because all Libtool libraries in this directory are
+#   static-only and contain PIC objects:
+AM_CFLAGS = -static
+AM_FCFLAGS = -static
+AM_CXXFLAGS = -static
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign app/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign app/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+cdi$(EXEEXT): $(cdi_OBJECTS) $(cdi_DEPENDENCIES) $(EXTRA_cdi_DEPENDENCIES)
+	@rm -f cdi$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_OBJECTS) $(cdi_LDADD) $(LIBS)
+
+createtable$(EXEEXT): $(createtable_OBJECTS) $(createtable_DEPENDENCIES) $(EXTRA_createtable_DEPENDENCIES)
+	@rm -f createtable$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(createtable_OBJECTS) $(createtable_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/createtable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printinfo.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/cdi.Po
+	-rm -f ./$(DEPDIR)/createtable.Po
+	-rm -f ./$(DEPDIR)/printinfo.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+examples: examples-am
+
+examples-am: examples-local
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/cdi.Po
+	-rm -f ./$(DEPDIR)/createtable.Po
+	-rm -f ./$(DEPDIR)/printinfo.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool clean-local clean-noinstPROGRAMS cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am \
+	examples-am examples-local html html-am info info-am install \
+	install-am install-binPROGRAMS install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+clean-local:
+	-rm -rf *.dSYM
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/config/compile b/config/compile
new file mode 100755
index 000000000..99e50524b
--- /dev/null
+++ b/config/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config/config.guess b/config/config.guess
new file mode 100755
index 000000000..48a684601
--- /dev/null
+++ b/config/config.guess
@@ -0,0 +1,1815 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2024 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2024-07-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system '$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2024 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try '$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still
+# use 'HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039,SC3028
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+	,,)    echo "int x;" > "$dummy.c"
+	       for driver in cc gcc c17 c99 c89 ; do
+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+		       CC_FOR_BUILD=$driver
+		       break
+		   fi
+	       done
+	       if test x"$CC_FOR_BUILD" = x ; then
+		   CC_FOR_BUILD=no_compiler_found
+	       fi
+	       ;;
+	,,*)   CC_FOR_BUILD=$CC ;;
+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+	LIBC=unknown
+
+	set_cc_for_build
+	cat <<-EOF > "$dummy.c"
+	#if defined(__ANDROID__)
+	LIBC=android
+	#else
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#elif defined(__GLIBC__)
+	LIBC=gnu
+	#elif defined(__LLVM_LIBC__)
+	LIBC=llvm
+	#else
+	#include <stdarg.h>
+	/* First heuristic to detect musl libc.  */
+	#ifdef __DEFINED_va_list
+	LIBC=musl
+	#endif
+	#endif
+	#endif
+	EOF
+	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	eval "$cc_set_libc"
+
+	# Second heuristic to detect musl libc.
+	if [ "$LIBC" = unknown ] &&
+	   command -v ldd >/dev/null &&
+	   ldd --version 2>&1 | grep -q ^musl; then
+		LIBC=musl
+	fi
+
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	if [ "$LIBC" = unknown ]; then
+		LIBC=gnu
+	fi
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    echo unknown)`
+	case $UNAME_MACHINE_ARCH in
+	    aarch64eb) machine=aarch64_be-unknown ;;
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
+	    *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case $UNAME_MACHINE_ARCH in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case $UNAME_MACHINE_ARCH in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case $UNAME_VERSION in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	GUESS=$machine-${os}${release}${abi-}
+	;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+	;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+	;;
+    *:SecBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+	;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+	;;
+    *:MidnightBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+	;;
+    *:ekkoBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+	;;
+    *:SolidBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+	;;
+    *:OS108:*:*)
+	GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+	;;
+    macppc:MirBSD:*:*)
+	GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+	;;
+    *:MirBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+	;;
+    *:Sortix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-sortix
+	;;
+    *:Twizzler:*:*)
+	GUESS=$UNAME_MACHINE-unknown-twizzler
+	;;
+    *:Redox:*:*)
+	GUESS=$UNAME_MACHINE-unknown-redox
+	;;
+    mips:OSF1:*.*)
+	GUESS=mips-dec-osf1
+	;;
+    alpha:OSF1:*:*)
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	trap '' 0
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case $ALPHA_CPU_TYPE in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+	;;
+    Amiga*:UNIX_System_V:4.0:*)
+	GUESS=m68k-unknown-sysv4
+	;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	GUESS=$UNAME_MACHINE-unknown-amigaos
+	;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	GUESS=$UNAME_MACHINE-unknown-morphos
+	;;
+    *:OS/390:*:*)
+	GUESS=i370-ibm-openedition
+	;;
+    *:z/VM:*:*)
+	GUESS=s390-ibm-zvmoe
+	;;
+    *:OS400:*:*)
+	GUESS=powerpc-ibm-os400
+	;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	GUESS=arm-acorn-riscix$UNAME_RELEASE
+	;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	GUESS=arm-unknown-riscos
+	;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	GUESS=hppa1.1-hitachi-hiuxmpp
+	;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	case `(/bin/universe) 2>/dev/null` in
+	    att) GUESS=pyramid-pyramid-sysv3 ;;
+	    *)   GUESS=pyramid-pyramid-bsd   ;;
+	esac
+	;;
+    NILE*:*:*:dcosx)
+	GUESS=pyramid-pyramid-svr4
+	;;
+    DRS?6000:unix:4.0:6*)
+	GUESS=sparc-icl-nx6
+	;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) GUESS=sparc-icl-nx7 ;;
+	esac
+	;;
+    s390x:SunOS:*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+	;;
+    sun4H:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-hal-solaris2$SUN_REL
+	;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris2$SUN_REL
+	;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	GUESS=i386-pc-auroraux$UNAME_RELEASE
+	;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+	;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris3$SUN_REL
+	;;
+    sun4*:SunOS:*:*)
+	case `/usr/bin/arch -k` in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like '4.1.3-JL'.
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+	GUESS=sparc-sun-sunos$SUN_REL
+	;;
+    sun3*:SunOS:*:*)
+	GUESS=m68k-sun-sunos$UNAME_RELEASE
+	;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+	case `/bin/arch` in
+	    sun3)
+		GUESS=m68k-sun-sunos$UNAME_RELEASE
+		;;
+	    sun4)
+		GUESS=sparc-sun-sunos$UNAME_RELEASE
+		;;
+	esac
+	;;
+    aushp:SunOS:*:*)
+	GUESS=sparc-auspex-sunos$UNAME_RELEASE
+	;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	GUESS=m68k-milan-mint$UNAME_RELEASE
+	;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	GUESS=m68k-hades-mint$UNAME_RELEASE
+	;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	GUESS=m68k-unknown-mint$UNAME_RELEASE
+	;;
+    m68k:machten:*:*)
+	GUESS=m68k-apple-machten$UNAME_RELEASE
+	;;
+    powerpc:machten:*:*)
+	GUESS=powerpc-apple-machten$UNAME_RELEASE
+	;;
+    RISC*:Mach:*:*)
+	GUESS=mips-dec-mach_bsd4.3
+	;;
+    RISC*:ULTRIX:*:*)
+	GUESS=mips-dec-ultrix$UNAME_RELEASE
+	;;
+    VAX*:ULTRIX*:*:*)
+	GUESS=vax-dec-ultrix$UNAME_RELEASE
+	;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	GUESS=clipper-intergraph-clix$UNAME_RELEASE
+	;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	GUESS=mips-mips-riscos$UNAME_RELEASE
+	;;
+    Motorola:PowerMAX_OS:*:*)
+	GUESS=powerpc-motorola-powermax
+	;;
+    Motorola:*:4.3:PL8-*)
+	GUESS=powerpc-harris-powermax
+	;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	GUESS=powerpc-harris-powermax
+	;;
+    Night_Hawk:Power_UNIX:*:*)
+	GUESS=powerpc-harris-powerunix
+	;;
+    m88k:CX/UX:7*:*)
+	GUESS=m88k-harris-cxux7
+	;;
+    m88k:*:4*:R4*)
+	GUESS=m88k-motorola-sysv4
+	;;
+    m88k:*:3*:R3*)
+	GUESS=m88k-motorola-sysv3
+	;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+	then
+	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+	       test "$TARGET_BINARY_INTERFACE"x = x
+	    then
+		GUESS=m88k-dg-dgux$UNAME_RELEASE
+	    else
+		GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+	    fi
+	else
+	    GUESS=i586-dg-dgux$UNAME_RELEASE
+	fi
+	;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	GUESS=m88k-dolphin-sysv3
+	;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	GUESS=m88k-motorola-sysv3
+	;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	GUESS=m88k-tektronix-sysv3
+	;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	GUESS=m68k-tektronix-bsd
+	;;
+    *:IRIX*:*:*)
+	IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+	GUESS=mips-sgi-irix$IRIX_REL
+	;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	GUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id
+	;;                    # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	GUESS=i386-ibm-aix
+	;;
+    ia64:AIX:*:*)
+	if test -x /usr/bin/oslevel ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+	fi
+	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+	;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		set_cc_for_build
+		sed 's/^		//' << EOF > "$dummy.c"
+		#include <sys/systemcfg.h>
+
+		int
+		main ()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+		then
+			GUESS=$SYSTEM_NAME
+		else
+			GUESS=rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		GUESS=rs6000-ibm-aix3.2.4
+	else
+		GUESS=rs6000-ibm-aix3.2
+	fi
+	;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if test -x /usr/bin/lslpp ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+	fi
+	GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+	;;
+    *:AIX:*:*)
+	GUESS=rs6000-ibm-aix
+	;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	GUESS=romp-ibm-bsd4.4
+	;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	GUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to
+	;;                                  # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	GUESS=rs6000-bull-bosx
+	;;
+    DPX/2?00:B.O.S.:*:*)
+	GUESS=m68k-bull-sysv3
+	;;
+    9000/[34]??:4.3bsd:1.*:*)
+	GUESS=m68k-hp-bsd
+	;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	GUESS=m68k-hp-bsd4.4
+	;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	case $UNAME_MACHINE in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if test -x /usr/bin/getconf; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case $sc_cpu_version in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case $sc_kernel_bits in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if test "$HP_ARCH" = ""; then
+		    set_cc_for_build
+		    sed 's/^		//' << EOF > "$dummy.c"
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int
+		main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if test "$HP_ARCH" = hppa2.0w
+	then
+	    set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+	;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	GUESS=ia64-hp-hpux$HPUX_REV
+	;;
+    3050*:HI-UX:*:*)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	GUESS=unknown-hitachi-hiuxwe2
+	;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	GUESS=hppa1.1-hp-bsd
+	;;
+    9000/8??:4.3bsd:*:*)
+	GUESS=hppa1.0-hp-bsd
+	;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	GUESS=hppa1.0-hp-mpeix
+	;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	GUESS=hppa1.1-hp-osf
+	;;
+    hp8??:OSF1:*:*)
+	GUESS=hppa1.0-hp-osf
+	;;
+    i*86:OSF1:*:*)
+	if test -x /usr/sbin/sysversion ; then
+	    GUESS=$UNAME_MACHINE-unknown-osf1mk
+	else
+	    GUESS=$UNAME_MACHINE-unknown-osf1
+	fi
+	;;
+    parisc*:Lites*:*:*)
+	GUESS=hppa1.1-hp-lites
+	;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	GUESS=c1-convex-bsd
+	;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	GUESS=c34-convex-bsd
+	;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	GUESS=c38-convex-bsd
+	;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	GUESS=c4-convex-bsd
+	;;
+    CRAY*Y-MP:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=ymp-cray-unicos$CRAY_REL
+	;;
+    CRAY*[A-Z]90:*:*:*)
+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=t90-cray-unicos$CRAY_REL
+	;;
+    CRAY*T3E:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=alphaev5-cray-unicosmk$CRAY_REL
+	;;
+    CRAY*SV1:*:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=sv1-cray-unicos$CRAY_REL
+	;;
+    *:UNICOS/mp:*:*)
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=craynv-cray-unicosmp$CRAY_REL
+	;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+	GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+	;;
+    sparc*:BSD/OS:*:*)
+	GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+	;;
+    *:BSD/OS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+	;;
+    arm:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	set_cc_for_build
+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_PCS_VFP
+	then
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+	else
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+	fi
+	;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	case $UNAME_PROCESSOR in
+	    amd64)
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
+	esac
+	FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+	;;
+    i*:CYGWIN*:*)
+	GUESS=$UNAME_MACHINE-pc-cygwin
+	;;
+    *:MINGW64*:*)
+	GUESS=$UNAME_MACHINE-pc-mingw64
+	;;
+    *:MINGW*:*)
+	GUESS=$UNAME_MACHINE-pc-mingw32
+	;;
+    *:MSYS*:*)
+	GUESS=$UNAME_MACHINE-pc-msys
+	;;
+    i*:PW*:*)
+	GUESS=$UNAME_MACHINE-pc-pw32
+	;;
+    *:SerenityOS:*:*)
+        GUESS=$UNAME_MACHINE-pc-serenity
+        ;;
+    *:Interix*:*)
+	case $UNAME_MACHINE in
+	    x86)
+		GUESS=i586-pc-interix$UNAME_RELEASE
+		;;
+	    authenticamd | genuineintel | EM64T)
+		GUESS=x86_64-unknown-interix$UNAME_RELEASE
+		;;
+	    IA64)
+		GUESS=ia64-unknown-interix$UNAME_RELEASE
+		;;
+	esac ;;
+    i*:UWIN*:*)
+	GUESS=$UNAME_MACHINE-pc-uwin
+	;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	GUESS=x86_64-pc-cygwin
+	;;
+    prep*:SunOS:5.*:*)
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=powerpcle-unknown-solaris2$SUN_REL
+	;;
+    *:GNU:*:*)
+	# the GNU system
+	GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+	GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+	;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+	;;
+    x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)
+	GUESS="$UNAME_MACHINE-pc-managarm-mlibc"
+	;;
+    *:[Mm]anagarm:*:*)
+	GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"
+	;;
+    *:Minix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-minix
+	;;
+    aarch64:Linux:*:*)
+	set_cc_for_build
+	CPU=$UNAME_MACHINE
+	LIBCABI=$LIBC
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    ABI=64
+	    sed 's/^	    //' << EOF > "$dummy.c"
+	    #ifdef __ARM_EABI__
+	    #ifdef __ARM_PCS_VFP
+	    ABI=eabihf
+	    #else
+	    ABI=eabi
+	    #endif
+	    #endif
+EOF
+	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+	    eval "$cc_set_abi"
+	    case $ABI in
+		eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;;
+	    esac
+	fi
+	GUESS=$CPU-unknown-linux-$LIBCABI
+	;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arm*:Linux:*:*)
+	set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+	    else
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+	    fi
+	fi
+	;;
+    avr32*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    cris:Linux:*:*)
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
+    crisv32:Linux:*:*)
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
+    e2k:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    frv:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    hexagon:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    i*86:Linux:*:*)
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+	;;
+    ia64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    k1om:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    kvx:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    kvx:cos:*:*)
+	GUESS=$UNAME_MACHINE-unknown-cos
+	;;
+    kvx:mbr:*:*)
+	GUESS=$UNAME_MACHINE-unknown-mbr
+	;;
+    loongarch32:Linux:*:* | loongarch64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    m32r*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    m68*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	set_cc_for_build
+	IS_GLIBC=0
+	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	sed 's/^	//' << EOF > "$dummy.c"
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#undef mips64
+	#undef mips64el
+	#if ${IS_GLIBC} && defined(_ABI64)
+	LIBCABI=gnuabi64
+	#else
+	#if ${IS_GLIBC} && defined(_ABIN32)
+	LIBCABI=gnuabin32
+	#else
+	LIBCABI=${LIBC}
+	#endif
+	#endif
+
+	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa64r6
+	#else
+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa32r6
+	#else
+	#if defined(__mips64)
+	CPU=mips64
+	#else
+	CPU=mips
+	#endif
+	#endif
+	#endif
+
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	MIPS_ENDIAN=el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	MIPS_ENDIAN=
+	#else
+	MIPS_ENDIAN=
+	#endif
+	#endif
+EOF
+	cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+	eval "$cc_set_vars"
+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    openrisc*:Linux:*:*)
+	GUESS=or1k-unknown-linux-$LIBC
+	;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    padre:Linux:*:*)
+	GUESS=sparc-unknown-linux-$LIBC
+	;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	GUESS=hppa64-unknown-linux-$LIBC
+	;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+	  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+	  *)    GUESS=hppa-unknown-linux-$LIBC ;;
+	esac
+	;;
+    ppc64:Linux:*:*)
+	GUESS=powerpc64-unknown-linux-$LIBC
+	;;
+    ppc:Linux:*:*)
+	GUESS=powerpc-unknown-linux-$LIBC
+	;;
+    ppc64le:Linux:*:*)
+	GUESS=powerpc64le-unknown-linux-$LIBC
+	;;
+    ppcle:Linux:*:*)
+	GUESS=powerpcle-unknown-linux-$LIBC
+	;;
+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+	;;
+    sh64*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    sh*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    tile*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    vax:Linux:*:*)
+	GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+	;;
+    x86_64:Linux:*:*)
+	set_cc_for_build
+	CPU=$UNAME_MACHINE
+	LIBCABI=$LIBC
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    ABI=64
+	    sed 's/^	    //' << EOF > "$dummy.c"
+	    #ifdef __i386__
+	    ABI=x86
+	    #else
+	    #ifdef __ILP32__
+	    ABI=x32
+	    #endif
+	    #endif
+EOF
+	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`
+	    eval "$cc_set_abi"
+	    case $ABI in
+		x86) CPU=i686 ;;
+		x32) LIBCABI=${LIBC}x32 ;;
+	    esac
+	fi
+	GUESS=$CPU-pc-linux-$LIBCABI
+	;;
+    xtensa*:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	GUESS=i386-sequent-sysv4
+	;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+	;;
+    i*86:OS/2:*:*)
+	# If we were able to find 'uname', then EMX Unix compatibility
+	# is probably installed.
+	GUESS=$UNAME_MACHINE-pc-os2-emx
+	;;
+    i*86:XTS-300:*:STOP)
+	GUESS=$UNAME_MACHINE-unknown-stop
+	;;
+    i*86:atheos:*:*)
+	GUESS=$UNAME_MACHINE-unknown-atheos
+	;;
+    i*86:syllable:*:*)
+	GUESS=$UNAME_MACHINE-pc-syllable
+	;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	GUESS=i386-unknown-lynxos$UNAME_RELEASE
+	;;
+    i*86:*DOS:*:*)
+	GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+	;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+	else
+		GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+	fi
+	;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+	else
+		GUESS=$UNAME_MACHINE-pc-sysv32
+	fi
+	;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	GUESS=i586-pc-msdosdjgpp
+	;;
+    Intel:Mach:3*:*)
+	GUESS=i386-pc-mach3
+	;;
+    paragon:*:*:*)
+	GUESS=i860-intel-osf1
+	;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4
+	fi
+	;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	GUESS=m68010-convergent-sysv
+	;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	GUESS=m68k-convergent-sysv
+	;;
+    M680?0:D-NIX:5.3:*)
+	GUESS=m68k-diab-dnix
+	;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+	;;
+    mc68030:UNIX_System_V:4.*:*)
+	GUESS=m68k-atari-sysv4
+	;;
+    TSUNAMI:LynxOS:2.*:*)
+	GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+	;;
+    rs6000:LynxOS:2.*:*)
+	GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+	;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+	;;
+    SM[BE]S:UNIX_SV:*:*)
+	GUESS=mips-dde-sysv$UNAME_RELEASE
+	;;
+    RM*:ReliantUNIX-*:*:*)
+	GUESS=mips-sni-sysv4
+	;;
+    RM*:SINIX-*:*:*)
+	GUESS=mips-sni-sysv4
+	;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		GUESS=$UNAME_MACHINE-sni-sysv4
+	else
+		GUESS=ns32k-sni-sysv
+	fi
+	;;
+    PENTIUM:*:4.0*:*)	# Unisys 'ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	GUESS=i586-unisys-sysv4
+	;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	GUESS=hppa1.1-stratus-sysv4
+	;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	GUESS=i860-stratus-sysv4
+	;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	GUESS=$UNAME_MACHINE-stratus-vos
+	;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	GUESS=hppa1.1-stratus-vos
+	;;
+    mc68*:A/UX:*:*)
+	GUESS=m68k-apple-aux$UNAME_RELEASE
+	;;
+    news*:NEWS-OS:6*:*)
+	GUESS=mips-sony-newsos6
+	;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if test -d /usr/nec; then
+		GUESS=mips-nec-sysv$UNAME_RELEASE
+	else
+		GUESS=mips-unknown-sysv$UNAME_RELEASE
+	fi
+	;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	GUESS=powerpc-be-beos
+	;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	GUESS=powerpc-apple-beos
+	;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	GUESS=i586-pc-beos
+	;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	GUESS=i586-pc-haiku
+	;;
+    ppc:Haiku:*:*)	# Haiku running on Apple PowerPC
+	GUESS=powerpc-apple-haiku
+	;;
+    *:Haiku:*:*)	# Haiku modern gcc (not bound by BeOS compat)
+	GUESS=$UNAME_MACHINE-unknown-haiku
+	;;
+    SX-4:SUPER-UX:*:*)
+	GUESS=sx4-nec-superux$UNAME_RELEASE
+	;;
+    SX-5:SUPER-UX:*:*)
+	GUESS=sx5-nec-superux$UNAME_RELEASE
+	;;
+    SX-6:SUPER-UX:*:*)
+	GUESS=sx6-nec-superux$UNAME_RELEASE
+	;;
+    SX-7:SUPER-UX:*:*)
+	GUESS=sx7-nec-superux$UNAME_RELEASE
+	;;
+    SX-8:SUPER-UX:*:*)
+	GUESS=sx8-nec-superux$UNAME_RELEASE
+	;;
+    SX-8R:SUPER-UX:*:*)
+	GUESS=sx8r-nec-superux$UNAME_RELEASE
+	;;
+    SX-ACE:SUPER-UX:*:*)
+	GUESS=sxace-nec-superux$UNAME_RELEASE
+	;;
+    Power*:Rhapsody:*:*)
+	GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+	;;
+    *:Rhapsody:*:*)
+	GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+	;;
+    arm64:Darwin:*:*)
+	GUESS=aarch64-apple-darwin$UNAME_RELEASE
+	;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	if command -v xcode-select > /dev/null 2> /dev/null && \
+		! xcode-select --print-path > /dev/null 2> /dev/null ; then
+	    # Avoid executing cc if there is no toolchain installed as
+	    # cc will be a stub that puts up a graphical alert
+	    # prompting the user to install developer tools.
+	    CC_FOR_BUILD=no_compiler_found
+	else
+	    set_cc_for_build
+	fi
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_64BIT_ARCH >/dev/null
+	    then
+		case $UNAME_PROCESSOR in
+		    i386) UNAME_PROCESSOR=x86_64 ;;
+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		esac
+	    fi
+	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_PPC >/dev/null
+	    then
+		UNAME_PROCESSOR=powerpc
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # uname -m returns i386 or x86_64
+	    UNAME_PROCESSOR=$UNAME_MACHINE
+	fi
+	GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+	;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+	;;
+    *:QNX:*:4*)
+	GUESS=i386-pc-qnx
+	;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	GUESS=neo-tandem-nsk$UNAME_RELEASE
+	;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	GUESS=nse-tandem-nsk$UNAME_RELEASE
+	;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsr-tandem-nsk$UNAME_RELEASE
+	;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsv-tandem-nsk$UNAME_RELEASE
+	;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsx-tandem-nsk$UNAME_RELEASE
+	;;
+    *:NonStop-UX:*:*)
+	GUESS=mips-compaq-nonstopux
+	;;
+    BS2000:POSIX*:*:*)
+	GUESS=bs2000-siemens-sysv
+	;;
+    DS/*:UNIX_System_V:*:*)
+	GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+	;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "${cputype-}" = 386; then
+	    UNAME_MACHINE=i386
+	elif test "x${cputype-}" != x; then
+	    UNAME_MACHINE=$cputype
+	fi
+	GUESS=$UNAME_MACHINE-unknown-plan9
+	;;
+    *:TOPS-10:*:*)
+	GUESS=pdp10-unknown-tops10
+	;;
+    *:TENEX:*:*)
+	GUESS=pdp10-unknown-tenex
+	;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	GUESS=pdp10-dec-tops20
+	;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	GUESS=pdp10-xkl-tops20
+	;;
+    *:TOPS-20:*:*)
+	GUESS=pdp10-unknown-tops20
+	;;
+    *:ITS:*:*)
+	GUESS=pdp10-unknown-its
+	;;
+    SEI:*:*:SEIUX)
+	GUESS=mips-sei-seiux$UNAME_RELEASE
+	;;
+    *:DragonFly:*:*)
+	DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+	;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case $UNAME_MACHINE in
+	    A*) GUESS=alpha-dec-vms ;;
+	    I*) GUESS=ia64-dec-vms ;;
+	    V*) GUESS=vax-dec-vms ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	GUESS=i386-pc-xenix
+	;;
+    i*86:skyos:*:*)
+	SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+	GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+	;;
+    i*86:rdos:*:*)
+	GUESS=$UNAME_MACHINE-pc-rdos
+	;;
+    i*86:Fiwix:*:*)
+	GUESS=$UNAME_MACHINE-pc-fiwix
+	;;
+    *:AROS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-aros
+	;;
+    x86_64:VMkernel:*:*)
+	GUESS=$UNAME_MACHINE-unknown-esx
+	;;
+    amd64:Isilon\ OneFS:*:*)
+	GUESS=x86_64-unknown-onefs
+	;;
+    *:Unleashed:*:*)
+	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+	;;
+    *:Ironclad:*:*)
+	GUESS=$UNAME_MACHINE-unknown-ironclad
+	;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+    echo "$GUESS"
+    exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+int
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname un;
+  uname (&un);
+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname *un;
+  uname (&un);
+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+   cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config/config.sub b/config/config.sub
new file mode 100755
index 000000000..4aaae46f6
--- /dev/null
+++ b/config/config.sub
@@ -0,0 +1,2354 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2024 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale
+
+timestamp='2024-05-27'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2024 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try '$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+	*-*-*-*-*)
+		echo "Invalid configuration '$1': more than four components" >&2
+		exit 1
+		;;
+	*-*-*-*)
+		basic_machine=$field1-$field2
+		basic_os=$field3-$field4
+		;;
+	*-*-*)
+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+		# parts
+		maybe_os=$field2-$field3
+		case $maybe_os in
+			  cloudabi*-eabi* \
+			| kfreebsd*-gnu* \
+			| knetbsd*-gnu* \
+			| kopensolaris*-gnu* \
+			| linux-* \
+			| managarm-* \
+			| netbsd*-eabi* \
+			| netbsd*-gnu* \
+			| nto-qnx* \
+			| os2-emx* \
+			| rtmk-nova* \
+			| storm-chaos* \
+			| uclinux-gnu* \
+			| uclinux-uclibc* \
+			| windows-* )
+				basic_machine=$field1
+				basic_os=$maybe_os
+				;;
+			android-linux)
+				basic_machine=$field1-unknown
+				basic_os=linux-android
+				;;
+			*)
+				basic_machine=$field1-$field2
+				basic_os=$field3
+				;;
+		esac
+		;;
+	*-*)
+		case $field1-$field2 in
+			# Shorthands that happen to contain a single dash
+			convex-c[12] | convex-c3[248])
+				basic_machine=$field2-convex
+				basic_os=
+				;;
+			decstation-3100)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			*-*)
+				# Second component is usually, but not always the OS
+				case $field2 in
+					# Do not treat sunos as a manufacturer
+					sun*os*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+					# Manufacturers
+					  3100* \
+					| 32* \
+					| 3300* \
+					| 3600* \
+					| 7300* \
+					| acorn \
+					| altos* \
+					| apollo \
+					| apple \
+					| atari \
+					| att* \
+					| axis \
+					| be \
+					| bull \
+					| cbm \
+					| ccur \
+					| cisco \
+					| commodore \
+					| convergent* \
+					| convex* \
+					| cray \
+					| crds \
+					| dec* \
+					| delta* \
+					| dg \
+					| digital \
+					| dolphin \
+					| encore* \
+					| gould \
+					| harris \
+					| highlevel \
+					| hitachi* \
+					| hp \
+					| ibm* \
+					| intergraph \
+					| isi* \
+					| knuth \
+					| masscomp \
+					| microblaze* \
+					| mips* \
+					| motorola* \
+					| ncr* \
+					| news \
+					| next \
+					| ns \
+					| oki \
+					| omron* \
+					| pc533* \
+					| rebel \
+					| rom68k \
+					| rombug \
+					| semi \
+					| sequent* \
+					| siemens \
+					| sgi* \
+					| siemens \
+					| sim \
+					| sni \
+					| sony* \
+					| stratus \
+					| sun \
+					| sun[234]* \
+					| tektronix \
+					| tti* \
+					| ultra \
+					| unicom* \
+					| wec \
+					| winbond \
+					| wrs)
+						basic_machine=$field1-$field2
+						basic_os=
+						;;
+					zephyr*)
+						basic_machine=$field1-unknown
+						basic_os=$field2
+						;;
+					*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+				esac
+			;;
+		esac
+		;;
+	*)
+		# Convert single-component short-hands not valid as part of
+		# multi-component configurations.
+		case $field1 in
+			386bsd)
+				basic_machine=i386-pc
+				basic_os=bsd
+				;;
+			a29khif)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			adobe68k)
+				basic_machine=m68010-adobe
+				basic_os=scout
+				;;
+			alliant)
+				basic_machine=fx80-alliant
+				basic_os=
+				;;
+			altos | altos3068)
+				basic_machine=m68k-altos
+				basic_os=
+				;;
+			am29k)
+				basic_machine=a29k-none
+				basic_os=bsd
+				;;
+			amdahl)
+				basic_machine=580-amdahl
+				basic_os=sysv
+				;;
+			amiga)
+				basic_machine=m68k-unknown
+				basic_os=
+				;;
+			amigaos | amigados)
+				basic_machine=m68k-unknown
+				basic_os=amigaos
+				;;
+			amigaunix | amix)
+				basic_machine=m68k-unknown
+				basic_os=sysv4
+				;;
+			apollo68)
+				basic_machine=m68k-apollo
+				basic_os=sysv
+				;;
+			apollo68bsd)
+				basic_machine=m68k-apollo
+				basic_os=bsd
+				;;
+			aros)
+				basic_machine=i386-pc
+				basic_os=aros
+				;;
+			aux)
+				basic_machine=m68k-apple
+				basic_os=aux
+				;;
+			balance)
+				basic_machine=ns32k-sequent
+				basic_os=dynix
+				;;
+			blackfin)
+				basic_machine=bfin-unknown
+				basic_os=linux
+				;;
+			cegcc)
+				basic_machine=arm-unknown
+				basic_os=cegcc
+				;;
+			cray)
+				basic_machine=j90-cray
+				basic_os=unicos
+				;;
+			crds | unos)
+				basic_machine=m68k-crds
+				basic_os=
+				;;
+			da30)
+				basic_machine=m68k-da30
+				basic_os=
+				;;
+			decstation | pmax | pmin | dec3100 | decstatn)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			delta88)
+				basic_machine=m88k-motorola
+				basic_os=sysv3
+				;;
+			dicos)
+				basic_machine=i686-pc
+				basic_os=dicos
+				;;
+			djgpp)
+				basic_machine=i586-pc
+				basic_os=msdosdjgpp
+				;;
+			ebmon29k)
+				basic_machine=a29k-amd
+				basic_os=ebmon
+				;;
+			es1800 | OSE68k | ose68k | ose | OSE)
+				basic_machine=m68k-ericsson
+				basic_os=ose
+				;;
+			gmicro)
+				basic_machine=tron-gmicro
+				basic_os=sysv
+				;;
+			go32)
+				basic_machine=i386-pc
+				basic_os=go32
+				;;
+			h8300hms)
+				basic_machine=h8300-hitachi
+				basic_os=hms
+				;;
+			h8300xray)
+				basic_machine=h8300-hitachi
+				basic_os=xray
+				;;
+			h8500hms)
+				basic_machine=h8500-hitachi
+				basic_os=hms
+				;;
+			harris)
+				basic_machine=m88k-harris
+				basic_os=sysv3
+				;;
+			hp300 | hp300hpux)
+				basic_machine=m68k-hp
+				basic_os=hpux
+				;;
+			hp300bsd)
+				basic_machine=m68k-hp
+				basic_os=bsd
+				;;
+			hppaosf)
+				basic_machine=hppa1.1-hp
+				basic_os=osf
+				;;
+			hppro)
+				basic_machine=hppa1.1-hp
+				basic_os=proelf
+				;;
+			i386mach)
+				basic_machine=i386-mach
+				basic_os=mach
+				;;
+			isi68 | isi)
+				basic_machine=m68k-isi
+				basic_os=sysv
+				;;
+			m68knommu)
+				basic_machine=m68k-unknown
+				basic_os=linux
+				;;
+			magnum | m3230)
+				basic_machine=mips-mips
+				basic_os=sysv
+				;;
+			merlin)
+				basic_machine=ns32k-utek
+				basic_os=sysv
+				;;
+			mingw64)
+				basic_machine=x86_64-pc
+				basic_os=mingw64
+				;;
+			mingw32)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			mingw32ce)
+				basic_machine=arm-unknown
+				basic_os=mingw32ce
+				;;
+			monitor)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			morphos)
+				basic_machine=powerpc-unknown
+				basic_os=morphos
+				;;
+			moxiebox)
+				basic_machine=moxie-unknown
+				basic_os=moxiebox
+				;;
+			msdos)
+				basic_machine=i386-pc
+				basic_os=msdos
+				;;
+			msys)
+				basic_machine=i686-pc
+				basic_os=msys
+				;;
+			mvs)
+				basic_machine=i370-ibm
+				basic_os=mvs
+				;;
+			nacl)
+				basic_machine=le32-unknown
+				basic_os=nacl
+				;;
+			ncr3000)
+				basic_machine=i486-ncr
+				basic_os=sysv4
+				;;
+			netbsd386)
+				basic_machine=i386-pc
+				basic_os=netbsd
+				;;
+			netwinder)
+				basic_machine=armv4l-rebel
+				basic_os=linux
+				;;
+			news | news700 | news800 | news900)
+				basic_machine=m68k-sony
+				basic_os=newsos
+				;;
+			news1000)
+				basic_machine=m68030-sony
+				basic_os=newsos
+				;;
+			necv70)
+				basic_machine=v70-nec
+				basic_os=sysv
+				;;
+			nh3000)
+				basic_machine=m68k-harris
+				basic_os=cxux
+				;;
+			nh[45]000)
+				basic_machine=m88k-harris
+				basic_os=cxux
+				;;
+			nindy960)
+				basic_machine=i960-intel
+				basic_os=nindy
+				;;
+			mon960)
+				basic_machine=i960-intel
+				basic_os=mon960
+				;;
+			nonstopux)
+				basic_machine=mips-compaq
+				basic_os=nonstopux
+				;;
+			os400)
+				basic_machine=powerpc-ibm
+				basic_os=os400
+				;;
+			OSE68000 | ose68000)
+				basic_machine=m68000-ericsson
+				basic_os=ose
+				;;
+			os68k)
+				basic_machine=m68k-none
+				basic_os=os68k
+				;;
+			paragon)
+				basic_machine=i860-intel
+				basic_os=osf
+				;;
+			parisc)
+				basic_machine=hppa-unknown
+				basic_os=linux
+				;;
+			psp)
+				basic_machine=mipsallegrexel-sony
+				basic_os=psp
+				;;
+			pw32)
+				basic_machine=i586-unknown
+				basic_os=pw32
+				;;
+			rdos | rdos64)
+				basic_machine=x86_64-pc
+				basic_os=rdos
+				;;
+			rdos32)
+				basic_machine=i386-pc
+				basic_os=rdos
+				;;
+			rom68k)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			sa29200)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			sei)
+				basic_machine=mips-sei
+				basic_os=seiux
+				;;
+			sequent)
+				basic_machine=i386-sequent
+				basic_os=
+				;;
+			sps7)
+				basic_machine=m68k-bull
+				basic_os=sysv2
+				;;
+			st2000)
+				basic_machine=m68k-tandem
+				basic_os=
+				;;
+			stratus)
+				basic_machine=i860-stratus
+				basic_os=sysv4
+				;;
+			sun2)
+				basic_machine=m68000-sun
+				basic_os=
+				;;
+			sun2os3)
+				basic_machine=m68000-sun
+				basic_os=sunos3
+				;;
+			sun2os4)
+				basic_machine=m68000-sun
+				basic_os=sunos4
+				;;
+			sun3)
+				basic_machine=m68k-sun
+				basic_os=
+				;;
+			sun3os3)
+				basic_machine=m68k-sun
+				basic_os=sunos3
+				;;
+			sun3os4)
+				basic_machine=m68k-sun
+				basic_os=sunos4
+				;;
+			sun4)
+				basic_machine=sparc-sun
+				basic_os=
+				;;
+			sun4os3)
+				basic_machine=sparc-sun
+				basic_os=sunos3
+				;;
+			sun4os4)
+				basic_machine=sparc-sun
+				basic_os=sunos4
+				;;
+			sun4sol2)
+				basic_machine=sparc-sun
+				basic_os=solaris2
+				;;
+			sun386 | sun386i | roadrunner)
+				basic_machine=i386-sun
+				basic_os=
+				;;
+			sv1)
+				basic_machine=sv1-cray
+				basic_os=unicos
+				;;
+			symmetry)
+				basic_machine=i386-sequent
+				basic_os=dynix
+				;;
+			t3e)
+				basic_machine=alphaev5-cray
+				basic_os=unicos
+				;;
+			t90)
+				basic_machine=t90-cray
+				basic_os=unicos
+				;;
+			toad1)
+				basic_machine=pdp10-xkl
+				basic_os=tops20
+				;;
+			tpf)
+				basic_machine=s390x-ibm
+				basic_os=tpf
+				;;
+			udi29k)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			ultra3)
+				basic_machine=a29k-nyu
+				basic_os=sym1
+				;;
+			v810 | necv810)
+				basic_machine=v810-nec
+				basic_os=none
+				;;
+			vaxv)
+				basic_machine=vax-dec
+				basic_os=sysv
+				;;
+			vms)
+				basic_machine=vax-dec
+				basic_os=vms
+				;;
+			vsta)
+				basic_machine=i386-pc
+				basic_os=vsta
+				;;
+			vxworks960)
+				basic_machine=i960-wrs
+				basic_os=vxworks
+				;;
+			vxworks68)
+				basic_machine=m68k-wrs
+				basic_os=vxworks
+				;;
+			vxworks29k)
+				basic_machine=a29k-wrs
+				basic_os=vxworks
+				;;
+			xbox)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			ymp)
+				basic_machine=ymp-cray
+				basic_os=unicos
+				;;
+			*)
+				basic_machine=$1
+				basic_os=
+				;;
+		esac
+		;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+	# Here we handle the default manufacturer of certain CPU types.  It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		cpu=hppa1.1
+		vendor=winbond
+		;;
+	op50n)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	op60c)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	ibm*)
+		cpu=i370
+		vendor=ibm
+		;;
+	orion105)
+		cpu=clipper
+		vendor=highlevel
+		;;
+	mac | mpw | mac-mpw)
+		cpu=m68k
+		vendor=apple
+		;;
+	pmac | pmac-mpw)
+		cpu=powerpc
+		vendor=apple
+		;;
+
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		cpu=m68000
+		vendor=att
+		;;
+	3b*)
+		cpu=we32k
+		vendor=att
+		;;
+	bluegene*)
+		cpu=powerpc
+		vendor=ibm
+		basic_os=cnk
+		;;
+	decsystem10* | dec10*)
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops10
+		;;
+	decsystem20* | dec20*)
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops20
+		;;
+	delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300)
+		cpu=m68k
+		vendor=motorola
+		;;
+	# This used to be dpx2*, but that gets the RS6000-based
+	# DPX/20 and the x86-based DPX/2-100 wrong.  See
+	# https://oldskool.silicium.org/stations/bull_dpx20.htm
+	# https://www.feb-patrimoine.com/english/bull_dpx2.htm
+	# https://www.feb-patrimoine.com/english/unix_and_bull.htm
+	dpx2 | dpx2[23]00 | dpx2[23]xx)
+		cpu=m68k
+		vendor=bull
+		;;
+	dpx2100 | dpx21xx)
+		cpu=i386
+		vendor=bull
+		;;
+	dpx20)
+		cpu=rs6000
+		vendor=bull
+		;;
+	encore | umax | mmax)
+		cpu=ns32k
+		vendor=encore
+		;;
+	elxsi)
+		cpu=elxsi
+		vendor=elxsi
+		basic_os=${basic_os:-bsd}
+		;;
+	fx2800)
+		cpu=i860
+		vendor=alliant
+		;;
+	genix)
+		cpu=ns32k
+		vendor=ns
+		;;
+	h3050r* | hiux*)
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		cpu=m68000
+		vendor=hp
+		;;
+	hp9k3[2-9][0-9])
+		cpu=m68k
+		vendor=hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	i*86v32)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv32
+		;;
+	i*86v4*)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv4
+		;;
+	i*86v)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv
+		;;
+	i*86sol2)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=solaris2
+		;;
+	j90 | j90-cray)
+		cpu=j90
+		vendor=cray
+		basic_os=${basic_os:-unicos}
+		;;
+	iris | iris4d)
+		cpu=mips
+		vendor=sgi
+		case $basic_os in
+		    irix*)
+			;;
+		    *)
+			basic_os=irix4
+			;;
+		esac
+		;;
+	miniframe)
+		cpu=m68000
+		vendor=convergent
+		;;
+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		cpu=m68k
+		vendor=atari
+		basic_os=mint
+		;;
+	news-3600 | risc-news)
+		cpu=mips
+		vendor=sony
+		basic_os=newsos
+		;;
+	next | m*-next)
+		cpu=m68k
+		vendor=next
+		;;
+	np1)
+		cpu=np1
+		vendor=gould
+		;;
+	op50n-* | op60c-*)
+		cpu=hppa1.1
+		vendor=oki
+		basic_os=proelf
+		;;
+	pa-hitachi)
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
+		;;
+	pbd)
+		cpu=sparc
+		vendor=tti
+		;;
+	pbb)
+		cpu=m68k
+		vendor=tti
+		;;
+	pc532)
+		cpu=ns32k
+		vendor=pc532
+		;;
+	pn)
+		cpu=pn
+		vendor=gould
+		;;
+	power)
+		cpu=power
+		vendor=ibm
+		;;
+	ps2)
+		cpu=i386
+		vendor=ibm
+		;;
+	rm[46]00)
+		cpu=mips
+		vendor=siemens
+		;;
+	rtpc | rtpc-*)
+		cpu=romp
+		vendor=ibm
+		;;
+	sde)
+		cpu=mipsisa32
+		vendor=sde
+		basic_os=${basic_os:-elf}
+		;;
+	simso-wrs)
+		cpu=sparclite
+		vendor=wrs
+		basic_os=vxworks
+		;;
+	tower | tower-32)
+		cpu=m68k
+		vendor=ncr
+		;;
+	vpp*|vx|vx-*)
+		cpu=f301
+		vendor=fujitsu
+		;;
+	w65)
+		cpu=w65
+		vendor=wdc
+		;;
+	w89k-*)
+		cpu=hppa1.1
+		vendor=winbond
+		basic_os=proelf
+		;;
+	none)
+		cpu=none
+		vendor=none
+		;;
+	leon|leon[3-9])
+		cpu=sparc
+		vendor=$basic_machine
+		;;
+	leon-*|leon[3-9]-*)
+		cpu=sparc
+		vendor=`echo "$basic_machine" | sed 's/-.*//'`
+		;;
+
+	*-*)
+		saved_IFS=$IFS
+		IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+		IFS=$saved_IFS
+		;;
+	# We use 'pc' rather than 'unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+		cpu=$basic_machine
+		vendor=pc
+		;;
+	# These rules are duplicated from below for sake of the special case above;
+	# i.e. things that normalized to x86 arches should also default to "pc"
+	pc98)
+		cpu=i386
+		vendor=pc
+		;;
+	x64 | amd64)
+		cpu=x86_64
+		vendor=pc
+		;;
+	# Recognize the basic CPU types without company name.
+	*)
+		cpu=$basic_machine
+		vendor=unknown
+		;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+	# Here we handle the default manufacturer of certain CPU types in canonical form.
+	# It is in some cases the only manufacturer, in others, it is the most popular.
+	c[12]-convex | c[12]-unknown | c3[248]-convex | c3[248]-unknown)
+		vendor=convex
+		basic_os=${basic_os:-bsd}
+		;;
+	craynv-unknown)
+		vendor=cray
+		basic_os=${basic_os:-unicosmp}
+		;;
+	c90-unknown | c90-cray)
+		vendor=cray
+		basic_os=${basic_os:-unicos}
+		;;
+	fx80-unknown)
+		vendor=alliant
+		;;
+	romp-unknown)
+		vendor=ibm
+		;;
+	mmix-unknown)
+		vendor=knuth
+		;;
+	microblaze-unknown | microblazeel-unknown)
+		vendor=xilinx
+		;;
+	rs6000-unknown)
+		vendor=ibm
+		;;
+	vax-unknown)
+		vendor=dec
+		;;
+	pdp11-unknown)
+		vendor=dec
+		;;
+	we32k-unknown)
+		vendor=att
+		;;
+	cydra-unknown)
+		vendor=cydrome
+		;;
+	i370-ibm*)
+		vendor=ibm
+		;;
+	orion-unknown)
+		vendor=highlevel
+		;;
+	xps-unknown | xps100-unknown)
+		cpu=xps100
+		vendor=honeywell
+		;;
+
+	# Here we normalize CPU types with a missing or matching vendor
+	armh-unknown | armh-alt)
+		cpu=armv7l
+		vendor=alt
+		basic_os=${basic_os:-linux-gnueabihf}
+		;;
+
+	# Normalized CPU+vendor pairs that imply an OS, if not otherwise specified
+	m68k-isi)
+		basic_os=${basic_os:-sysv}
+		;;
+	m68k-sony)
+		basic_os=${basic_os:-newsos}
+		;;
+	m68k-tektronix)
+		basic_os=${basic_os:-bsd}
+		;;
+	m88k-harris)
+		basic_os=${basic_os:-sysv3}
+		;;
+	i386-bull | m68k-bull)
+		basic_os=${basic_os:-sysv3}
+		;;
+	rs6000-bull)
+		basic_os=${basic_os:-bosx}
+		;;
+	mips-sni)
+		basic_os=${basic_os:-sysv4}
+		;;
+
+	# Here we normalize CPU types irrespective of the vendor
+	amd64-*)
+		cpu=x86_64
+		;;
+	blackfin-*)
+		cpu=bfin
+		basic_os=${basic_os:-linux}
+		;;
+	c54x-*)
+		cpu=tic54x
+		;;
+	c55x-*)
+		cpu=tic55x
+		;;
+	c6x-*)
+		cpu=tic6x
+		;;
+	e500v[12]-*)
+		cpu=powerpc
+		basic_os=${basic_os}"spe"
+		;;
+	mips3*-*)
+		cpu=mips64
+		;;
+	ms1-*)
+		cpu=mt
+		;;
+	m68knommu-*)
+		cpu=m68k
+		basic_os=${basic_os:-linux}
+		;;
+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+		cpu=s12z
+		;;
+	openrisc-*)
+		cpu=or32
+		;;
+	parisc-*)
+		cpu=hppa
+		basic_os=${basic_os:-linux}
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		cpu=i586
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)
+		cpu=i686
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		cpu=i686
+		;;
+	pentium4-*)
+		cpu=i786
+		;;
+	ppc-* | ppcbe-*)
+		cpu=powerpc
+		;;
+	ppcle-* | powerpclittle-*)
+		cpu=powerpcle
+		;;
+	ppc64-*)
+		cpu=powerpc64
+		;;
+	ppc64le-* | powerpc64little-*)
+		cpu=powerpc64le
+		;;
+	sb1-*)
+		cpu=mipsisa64sb1
+		;;
+	sb1el-*)
+		cpu=mipsisa64sb1el
+		;;
+	sh5e[lb]-*)
+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+		;;
+	spur-*)
+		cpu=spur
+		;;
+	strongarm-* | thumb-*)
+		cpu=arm
+		;;
+	tx39-*)
+		cpu=mipstx39
+		;;
+	tx39el-*)
+		cpu=mipstx39el
+		;;
+	xscale-* | xscalee[bl]-*)
+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+		;;
+	arm64-* | aarch64le-*)
+		cpu=aarch64
+		;;
+
+	# Recognize the canonical CPU Types that limit and/or modify the
+	# company names they are paired with.
+	cr16-*)
+		basic_os=${basic_os:-elf}
+		;;
+	crisv32-* | etraxfs*-*)
+		cpu=crisv32
+		vendor=axis
+		;;
+	cris-* | etrax*-*)
+		cpu=cris
+		vendor=axis
+		;;
+	crx-*)
+		basic_os=${basic_os:-elf}
+		;;
+	neo-tandem)
+		cpu=neo
+		vendor=tandem
+		;;
+	nse-tandem)
+		cpu=nse
+		vendor=tandem
+		;;
+	nsr-tandem)
+		cpu=nsr
+		vendor=tandem
+		;;
+	nsv-tandem)
+		cpu=nsv
+		vendor=tandem
+		;;
+	nsx-tandem)
+		cpu=nsx
+		vendor=tandem
+		;;
+	mipsallegrexel-sony)
+		cpu=mipsallegrexel
+		vendor=sony
+		;;
+	tile*-*)
+		basic_os=${basic_os:-linux-gnu}
+		;;
+
+	*)
+		# Recognize the canonical CPU types that are allowed with any
+		# company name.
+		case $cpu in
+			  1750a \
+			| 580 \
+			| [cjt]90 \
+			| a29k \
+			| aarch64 \
+			| aarch64_be \
+			| aarch64c \
+			| abacus \
+			| alpha \
+			| alpha64 \
+			| alpha64ev56 \
+			| alpha64ev6[78] \
+			| alpha64ev[4-8] \
+			| alpha64pca5[67] \
+			| alphaev56 \
+			| alphaev6[78] \
+			| alphaev[4-8] \
+			| alphapca5[67] \
+			| am33_2.0 \
+			| amdgcn \
+			| arc \
+			| arc32 \
+			| arc64 \
+			| arceb \
+			| arm \
+			| arm64e \
+			| arm64ec \
+			| arm[lb]e \
+			| arme[lb] \
+			| armv* \
+			| asmjs \
+			| avr \
+			| avr32 \
+			| ba \
+			| be32 \
+			| be64 \
+			| bfin \
+			| bpf \
+			| bs2000 \
+			| c30 \
+			| c4x \
+			| c8051 \
+			| c[123]* \
+			| clipper \
+			| craynv \
+			| csky \
+			| cydra \
+			| d10v \
+			| d30v \
+			| dlx \
+			| dsp16xx \
+			| e2k \
+			| elxsi \
+			| epiphany \
+			| f30[01] \
+			| f700 \
+			| fido \
+			| fr30 \
+			| frv \
+			| ft32 \
+			| fx80 \
+			| h8300 \
+			| h8500 \
+			| hexagon \
+			| hppa \
+			| hppa1.[01] \
+			| hppa2.0 \
+			| hppa2.0[nw] \
+			| hppa64 \
+			| i*86 \
+			| i370 \
+			| i860 \
+			| i960 \
+			| ia16 \
+			| ia64 \
+			| ip2k \
+			| iq2000 \
+			| javascript \
+			| k1om \
+			| kvx \
+			| le32 \
+			| le64 \
+			| lm32 \
+			| loongarch32 \
+			| loongarch64 \
+			| m32c \
+			| m32r \
+			| m32rle \
+			| m5200 \
+			| m68000 \
+			| m680[012346]0 \
+			| m6811 \
+			| m6812 \
+			| m68360 \
+			| m683?2 \
+			| m68hc11 \
+			| m68hc12 \
+			| m68hcs12x \
+			| m68k \
+			| m88110 \
+			| m88k \
+			| maxq \
+			| mb \
+			| mcore \
+			| mep \
+			| metag \
+			| microblaze \
+			| microblazeel \
+			| mips* \
+			| mmix \
+			| mn10200 \
+			| mn10300 \
+			| moxie \
+			| msp430 \
+			| mt \
+			| nanomips* \
+			| nds32 \
+			| nds32be \
+			| nds32le \
+			| nfp \
+			| nios \
+			| nios2 \
+			| nios2eb \
+			| nios2el \
+			| none \
+			| np1 \
+			| ns16k \
+			| ns32k \
+			| nvptx \
+			| open8 \
+			| or1k* \
+			| or32 \
+			| orion \
+			| pdp10 \
+			| pdp11 \
+			| picochip \
+			| pj \
+			| pjl \
+			| pn \
+			| power \
+			| powerpc \
+			| powerpc64 \
+			| powerpc64le \
+			| powerpcle \
+			| powerpcspe \
+			| pru \
+			| pyramid \
+			| riscv \
+			| riscv32 \
+			| riscv32be \
+			| riscv64 \
+			| riscv64be \
+			| rl78 \
+			| romp \
+			| rs6000 \
+			| rx \
+			| s390 \
+			| s390x \
+			| score \
+			| sh \
+			| sh64 \
+			| sh64le \
+			| sh[12345][lb]e \
+			| sh[1234] \
+			| sh[1234]e[lb] \
+			| sh[23]e \
+			| sh[23]ele \
+			| sh[24]a \
+			| sh[24]ae[lb] \
+			| sh[lb]e \
+			| she[lb] \
+			| shl \
+			| sparc \
+			| sparc64 \
+			| sparc64b \
+			| sparc64v \
+			| sparc86x \
+			| sparclet \
+			| sparclite \
+			| sparcv8 \
+			| sparcv9 \
+			| sparcv9b \
+			| sparcv9v \
+			| spu \
+			| sv1 \
+			| sx* \
+			| tahoe \
+			| thumbv7* \
+			| tic30 \
+			| tic4x \
+			| tic54x \
+			| tic55x \
+			| tic6x \
+			| tic80 \
+			| tron \
+			| ubicom32 \
+			| v70 \
+			| v810 \
+			| v850 \
+			| v850e \
+			| v850e1 \
+			| v850e2 \
+			| v850e2v3 \
+			| v850es \
+			| vax \
+			| vc4 \
+			| visium \
+			| w65 \
+			| wasm32 \
+			| wasm64 \
+			| we32k \
+			| x86 \
+			| x86_64 \
+			| xc16x \
+			| xgate \
+			| xps100 \
+			| xstormy16 \
+			| xtensa* \
+			| ymp \
+			| z80 \
+			| z8k)
+				;;
+
+			*)
+				echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2
+				exit 1
+				;;
+		esac
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+	digital*)
+		vendor=dec
+		;;
+	commodore*)
+		vendor=cbm
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x"$basic_os" != x
+then
+
+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just
+# set os.
+obj=
+case $basic_os in
+	gnu/linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+		;;
+	os2-emx)
+		kernel=os2
+		os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+		;;
+	nto-qnx*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+		;;
+	*-*)
+		saved_IFS=$IFS
+		IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+		IFS=$saved_IFS
+		;;
+	# Default OS when just kernel was specified
+	nto*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+		;;
+	linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+		;;
+	managarm*)
+		kernel=managarm
+		os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`
+		;;
+	*)
+		kernel=
+		os=$basic_os
+		;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# solaris* is a basic system type, with this one exception.
+	auroraux)
+		os=auroraux
+		;;
+	bluegene*)
+		os=cnk
+		;;
+	solaris1 | solaris1.*)
+		os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+		;;
+	solaris)
+		os=solaris2
+		;;
+	unixware*)
+		os=sysv4.2uw
+		;;
+	# The marketing names for NeXT's operating systems were
+	# NeXTSTEP, NeXTSTEP 2, OpenSTEP 3, OpenSTEP 4.  'openstep' is
+	# mapped to 'openstep3', but 'openstep1' and 'openstep2' are
+	# mapped to 'nextstep' and 'nextstep2', consistent with the
+	# treatment of SunOS/Solaris.
+	ns | ns1 | nextstep | nextstep1 | openstep1)
+		os=nextstep
+		;;
+	ns2 | nextstep2 | openstep2)
+		os=nextstep2
+		;;
+	ns3 | nextstep3 | openstep | openstep3)
+		os=openstep3
+		;;
+	ns4 | nextstep4 | openstep4)
+		os=openstep4
+		;;
+	# es1800 is here to avoid being matched by es* (a different OS)
+	es1800*)
+		os=ose
+		;;
+	# Some version numbers need modification
+	chorusos*)
+		os=chorusos
+		;;
+	isc)
+		os=isc2.2
+		;;
+	sco6)
+		os=sco5v6
+		;;
+	sco5)
+		os=sco3.2v5
+		;;
+	sco4)
+		os=sco3.2v4
+		;;
+	sco3.2.[4-9]*)
+		os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+		;;
+	sco*v* | scout)
+		# Don't match below
+		;;
+	sco*)
+		os=sco3.2v2
+		;;
+	psos*)
+		os=psos
+		;;
+	qnx*)
+		os=qnx
+		;;
+	hiux*)
+		os=hiuxwe2
+		;;
+	lynx*178)
+		os=lynxos178
+		;;
+	lynx*5)
+		os=lynxos5
+		;;
+	lynxos*)
+		# don't get caught up in next wildcard
+		;;
+	lynx*)
+		os=lynxos
+		;;
+	mac[0-9]*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
+		;;
+	opened*)
+		os=openedition
+		;;
+	os400*)
+		os=os400
+		;;
+	sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+		;;
+	sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+		;;
+	wince*)
+		os=wince
+		;;
+	utek*)
+		os=bsd
+		vendor=`echo "$vendor" | sed -e 's|^unknown$|tektronix|'`
+		;;
+	dynix*)
+		os=bsd
+		;;
+	acis*)
+		os=aos
+		;;
+	atheos*)
+		os=atheos
+		;;
+	syllable*)
+		os=syllable
+		;;
+	386bsd)
+		os=bsd
+		;;
+	ctix*)
+		os=sysv
+		vendor=`echo "$vendor" | sed -e 's|^unknown$|convergent|'`
+		;;
+	uts*)
+		os=sysv
+		;;
+	nova*)
+		kernel=rtmk
+		os=nova
+		;;
+	# Preserve the version number of sinix5.
+	sinix5.*)
+		os=`echo "$os" | sed -e 's|sinix|sysv|'`
+		vendor=`echo "$vendor" | sed -e 's|^unknown$|sni|'`
+		;;
+	sinix*)
+		os=sysv4
+		vendor=`echo "$vendor" | sed -e 's|^unknown$|sni|'`
+		;;
+	tpf*)
+		os=tpf
+		;;
+	triton*)
+		os=sysv3
+		;;
+	oss*)
+		os=sysv3
+		;;
+	svr4*)
+		os=sysv4
+		;;
+	svr3)
+		os=sysv3
+		;;
+	sysvr4)
+		os=sysv4
+		;;
+	ose*)
+		os=ose
+		;;
+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+		os=mint
+		;;
+	dicos*)
+		os=dicos
+		;;
+	pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $cpu in
+		    arm*)
+			os=eabi
+			;;
+		    *)
+			os=
+			obj=elf
+			;;
+		esac
+		;;
+	aout* | coff* | elf* | pe*)
+		# These are machine code file formats, not OSes
+		obj=$os
+		os=
+		;;
+	*)
+		# No normalization, but not necessarily accepted, that comes below.
+		;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+obj=
+case $cpu-$vendor in
+	score-*)
+		os=
+		obj=elf
+		;;
+	spu-*)
+		os=
+		obj=elf
+		;;
+	*-acorn)
+		os=riscix1.2
+		;;
+	arm*-rebel)
+		kernel=linux
+		os=gnu
+		;;
+	arm*-semi)
+		os=
+		obj=aout
+		;;
+	c4x-* | tic4x-*)
+		os=
+		obj=coff
+		;;
+	c8051-*)
+		os=
+		obj=elf
+		;;
+	clipper-intergraph)
+		os=clix
+		;;
+	hexagon-*)
+		os=
+		obj=elf
+		;;
+	tic54x-*)
+		os=
+		obj=coff
+		;;
+	tic55x-*)
+		os=
+		obj=coff
+		;;
+	tic6x-*)
+		os=
+		obj=coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=tops20
+		;;
+	pdp11-*)
+		os=none
+		;;
+	*-dec | vax-*)
+		os=ultrix4.2
+		;;
+	m68*-apollo)
+		os=domain
+		;;
+	i386-sun)
+		os=sunos4.0.2
+		;;
+	m68000-sun)
+		os=sunos3
+		;;
+	m68*-cisco)
+		os=
+		obj=aout
+		;;
+	mep-*)
+		os=
+		obj=elf
+		;;
+	# The -sgi and -siemens entries must be before the mips- entry
+	# or we get the wrong os.
+	*-sgi)
+		os=irix
+		;;
+	*-siemens)
+		os=sysv4
+		;;
+	mips*-cisco)
+		os=
+		obj=elf
+		;;
+	mips*-*|nanomips*-*)
+		os=
+		obj=elf
+		;;
+	or32-*)
+		os=
+		obj=coff
+		;;
+	# This must be before the sparc-* entry or we get the wrong os.
+	*-tti)
+		os=sysv3
+		;;
+	sparc-* | *-sun)
+		os=sunos4.1.1
+		;;
+	pru-*)
+		os=
+		obj=elf
+		;;
+	*-be)
+		os=beos
+		;;
+	*-ibm)
+		os=aix
+		;;
+	*-knuth)
+		os=mmixware
+		;;
+	*-wec)
+		os=proelf
+		;;
+	*-winbond)
+		os=proelf
+		;;
+	*-oki)
+		os=proelf
+		;;
+	*-hp)
+		os=hpux
+		;;
+	*-hitachi)
+		os=hiuxwe2
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=sysv
+		;;
+	*-cbm)
+		os=amigaos
+		;;
+	*-dg)
+		os=dgux
+		;;
+	*-dolphin)
+		os=sysv3
+		;;
+	m68k-ccur)
+		os=rtu
+		;;
+	m88k-omron*)
+		os=luna
+		;;
+	*-next)
+		os=nextstep
+		;;
+	*-sequent)
+		os=ptx
+		;;
+	*-crds)
+		os=unos
+		;;
+	*-ns)
+		os=genix
+		;;
+	i370-*)
+		os=mvs
+		;;
+	*-gould)
+		os=sysv
+		;;
+	*-highlevel)
+		os=bsd
+		;;
+	*-encore)
+		os=bsd
+		;;
+	*-masscomp)
+		os=rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=uxpv
+		;;
+	*-rom68k)
+		os=
+		obj=coff
+		;;
+	*-*bug)
+		os=
+		obj=coff
+		;;
+	*-apple)
+		os=macos
+		;;
+	*-atari*)
+		os=mint
+		;;
+	*-wrs)
+		os=vxworks
+		;;
+	*)
+		os=none
+		;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).
+
+case $os in
+	# Sometimes we do "kernel-libc", so those need to count as OSes.
+	llvm* | musl* | newlib* | relibc* | uclibc*)
+		;;
+	# Likewise for "kernel-abi"
+	eabi* | gnueabi*)
+		;;
+	# VxWorks passes extra cpu info in the 4th filed.
+	simlinux | simwindows | spe)
+		;;
+	# See `case $cpu-$os` validation below
+	ghcjs)
+		;;
+	# Now accept the basic system types.
+	# Each alternative MUST end in a * to match a version number.
+	  abug \
+	| aix* \
+	| amdhsa* \
+	| amigados* \
+	| amigaos* \
+	| android* \
+	| aof* \
+	| aos* \
+	| aros* \
+	| atheos* \
+	| auroraux* \
+	| aux* \
+	| beos* \
+	| bitrig* \
+	| bme* \
+	| bosx* \
+	| bsd* \
+	| cegcc* \
+	| chorusos* \
+	| chorusrdb* \
+	| clix* \
+	| cloudabi* \
+	| cnk* \
+	| conix* \
+	| cos* \
+	| cxux* \
+	| cygwin* \
+	| darwin* \
+	| dgux* \
+	| dicos* \
+	| dnix* \
+	| domain* \
+	| dragonfly* \
+	| drops* \
+	| ebmon* \
+	| ecoff* \
+	| ekkobsd* \
+	| emscripten* \
+	| emx* \
+	| es* \
+	| fiwix* \
+	| freebsd* \
+	| fuchsia* \
+	| genix* \
+	| genode* \
+	| glidix* \
+	| gnu* \
+	| go32* \
+	| haiku* \
+	| hcos* \
+	| hiux* \
+	| hms* \
+	| hpux* \
+	| ieee* \
+	| interix* \
+	| ios* \
+	| iris* \
+	| irix* \
+	| ironclad* \
+	| isc* \
+	| its* \
+	| l4re* \
+	| libertybsd* \
+	| lites* \
+	| lnews* \
+	| luna* \
+	| lynxos* \
+	| mach* \
+	| macos* \
+	| magic* \
+	| mbr* \
+	| midipix* \
+	| midnightbsd* \
+	| mingw32* \
+	| mingw64* \
+	| minix* \
+	| mint* \
+	| mirbsd* \
+	| mks* \
+	| mlibc* \
+	| mmixware* \
+	| mon960* \
+	| morphos* \
+	| moss* \
+	| moxiebox* \
+	| mpeix* \
+	| mpw* \
+	| msdos* \
+	| msys* \
+	| mvs* \
+	| nacl* \
+	| netbsd* \
+	| netware* \
+	| newsos* \
+	| nextstep* \
+	| nindy* \
+	| nonstopux* \
+	| nova* \
+	| nsk* \
+	| nucleus* \
+	| nx6 \
+	| nx7 \
+	| oabi* \
+	| ohos* \
+	| onefs* \
+	| openbsd* \
+	| openedition* \
+	| openstep* \
+	| os108* \
+	| os2* \
+	| os400* \
+	| os68k* \
+	| os9* \
+	| ose* \
+	| osf* \
+	| oskit* \
+	| osx* \
+	| palmos* \
+	| phoenix* \
+	| plan9* \
+	| powermax* \
+	| powerunix* \
+	| proelf* \
+	| psos* \
+	| psp* \
+	| ptx* \
+	| pw32* \
+	| qnx* \
+	| rdos* \
+	| redox* \
+	| rhapsody* \
+	| riscix* \
+	| riscos* \
+	| rtems* \
+	| rtmk* \
+	| rtu* \
+	| scout* \
+	| secbsd* \
+	| sei* \
+	| serenity* \
+	| sim* \
+	| skyos* \
+	| solaris* \
+	| solidbsd* \
+	| sortix* \
+	| storm-chaos* \
+	| sunos \
+	| sunos[34]* \
+	| superux* \
+	| syllable* \
+	| sym* \
+	| sysv* \
+	| tenex* \
+	| tirtos* \
+	| toppers* \
+	| tops10* \
+	| tops20* \
+	| tpf* \
+	| tvos* \
+	| twizzler* \
+	| uclinux* \
+	| udi* \
+	| udk* \
+	| ultrix* \
+	| unicos* \
+	| uniplus* \
+	| unleashed* \
+	| unos* \
+	| uwin* \
+	| uxpv* \
+	| v88r* \
+	|*vms* \
+	| vos* \
+	| vsta* \
+	| vxsim* \
+	| vxworks* \
+	| wasi* \
+	| watchos* \
+	| wince* \
+	| windiss* \
+	| windows* \
+	| winnt* \
+	| xenix* \
+	| xray* \
+	| zephyr* \
+	| zvmoe* )
+		;;
+	# This one is extra strict with allowed versions
+	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	# This refers to builds using the UEFI calling convention
+	# (which depends on the architecture) and PE file format.
+	# Note that this is both a different calling convention and
+	# different file format than that of GNU-EFI
+	# (x86_64-w64-mingw32).
+	uefi)
+		;;
+	none)
+		;;
+	kernel* | msvc* )
+		# Restricted further below
+		;;
+	'')
+		if test x"$obj" = x
+		then
+			echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2
+		fi
+		;;
+	*)
+		echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2
+		exit 1
+		;;
+esac
+
+case $obj in
+	aout* | coff* | elf* | pe*)
+		;;
+	'')
+		# empty is fine
+		;;
+	*)
+		echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2
+		exit 1
+		;;
+esac
+
+# Here we handle the constraint that a (synthetic) cpu and os are
+# valid only in combination with each other and nowhere else.
+case $cpu-$os in
+	# The "javascript-unknown-ghcjs" triple is used by GHC; we
+	# accept it here in order to tolerate that, but reject any
+	# variations.
+	javascript-ghcjs)
+		;;
+	javascript-* | *-ghcjs)
+		echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2
+		exit 1
+		;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os-$obj in
+	linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \
+		    | linux-mlibc*- | linux-musl*- | linux-newlib*- \
+		    | linux-relibc*- | linux-uclibc*- | linux-ohos*- )
+		;;
+	uclinux-uclibc*- | uclinux-gnu*- )
+		;;
+	managarm-mlibc*- | managarm-kernel*- )
+		;;
+	windows*-msvc*-)
+		;;
+	-dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \
+		    | -uclibc*- )
+		# These are just libc implementations, not actual OSes, and thus
+		# require a kernel.
+		echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2
+		exit 1
+		;;
+	-kernel*- )
+		echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2
+		exit 1
+		;;
+	*-kernel*- )
+		echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2
+		exit 1
+		;;
+	*-msvc*- )
+		echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2
+		exit 1
+		;;
+	kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-)
+		;;
+	vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-)
+		;;
+	nto-qnx*-)
+		;;
+	os2-emx-)
+		;;
+	rtmk-nova-)
+		;;
+	*-eabi*- | *-gnueabi*-)
+		;;
+	none--*)
+		# None (no kernel, i.e. freestanding / bare metal),
+		# can be paired with an machine code file format
+		;;
+	-*-)
+		# Blank kernel with real OS is always fine.
+		;;
+	--*)
+		# Blank kernel and OS with real machine code file format is always fine.
+		;;
+	*-*-*)
+		echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2
+		exit 1
+		;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+	unknown)
+		case $cpu-$os in
+			*-riscix*)
+				vendor=acorn
+				;;
+			*-sunos* | *-solaris*)
+				vendor=sun
+				;;
+			*-cnk* | *-aix*)
+				vendor=ibm
+				;;
+			*-beos*)
+				vendor=be
+				;;
+			*-hpux*)
+				vendor=hp
+				;;
+			*-mpeix*)
+				vendor=hp
+				;;
+			*-hiux*)
+				vendor=hitachi
+				;;
+			*-unos*)
+				vendor=crds
+				;;
+			*-dgux*)
+				vendor=dg
+				;;
+			*-luna*)
+				vendor=omron
+				;;
+			*-genix*)
+				vendor=ns
+				;;
+			*-clix*)
+				vendor=intergraph
+				;;
+			*-mvs* | *-opened*)
+				vendor=ibm
+				;;
+			*-os400*)
+				vendor=ibm
+				;;
+			s390-* | s390x-*)
+				vendor=ibm
+				;;
+			*-ptx*)
+				vendor=sequent
+				;;
+			*-tpf*)
+				vendor=ibm
+				;;
+			*-vxsim* | *-vxworks* | *-windiss*)
+				vendor=wrs
+				;;
+			*-aux*)
+				vendor=apple
+				;;
+			*-hms*)
+				vendor=hitachi
+				;;
+			*-mpw* | *-macos*)
+				vendor=apple
+				;;
+			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+				vendor=atari
+				;;
+			*-vos*)
+				vendor=stratus
+				;;
+		esac
+		;;
+esac
+
+echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/config/depcomp b/config/depcomp
new file mode 100755
index 000000000..65cbf7093
--- /dev/null
+++ b/config/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config/install-sh b/config/install-sh
new file mode 100755
index 000000000..8175c640f
--- /dev/null
+++ b/config/install-sh
@@ -0,0 +1,518 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2018-03-11.20; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dstbase=`basename "$src"`
+      case $dst in
+	*/) dst=$dst$dstbase;;
+	*)  dst=$dst/$dstbase;;
+      esac
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
+            # here however when possible just to lower collision chance.
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # Because "mkdir -p" follows existing symlinks and we likely work
+            # directly in world-writeable /tmp, make sure that the '$tmpdir'
+            # directory is successfully created first before we actually test
+            # 'mkdir -p' feature.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config/ltmain.sh b/config/ltmain.sh
new file mode 100644
index 000000000..7dc2ce412
--- /dev/null
+++ b/config/ltmain.sh
@@ -0,0 +1,11269 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
+
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION=2.4.6
+package_revision=2.4.6
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
+fi
+
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
+	fi"
+done
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
+: ${CP="cp -f"}
+# work around bug in libtool which raises an error when running in a
+# parallel make that should have been handled in printf internally
+printf()
+{
+  while ! builtin printf "$@" ; do
+    errcode=$?
+    # errcode might be EAGAIN=11 which means to simply try again
+    if [ $errcode != 11 ]; then
+      return $errcode
+    fi
+  done
+}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+
+
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
+
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
+
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
+
+
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
+
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
+
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
+
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
+
+# Make sure we have an absolute progpath for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
+     progdir=`cd "$progdir" && pwd`
+     progpath=$progdir/$progname
+     ;;
+  *)
+     _G_IFS=$IFS
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS=$_G_IFS
+       test -x "$progdir/$progname" && break
+     done
+     IFS=$_G_IFS
+     test -n "$progdir" || progdir=`pwd`
+     progpath=$progdir/$progname
+     ;;
+esac
+
+
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
+
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
+
+opt_dry_run=false
+opt_quiet=false
+opt_verbose=false
+
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
+{
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
+
+    require_term_colors=:
+}
+
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $debug_cmd
+
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    $debug_cmd
+
+    _G_directory_path=$1
+    _G_dir_list=
+
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$_G_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        _G_dir_list=$_G_directory_path:$_G_dir_list
+
+        # If the last portion added has no slash in it, the list is done
+        case $_G_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
+      done
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
+
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$_G_dir" 2>/dev/null || :
+      done
+      IFS=$func_mkdir_p_IFS
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
+    fi
+}
+
+
+# func_mktempdir [BASENAME]
+# -------------------------
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, BASENAME is the basename for that directory.
+func_mktempdir ()
+{
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+    if test : = "$opt_dry_run"; then
+      # Return a directory name, but don't create it in dry-run mode
+      _G_tmpdir=$_G_template-$$
+    else
+
+      # If mktemp works, use that first and foremost
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$_G_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
+
+        func_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
+    fi
+
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
+{
+    $debug_cmd
+
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+    $debug_cmd
+
+    func_parse_options_result=
+
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
+
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
+
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
+
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
+
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+    $debug_cmd
+
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+    func_run_hooks func_validate_options ${1+"$@"}
+
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
+}
+
+
+# func_missing_arg ARGNAME
+# ------------------------
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $debug_cmd
+
+    func_error "Missing argument for '$1'."
+    exit_cmd=exit
+}
+
+
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
+
+
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
+
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
+
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
+
+    exit $?
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
+
+
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+    $debug_cmd
+
+    $warning_func ${1+"$@"}
+}
+
+
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
+
+
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
+}
+
+
+# func_config
+# -----------
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+
+# func_features
+# -------------
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test yes = "$build_libtool_libs"; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test yes = "$build_old_libs"; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+
+# func_enable_tag TAGNAME
+# -----------------------
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+    # Global variable:
+    tagname=$1
+
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
+
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
+
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
+    *)
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
+}
+
+
+# func_check_version_match
+# ------------------------
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+      fi
+
+      exit $EXIT_MISMATCH
+    fi
+}
+
+
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
+
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
+
+    nonopt=
+    preserve_args=
+
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
+
+
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
+{
+    $debug_cmd
+
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
+
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
+
+
+
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
+    fi
+
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
+
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
+
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
+
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_validate_options libtool_validate_options
+
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if 'file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case $lalib_p_line in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test yes = "$lalib_p"
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $debug_cmd
+
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$sp$nl
+      eval cmd=\"$cmd\"
+      IFS=$save_ifs
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# 'FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $debug_cmd
+
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case $lt_sysroot:$1 in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result='='$func_stripname_result
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $debug_cmd
+
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with '--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
+    else
+      write_lobj=none
+    fi
+
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "$write_libobj"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $debug_cmd
+
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $debug_cmd
+
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $debug_cmd
+
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  '$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result=$1
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $debug_cmd
+
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  '$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result=$3
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $debug_cmd
+
+  case $4 in
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via '$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $debug_cmd
+
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $debug_cmd
+
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result=$1
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via '$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $debug_cmd
+
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $debug_cmd
+
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result=$1
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+func_add2xrpath ()
+{
+  dir="$1"
+  # We need an absolute path.
+  case $dir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    =*)
+    func_stripname '=' '' "$dir"
+    dir=$lt_sysroot$func_stripname_result
+      ;;
+    *)
+      func_fatal_error "only absolute run-paths are allowed"
+      ;;
+  esac
+  case "$xrpath " in
+    *" $dir "*) ;;
+    *) func_append xrpath " $dir" ;;
+  esac
+}
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $debug_cmd
+
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg=$srcfile
+	srcfile=$arg
+	arg_mode=normal
+	;;
+
+      target )
+	libobj=$arg
+	arg_mode=normal
+	continue
+	;;
+
+      skip )
+        lastarg=
+        arg_mode=normal
+        continue
+        ;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify '-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xlinker | -XCClinker)
+	  arg_mode=skip #  the next one is ignored for compile mode
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs=$IFS; IFS=,
+	  for arg in $args; do
+	    IFS=$save_ifs
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS=$save_ifs
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg=$srcfile
+	  srcfile=$arg
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with '-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj=$func_basename_result
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from '$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test yes = "$build_old_libs"; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test yes = "$need_locks"; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test warn = "$need_locks"; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test yes = "$build_libtool_libs"; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test no != "$pic_mode"; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test yes = "$suppress_opt"; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test yes = "$compiler_c_o"; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test no != "$need_locks"; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to '-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the '--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the 'install' or 'cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with '-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in '.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
+
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode '$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try '$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test : = "$opt_help"; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    $SED '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $debug_cmd
+
+    # The first argument is the command name.
+    cmd=$nonopt
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "'$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "'$file' was not linked with '-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+	;;
+
+      *)
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir=$absdir
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic=$magic
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd=\$cmd$args
+    fi
+}
+
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $debug_cmd
+
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "'$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument '$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_quiet && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the '$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $debug_cmd
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=false
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=: ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir=$func_dirname_result
+      destname=$func_basename_result
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "'$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "'$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir=$func_dirname_result
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking '$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname=$1
+	  shift
+
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme=$stripme
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib=$destdir/$realname
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name=$func_basename_result
+	instname=$dir/${name}i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest=$destfile
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test yes = "$build_old_libs"; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=.exe
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
+
+	  finalize=:
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test no = "$fast_install" && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if $finalize; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_quiet || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink '$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file=$outputname
+	      else
+	        func_warning "cannot relink '$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name=$func_basename_result
+
+      # Set up the ranlib parameters.
+      oldlib=$destdir/$name
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run '$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms=${my_outputname}S.c
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist=$output_objdir/$my_outputname.nm
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols=$output_objdir/$outputname.exp
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from '$dlprefile'"
+	  func_basename "$dlprefile"
+	  name=$func_basename_result
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname"; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename=$func_basename_result
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename"; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj=$output_objdir/${my_outputname}S.$objext
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $debug_cmd
+
+  win32_libid_type=unknown
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
+	    1,100{
+		/ I /{
+		    s|.*|import|
+		    p
+		    q
+		}
+	    }'`
+	;;
+      esac
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $debug_cmd
+
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $debug_cmd
+
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1"; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test yes = "$lock_old_archive_extraction"; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $debug_cmd
+
+    my_gentop=$1; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib=$func_basename_result
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result=$my_oldobjs
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory where it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ that is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options that match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test yes = "$fast_install"; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	\$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* declarations of non-ANSI functions */
+#if defined __MINGW32__
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined __CYGWIN__
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined other_platform || defined ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined _MSC_VER
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+#elif defined __MINGW32__
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined __CYGWIN__
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined other platforms ... */
+#endif
+
+#if defined PATH_MAX
+# define LT_PATHMAX PATH_MAX
+#elif defined MAXPATHLEN
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free (stale); stale = 0; } \
+} while (0)
+
+#if defined LT_DEBUGWRAPPER
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test yes = "$fast_install"; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  int rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, (size_t) argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (STREQ (argv[i], dumpscript_opt))
+	{
+EOF
+	    case $host in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (STREQ (argv[i], debug_opt))
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (STREQ (argv[i], ltwrapper_option_prefix))
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  size_t tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = (size_t) (q - p);
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (STREQ (str, pat))
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[--len] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $debug_cmd
+
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $debug_cmd
+
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # what system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll that has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    os2dllname=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=false
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module=$wl-single_module
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg=$1
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir=$arg
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  $preload || {
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=:
+	  }
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test no = "$dlself"; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test dlprefiles = "$prev"; then
+	      dlself=yes
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test dlfiles = "$prev"; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols=$arg
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file '$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir=$func_dirname_result
+
+		if test none != "$pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object=$xdir$pic_object
+
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test dlprefiles = "$prev"; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg=$pic_object
+		fi
+
+		# Non-PIC object.
+		if test none != "$non_pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object=$xdir$non_pic_object
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object=$pic_object
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir=$func_dirname_result
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "'$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file '$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release=-$arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test rpath = "$prev"; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds=$arg
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg=$arg
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test X-export-symbols = "X$arg"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between '-L' and '$1'"
+	  else
+	    func_fatal_error "need path for '-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  esac
+	elif test X-lc_r = "X$arg"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module=$wl-multi_module
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	func_add2xrpath "$dir"
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,--start-group|-Wl,--end-group|-Wl,-\(|-Wl,-\))
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -Wl,*)
+	wlprefix=`expr x"$wl" : '.*' - 1`
+	wlprefix=`expr x"$arg" : 'x\(.\{'"$wlprefix"'\}\)'`
+	if test x"$wlprefix" = x"$wl" -a x"$wl" != x"-Wl,"; then
+	  func_append compiler_flags " $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  if expr "x$arg" : '^x'"$wl"'-rpath,,' >/dev/null ; then
+	    func_stripname "$wl"'-rpath,,' '' "$arg"
+	    dir=$func_stripname_result
+	    func_add2xrpath "$dir"
+	  elif expr "x$arg" : '^x'"$wl"'-rpath$' >/dev/null ; then
+	    func_stripname "$wl" '' "$1"
+	    dir=$func_stripname_result
+	    if ! expr "x$1" : '^x'"$wl" >/dev/null \
+	    || ! test -d "$dir" ; then
+	    func_fatal_error "$wl"'-rpath must be followed by '"$wl"'-escaped directory'
+	    fi
+	    shift
+	    func_add2xrpath "$dir"
+	    continue
+	  else
+	    func_stripname "$wl" '' "$arg"
+	    func_append new_inherited_linker_flags " -Wl,$func_stripname_result"
+	  fi
+	  continue
+	elif expr "x$arg" : '^x-Wl,-rpath,' >/dev/null ; then
+	  func_stripname '-Wl,-rpath,' '' "$arg"
+	  dir=$func_stripname_result
+	  func_add2xrpath "$dir"
+	  continue
+	elif expr "x$arg" : '^x-Wl,-rpath$' >/dev/null ; then
+	  func_stripname '-Wl,' '' "$1"
+	  dir=$func_stripname_result
+	  if ! expr "x$1" : '^x-Wl,' >/dev/null \
+	    || ! test -d "$dir" ; then
+	    func_fatal_error '-Wl,-rpath must be followed by -Wl-escaped directory'
+	  fi
+	  func_quote_for_eval "$1"
+	  func_append libtool_args " $func_quote_for_eval_result"
+	  shift
+	  func_add2xrpath "$dir"
+	  continue
+	fi
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir=$func_dirname_result
+
+	  test none = "$pic_object" || {
+	    # Prepend the subdirectory the object is found in.
+	    pic_object=$xdir$pic_object
+
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test dlprefiles = "$prev"; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg=$pic_object
+	  }
+
+	  # Non-PIC object.
+	  if test none != "$non_pic_object"; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object=$xdir$non_pic_object
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object=$pic_object
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir=$func_dirname_result
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "'$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test dlfiles = "$prev"; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test dlprefiles = "$prev"; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prevarg' option requires an argument"
+
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
+    func_dirname "$output" "/" ""
+    output_objdir=$func_dirname_result$objdir
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test lib = "$linkmode"; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=false
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test lib,link = "$linkmode,$pass"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs=$tmp_deplibs
+      fi
+
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
+	deplibs=
+      fi
+      if test prog = "$linkmode"; then
+	case $pass in
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
+	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	esac
+      fi
+      if test lib,dlpreopen = "$linkmode,$pass"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs=$dlprefiles
+      fi
+      if test dlopen = "$pass"; then
+	# Collect dlpreopened libraries
+	save_deplibs=$deplibs
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=false
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test lib = "$linkmode"; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib=$searchdir/lib$name$search_ext
+	      if test -f "$lib"; then
+		if test .la = "$search_ext"; then
+		  found=:
+		else
+		  found=false
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if $found; then
+	    # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll=$l
+		  done
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
+		    func_dirname "$lib" "" "."
+		    ladir=$func_dirname_result
+		    lib=$ladir/$old_library
+		    if test prog,link = "$linkmode,$pass"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test conv = "$pass" && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test conv = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test scan = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "'-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test link = "$pass"; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=false
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=:
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=:
+		;;
+	      esac
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test link != "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=:
+	  continue
+	  ;;
+	-Wl,--start-group|-Wl,--end-group|-Wl,-\(|-Wl,-\))
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	  fi
+	  continue
+	  ;;
+	esac # case $deplib
+
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir=$func_dirname_result
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+
+	  # Additionally convert " -pthread" to " -Wl,-pthread" for nagfor
+	  if test yes = "$with_nagfor" ; then
+	    tmp_inherited_linker_flags=`$ECHO " $tmp_inherited_linker_flags " | $SED 's/ -pthread[[:blank:]]/ -Wl,-pthread /g'`
+	  fi
+
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test conv = "$pass"; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for '$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
+	  fi
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    deplibs="$deplib $deplibs"
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib=$l
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for '$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
+	  if test -z "$dlname" ||
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of '$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir=$ladir
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname=$func_basename_result
+
+	# Find the relevant object directory and library name.
+	if test yes = "$installed"; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
+	  else
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
+	  fi
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
+	  fi
+	  case $host in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test lib = "$linkmode"; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test prog = "$linkmode" && test link != "$pass"; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if $linkalldeplibs; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test prog,link = "$linkmode,$pass"; then
+	  if test -n "$library_names" &&
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
+	      # Make sure the rpath contains only unique directories.
+	      case $temp_rpath: in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test built = "$use_static_libs" && test yes = "$installed"; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test no = "$installed"; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule=$dlpremoduletest
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
+	    echo
+	    if test prog = "$linkmode"; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname=$1
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname=$dlname
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc* | *os2*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix=-$major
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname=$realname
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot=$soname
+	    func_basename "$soroot"
+	    soname=$func_basename_result
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from '$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for '$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir=-L$dir ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we cannot
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library"; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add=$dir/$old_library
+			fi
+		      elif test -n "$old_library"; then
+			add=$dir/$old_library
+		      fi
+		    fi
+		esac
+	      elif test no = "$hardcode_minus_L"; then
+		case $host in
+		*-*-sunos*) add_shlibpath=$dir ;;
+		esac
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test yes != "$lib_linked"; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
+	      else
+		add=$libdir/$linklib
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir=-L$libdir
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add=-l$name
+	    fi
+
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test prog = "$linkmode"; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test yes = "$build_libtool_libs"; then
+	  # Not a shared library
+	  if test pass_all != "$deplibs_check_method"; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test yes = "$module"; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test no = "$build_old_libs"; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test lib = "$linkmode"; then
+	  if test -n "$dependency_libs" &&
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs=$temp_deplibs
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test no != "$link_all_deplibs"; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path=$deplib ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path=-L$absdir/$objdir
+		  ;;
+		esac
+		else
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "'$deplib' seems to be moved"
+
+		  path=-L$absdir
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	}
+
+	if test prog,link = "$linkmode,$pass"; then
+	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*)
+                func_stripname '-R' '' "$deplib"
+                func_add2xrpath "$func_stripname_result"
+                ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=
+	  ;;
+	esac
+	if test -n "$i"; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
+    fi
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "'-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs=$output
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form 'libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
+
+	if test no != "$need_lib_prefix"; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
+
+      install_libdir=$1
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test yes = "$build_libtool_libs"; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a '.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "'-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs=$IFS; IFS=:
+	set dummy $vinfo 0 0 0
+	shift
+	IFS=$save_ifs
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to '-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # that has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|freebsd-elf|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_revision
+	    ;;
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_minor
+	    lt_irix_increment=no
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current=$1
+	  revision=$2
+	  age=$3
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $with_nagfor in
+              yes)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
+	  ;;
+
+	freebsd-aout)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	freebsd-elf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	irix | nonstopux)
+	  if test no = "$lt_irix_increment"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring=$verstring_prefix$major.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test 0 -ne "$loop"; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring_prefix$major.$iface:$verstring
+	  done
+
+	  # Before this point, $major must not contain '.'.
+	  major=.$major
+	  versuffix=$major.$revision
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test 0 -ne "$loop"; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring:$iface.0
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":$current.0"
+	  ;;
+
+	qnx)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sunos)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 file systems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix=-$major
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type '$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring=0.0
+	    ;;
+	  esac
+	  if test no = "$need_version"; then
+	    versuffix=
+	  else
+	    versuffix=.0.0
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test yes,no = "$avoid_version,$need_version"; then
+	  major=
+	  versuffix=
+	  verstring=
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag=$no_undefined_flag
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" :
+      func_append libobjs " $symfileobj"
+      test " " = "$libobjs" && libobjs=
+
+      if test relink != "$opt_mode"; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles=$dlfiles
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles=$dlprefiles
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test yes = "$build_libtool_libs"; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test yes = "$build_libtool_need_lc"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=
+	versuffix=
+	major=
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=
+		    ;;
+		  esac
+		fi
+		if test -n "$i"; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i"; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test yes = "$want_nocaseglob"; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib=$potent_lib
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib=$potent_lib # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test none = "$deplibs_check_method"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test no = "$allow_undefined"; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # Time to revert the changes made for nagfor. This might be required if
+      # we need to make the output '*.la' file to be correctly interpreted for
+      # gcc (e.g. the output library that we are linking now with nagfor needs
+      # to be linked by gcc later). In this case, the libtool script of a
+      # package that will try to link our library will have to make similar
+      # non-standard nagfor-specific modifications of the '-pthread' flag.
+      # Thus, if we are creating a Fortran library for nagfor only, it is
+      # better not to revert the changes, otherwise, uncomment the following
+      # lines.
+
+      if test yes = "$with_nagfor" ; then
+        new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags " | $SED 's/ -Wl,-pthread / -pthread /g;s/^ *//;s/ *$//'`
+      fi
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	-Wl,*)
+	  func_stripname -Wl, '' "$deplib"
+	  func_append new_libs " $wl$func_stripname_result"
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs=$new_libs
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test yes = "$hardcode_into_libs"; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs=$libdir
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir=$hardcode_libdirs
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname=$1
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname=$realname
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib=$output_objdir/$realname
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    func_dll_def_p "$export_symbols" || {
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols=$export_symbols
+	      export_symbols=
+	      always_export_symbols=yes
+	    }
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs=$IFS; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS=$save_ifs
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test yes = "$try_normal_branch" \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=$output_objdir/$output_la.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs=$tmp_deplibs
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test yes = "$compiler_needs_object" &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop=$output_objdir/${outputname}x
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test yes = "$module" && test -n "$module_cmds"; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test : != "$skipped_export" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test yes = "$compiler_needs_object"; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-$k.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test -z "$objlist" ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test 1 -eq "$k"; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-$k.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-$k.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    }
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs=$IFS; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS=$save_ifs
+	      $opt_quiet || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test relink = "$opt_mode"; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS=$save_ifs
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          ${skipped_export-false} && {
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  }
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test yes = "$module" && test -n "$module_cmds"; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs=$IFS; IFS='~'
+	for cmd in $cmds; do
+	  IFS=$sp$nl
+	  eval cmd=\"$cmd\"
+	  IFS=$save_ifs
+	  $opt_quiet || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test relink = "$opt_mode"; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS=$save_ifs
+
+	# Restore the uninstalled library and exit
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test yes = "$module" || test yes = "$export_dynamic"; then
+	  # On all known operating systems, these are identical.
+	  dlname=$soname
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj=$output
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
+	else
+	  gentop=$output_objdir/${obj}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
+
+      # Create the old-style object.
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
+
+      output=$obj
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      test yes = "$build_libtool_libs" || {
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      }
+
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output=$libobj
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for programs"
+
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test CXX = "$tagname"; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	-Wl,-pthread)
+	  func_append new_libs " $deplib" ;;
+	-Wl,*)
+	  func_stripname -Wl, '' "$deplib"
+	  func_append new_libs " $wl$func_stripname_result"
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs=$new_libs
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath=$rpath
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath=$rpath
+
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=:
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=false
+        ;;
+      *cygwin* | *mingw* )
+        test yes = "$build_libtool_libs" || wrappers_required=false
+        ;;
+      *)
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
+        fi
+        ;;
+      esac
+      $wrappers_required || {
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command=$compile_command$compile_rpath
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
+	fi
+
+	exit $exit_status
+      }
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test yes = "$no_install"; then
+	# We don't need to create a wrapper script.
+	link_command=$compile_var$compile_command$compile_rpath
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host"; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
+	  build_libtool_libs=no
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
+
+      if test -n "$addlibs"; then
+	gentop=$output_objdir/${outputname}x
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase=$func_basename_result
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj"; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test -z "$oldobjs"; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test yes = "$build_old_libs" && old_library=$libname.$libext
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test yes = "$hardcode_automatic"; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test yes = "$installed"; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output=$output_objdir/${outputname}i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name=$func_basename_result
+		func_resolve_sysroot "$deplib"
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs=$newdependency_libs
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles=$newdlprefiles
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles=$newdlprefiles
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test -n "$bindir"; then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result/$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that cannot go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test no,yes = "$installed,$need_relink"; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $debug_cmd
+
+    RM=$nonopt
+    files=
+    rmforce=false
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=: ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
+      else
+	odir=$dir/$objdir
+      fi
+      func_basename "$file"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test clean = "$opt_mode"; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif $rmforce; then
+	continue
+      fi
+
+      rmfiles=$file
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case $opt_mode in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" && test none != "$pic_object"; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test clean = "$opt_mode"; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the $objdir's in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
+
+test -z "$opt_mode" && {
+  help=$generic_help
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode '$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# where we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/config/missing b/config/missing
new file mode 100755
index 000000000..625aeb118
--- /dev/null
+++ b/config/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config/py-compile b/config/py-compile
new file mode 100755
index 000000000..9f8baf7ab
--- /dev/null
+++ b/config/py-compile
@@ -0,0 +1,170 @@
+#!/bin/sh
+# py-compile - Compile a Python program
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2000-2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if [ -z "$PYTHON" ]; then
+  PYTHON=python
+fi
+
+me=py-compile
+
+usage_error ()
+{
+  echo "$me: $*" >&2
+  echo "Try '$me --help' for more information." >&2
+  exit 1
+}
+
+basedir=
+destdir=
+while test $# -ne 0; do
+  case "$1" in
+    --basedir)
+      if test $# -lt 2; then
+        usage_error "option '--basedir' requires an argument"
+      else
+        basedir=$2
+      fi
+      shift
+      ;;
+    --destdir)
+      if test $# -lt 2; then
+        usage_error "option '--destdir' requires an argument"
+      else
+        destdir=$2
+      fi
+      shift
+      ;;
+    -h|--help)
+      cat <<\EOF
+Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."
+
+Byte compile some python scripts FILES.  Use --destdir to specify any
+leading directory path to the FILES that you don't want to include in the
+byte compiled file.  Specify --basedir for any additional path information you
+do want to be shown in the byte compiled file.
+
+Example:
+  py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+      exit $?
+      ;;
+    -v|--version)
+      echo "$me $scriptversion"
+      exit $?
+      ;;
+    --)
+      shift
+      break
+      ;;
+    -*)
+      usage_error "unrecognized option '$1'"
+      ;;
+    *)
+      break
+      ;;
+  esac
+  shift
+done
+
+files=$*
+if test -z "$files"; then
+    usage_error "no files given"
+fi
+
+# if basedir was given, then it should be prepended to filenames before
+# byte compilation.
+if [ -z "$basedir" ]; then
+    pathtrans="path = file"
+else
+    pathtrans="path = os.path.join('$basedir', file)"
+fi
+
+# if destdir was given, then it needs to be prepended to the filename to
+# byte compile but not go into the compiled file.
+if [ -z "$destdir" ]; then
+    filetrans="filepath = path"
+else
+    filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
+fi
+
+$PYTHON -c "
+import sys, os, py_compile, imp
+
+files = '''$files'''
+
+sys.stdout.write('Byte-compiling python modules...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+	    continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    if hasattr(imp, 'get_tag'):
+        py_compile.compile(filepath, imp.cache_from_source(filepath), path)
+    else:
+        py_compile.compile(filepath, filepath + 'c', path)
+sys.stdout.write('\n')" || exit $?
+
+# this will fail for python < 1.5, but that doesn't matter ...
+$PYTHON -O -c "
+import sys, os, py_compile, imp
+
+# pypy does not use .pyo optimization
+if hasattr(sys, 'pypy_translation_info'):
+    sys.exit(0)
+
+files = '''$files'''
+sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+	    continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    if hasattr(imp, 'get_tag'):
+        py_compile.compile(filepath, imp.cache_from_source(filepath, False), path)
+    else:
+        py_compile.compile(filepath, filepath + 'o', path)
+sys.stdout.write('\n')" 2>/dev/null || :
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/config/test-driver b/config/test-driver
new file mode 100755
index 000000000..b8521a482
--- /dev/null
+++ b/config/test-driver
@@ -0,0 +1,148 @@
+#! /bin/sh
+# test-driver - basic testsuite driver script.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+# Make unconditional expansion of undefined variables an error.  This
+# helps a lot in preventing typo-related bugs.
+set -u
+
+usage_error ()
+{
+  echo "$0: $*" >&2
+  print_usage >&2
+  exit 2
+}
+
+print_usage ()
+{
+  cat <<END
+Usage:
+  test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
+              [--expect-failure={yes|no}] [--color-tests={yes|no}]
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
+The '--test-name', '--log-file' and '--trs-file' options are mandatory.
+END
+}
+
+test_name= # Used for reporting.
+log_file=  # Where to save the output of the test script.
+trs_file=  # Where to save the metadata of the test run.
+expect_failure=no
+color_tests=no
+enable_hard_errors=yes
+while test $# -gt 0; do
+  case $1 in
+  --help) print_usage; exit $?;;
+  --version) echo "test-driver $scriptversion"; exit $?;;
+  --test-name) test_name=$2; shift;;
+  --log-file) log_file=$2; shift;;
+  --trs-file) trs_file=$2; shift;;
+  --color-tests) color_tests=$2; shift;;
+  --expect-failure) expect_failure=$2; shift;;
+  --enable-hard-errors) enable_hard_errors=$2; shift;;
+  --) shift; break;;
+  -*) usage_error "invalid option: '$1'";;
+   *) break;;
+  esac
+  shift
+done
+
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
+if test $color_tests = yes; then
+  # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
+  red='' # Red.
+  grn='' # Green.
+  lgn='' # Light green.
+  blu='' # Blue.
+  mgn='' # Magenta.
+  std=''     # No color.
+else
+  red= grn= lgn= blu= mgn= std=
+fi
+
+do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
+trap "st=129; $do_exit" 1
+trap "st=130; $do_exit" 2
+trap "st=141; $do_exit" 13
+trap "st=143; $do_exit" 15
+
+# Test script is run here.
+"$@" >$log_file 2>&1
+estatus=$?
+
+if test $enable_hard_errors = no && test $estatus -eq 99; then
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
+fi
+
+case $tweaked_estatus:$expect_failure in
+  0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
+  0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
+  77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
+  99:*)  col=$mgn res=ERROR recheck=yes gcopy=yes;;
+  *:yes) col=$lgn res=XFAIL recheck=no  gcopy=yes;;
+  *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
+esac
+
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
+# Report outcome to console.
+echo "${col}${res}${std}: $test_name"
+
+# Register the test result, and other relevant metadata.
+echo ":test-result: $res" > $trs_file
+echo ":global-test-result: $res" >> $trs_file
+echo ":recheck: $recheck" >> $trs_file
+echo ":copy-in-global-log: $gcopy" >> $trs_file
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/configure b/configure
new file mode 100755
index 000000000..fb99918e2
--- /dev/null
+++ b/configure
@@ -0,0 +1,38347 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for cdi 2.4.3.
+#
+# Report bugs to <https://mpimet.mpg.de/cdi>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and
+$0: https://mpimet.mpg.de/cdi about your system, including
+$0: any error possibly output before this message. Then
+$0: install a modern shell, or manually run the script
+$0: under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+as_awk_strverscmp='
+  # Use only awk features that work with 7th edition Unix awk (1978).
+  # My, what an old awk you have, Mr. Solaris!
+  END {
+    while (length(v1) && length(v2)) {
+      # Set d1 to be the next thing to compare from v1, and likewise for d2.
+      # Normally this is a single character, but if v1 and v2 contain digits,
+      # compare them as integers and fractions as strverscmp does.
+      if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) {
+	# Split v1 and v2 into their leading digit string components d1 and d2,
+	# and advance v1 and v2 past the leading digit strings.
+	for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue
+	for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue
+	d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1)
+	d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1)
+	if (d1 ~ /^0/) {
+	  if (d2 ~ /^0/) {
+	    # Compare two fractions.
+	    while (d1 ~ /^0/ && d2 ~ /^0/) {
+	      d1 = substr(d1, 2); len1--
+	      d2 = substr(d2, 2); len2--
+	    }
+	    if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) {
+	      # The two components differ in length, and the common prefix
+	      # contains only leading zeros.  Consider the longer to be less.
+	      d1 = -len1
+	      d2 = -len2
+	    } else {
+	      # Otherwise, compare as strings.
+	      d1 = "x" d1
+	      d2 = "x" d2
+	    }
+	  } else {
+	    # A fraction is less than an integer.
+	    exit 1
+	  }
+	} else {
+	  if (d2 ~ /^0/) {
+	    # An integer is greater than a fraction.
+	    exit 2
+	  } else {
+	    # Compare two integers.
+	    d1 += 0
+	    d2 += 0
+	  }
+	}
+      } else {
+	# The normal case, without worrying about digits.
+	d1 = substr(v1, 1, 1); v1 = substr(v1, 2)
+	d2 = substr(v2, 1, 1); v2 = substr(v2, 2)
+      }
+      if (d1 < d2) exit 1
+      if (d1 > d2) exit 2
+    }
+    # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10),
+    # which mishandles some comparisons of empty strings to integers.
+    if (length(v2)) exit 1
+    if (length(v1)) exit 2
+  }
+'
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='cdi'
+PACKAGE_TARNAME='cdi'
+PACKAGE_VERSION='2.4.3'
+PACKAGE_STRING='cdi 2.4.3'
+PACKAGE_BUGREPORT='https://mpimet.mpg.de/cdi'
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+ENABLE_PYTHON_INTERFACE
+ENABLE_RUBY_INTERFACE
+HAVE_PARALLEL_NC4
+ENABLE_MPI
+BUILD_F77
+BUILD_FC
+BUILD_CXX
+BUILD_CC
+BUILD_MPI_FC_LIB
+BUILD_MPI_C_LIB
+BUILD_LIBS
+BUILD_LDFLAGS
+BUILD_FCFLAGS
+BUILD_CFLAGS
+with_example_programs_FALSE
+with_example_programs_TRUE
+with_concurrent_mpi_checks_FALSE
+with_concurrent_mpi_checks_TRUE
+with_on_demand_check_programs_FALSE
+with_on_demand_check_programs_TRUE
+ENABLE_PYTHON_INTERFACE_FALSE
+ENABLE_PYTHON_INTERFACE_TRUE
+PYTHON_EXTRA_LDFLAGS
+PYTHON_EXTRA_LIBS
+PYTHON_PLATFORM_SITE_PKG
+PYTHON_SITE_PKG
+PYTHON_LIBS
+PYTHON_CPPFLAGS
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_PLATFORM
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_VERSION
+PYTHON
+ENABLE_RUBY_INTERFACE_FALSE
+ENABLE_RUBY_INTERFACE_TRUE
+RUBY
+SWIG
+HAVE_PARALLEL_NC4_FALSE
+HAVE_PARALLEL_NC4_TRUE
+ENABLE_MPI_FALSE
+ENABLE_MPI_TRUE
+BUILD_PIO_FC_PROGRAMS_FALSE
+BUILD_PIO_FC_PROGRAMS_TRUE
+LIBRT
+PPM_CORE_C_LIB
+PPM_CORE_C_INCLUDE
+YAXT_FC_LIB
+YAXT_FC_MOD
+YAXT_C_LIB
+YAXT_C_INCLUDE
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
+MPI_FC_LIB
+MPI_FC_MOD
+MPI_LAUNCH
+MPI_C_LIB
+MPI_C_INCLUDE
+MPIROOT
+HAVE_PPM_DIST_ARRAY
+SYSTEM_TYPE
+ENABLE_NETCDF_FALSE
+ENABLE_NETCDF_TRUE
+ENABLE_CDI_APP_FALSE
+ENABLE_CDI_APP_TRUE
+ENABLE_HIRLAM_EXTENSIONS_FALSE
+ENABLE_HIRLAM_EXTENSIONS_TRUE
+ENABLE_ALL_STATIC_FALSE
+ENABLE_ALL_STATIC_TRUE
+ENABLE_CDI_LIB
+ENABLE_CDI_LIB_FALSE
+ENABLE_CDI_LIB_TRUE
+ENABLE_IEG
+ENABLE_EXTRA
+ENABLE_SERVICE
+ENABLE_CGRIBEX
+ENABLE_ACROSS
+ENABLE_GRIB
+HAVE_LIBGRIB_API_FALSE
+HAVE_LIBGRIB_API_TRUE
+ECCODES_LIBS
+ECCODES_INCLUDE
+NETCDF_LIBS
+NETCDF_INCLUDE
+NETCDF_ROOT
+ENABLE_NC4SZLIB
+ENABLE_NC4HDF5
+ENABLE_NC4
+ENABLE_NC2
+ENABLE_NETCDF
+NC_CONFIG
+SZLIB_LIBS
+SZLIB_INCLUDE
+FDB5_LIBS
+FDB5_INCLUDE
+THREADS_LIBS
+THREADS_INCLUDE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CXX
+PTHREAD_CC
+ax_pthread_config
+UUID_C_LIB
+UUID_C_INCLUDE
+DCE_UUID_C_LIB
+DCE_UUID_C_INCLUDE
+DCE_UUIDROOT
+OSSP_UUID_C_LIB
+OSSP_UUID_C_INCLUDE
+OSSP_UUIDROOT
+UTIL_LINUX_UUID_C_LIB
+UTIL_LINUX_UUID_C_INCLUDE
+UTIL_LINUX_UUIDROOT
+LIBOBJS
+CXXCPP
+CPP
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+OPENMP_CFLAGS
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+ENABLE_CF_INTERFACE_FALSE
+ENABLE_CF_INTERFACE_TRUE
+ac_ct_F77
+FFLAGS
+F77
+BUILD_FC_PROGRAMS_FALSE
+BUILD_FC_PROGRAMS_TRUE
+FC_MOD_UPPERCASE_FALSE
+FC_MOD_UPPERCASE_TRUE
+FC_DEFINE
+FCMODCASE
+FCMODEXT
+FC_OPTINC
+FC_MOD_FLAG
+FCFLAGS_f90
+ac_ct_FC
+FCFLAGS
+FC
+ENABLE_ISOC_INTERFACE_FALSE
+ENABLE_ISOC_INTERFACE_TRUE
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_maintainer_mode
+enable_dependency_tracking
+enable_mpi
+enable_iso_c_interface
+enable_cf_interface
+enable_ruby_interface
+enable_python_interface
+enable_openmp
+with_pic
+enable_shared
+enable_static
+enable_fast_install
+with_aix_soname
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+enable_largefile
+enable_util_linux_uuid
+enable_ossp_uuid
+enable_dce_uuid
+with_util_linux_uuid
+with_ossp_uuid
+with_dce_uuid
+with_util_linux_uuid_root
+with_util_linux_uuid_include
+with_util_linux_uuid_lib
+with_ossp_uuid_root
+with_ossp_uuid_include
+with_ossp_uuid_lib
+with_dce_uuid_root
+with_dce_uuid_include
+with_dce_uuid_lib
+with_threads
+with_fdb5
+with_szlib
+with_netcdf
+with_eccodes
+enable_grib
+enable_across
+enable_cgribex
+enable_service
+enable_extra
+enable_ieg
+enable_all_static
+enable_hirlam_extensions
+enable_cdi_app
+enable_ppm_dist_array
+with_mpi_root
+with_mpi_include
+with_mpi_lib
+with_mpi_fc_mod
+with_mpi_fc_lib
+with_on_demand_check_programs
+with_concurrent_mpi_checks
+with_example_programs
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+FC
+FCFLAGS
+FCMODEXT
+F77
+FFLAGS
+CXX
+CXXFLAGS
+CCC
+LT_SYS_LIBRARY_PATH
+CPP
+CXXCPP
+UTIL_LINUX_UUID_C_INCLUDE
+UTIL_LINUX_UUID_C_LIB
+OSSP_UUID_C_INCLUDE
+OSSP_UUID_C_LIB
+DCE_UUID_C_INCLUDE
+DCE_UUID_C_LIB
+MPI_C_INCLUDE
+MPI_C_LIB
+MPI_LAUNCH
+MPI_FC_MOD
+MPI_FC_LIB
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR
+YAXT_C_INCLUDE
+YAXT_C_LIB
+YAXT_FC_MOD
+YAXT_FC_LIB
+PPM_CORE_C_INCLUDE
+PPM_CORE_C_LIB
+RUBY
+PYTHON
+PYTHON_VERSION
+BUILD_CFLAGS
+BUILD_FCFLAGS
+BUILD_LDFLAGS
+BUILD_LIBS
+BUILD_MPI_C_LIB
+BUILD_MPI_FC_LIB
+BUILD_CC
+BUILD_CXX
+BUILD_FC
+BUILD_F77'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures cdi 2.4.3 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/cdi]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of cdi 2.4.3:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --disable-maintainer-mode
+                          disable make rules and dependencies not useful (and
+                          sometimes confusing) to the casual installer
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --enable-mpi            enable parallel I/O with MPI [default=no]
+  --enable-iso-c-interface
+                          create Fortran 90 interface using Fortran 2003
+                          ISO_C_BINDING facility [default=no]
+  --enable-cf-interface   create Fortran 77 interface using cfortran.h
+                          [default=auto]
+  --enable-ruby-interface create Ruby language interface (EXPERIMENTAL)
+                          [default=no]
+  --enable-python-interface
+                          create Python language interface (EXPERIMENTAL)
+                          [default=no]
+  --enable-openmp         enable OpenMP support [default=no]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+  --disable-largefile     omit support for large files
+  --disable-util-linux-uuid
+                          Do not test for the util-linux UUID library, use
+                          OSSP or DCE versions instead
+  --disable-ossp-uuid     Do not test for the OSSP UUID library, use
+                          util-linux or DCE versions instead
+  --disable-dce-uuid      Do not test for the DCE UUID library, use util-linux
+                          or OSSP versions instead
+  --enable-grib           GRIB support [default=yes]
+  --enable-across         ACROSS support [default=yes]
+  --enable-cgribex        Use the CGRIBEX library [default=yes]
+  --enable-service        Use the service library [default=yes]
+  --enable-extra          Use the extra library [default=yes]
+  --enable-ieg            Use the ieg library [default=yes]
+  --enable-all-static     build a completely statically linked CDO binary
+                          [default=no]
+  --enable-hirlam-extensions
+                          HIRLAM extensions [default=no]
+  --enable-cdi-app        build and install CDI application [default=yes]
+  --enable-ppm-dist-array enable usage of the PPM distributed array
+                          [default=auto]
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
+  --with-util-linux-uuid[=yes|no|directory>]
+                          Use util-linux UUID library, do not test for OSSP
+                          UUID library.
+  --with-ossp-uuid[=yes|no|directory>]
+                          Use OSSP UUID library, do not test for the
+                          util-linux UUID library.
+  --with-dce-uuid[=yes|no|directory>]
+                          Use DCE UUID library, do not test for the util-linux
+                          UUID library.
+  --with-util-linux-uuid-root
+                          set directory to search for util-linux-uuid headers
+                          and library
+  --with-util-linux-uuid-include
+                          specifically set directory to search for
+                          util-linux-uuid headers,
+                          [default=$with_util_linux_uuid_root/include]
+  --with-util-linux-uuid-lib
+                          specifically set directory to search for
+                          util-linux-uuid library,
+                          [default=$with_util_linux_uuid_root/lib]
+  --with-ossp-uuid-root   set directory to search for ossp-uuid headers and
+                          library
+  --with-ossp-uuid-include
+                          specifically set directory to search for ossp-uuid
+                          headers, [default=$with_ossp_uuid_root/include]
+  --with-ossp-uuid-lib    specifically set directory to search for ossp-uuid
+                          library, [default=$with_ossp_uuid_root/lib]
+  --with-dce-uuid-root    set directory to search for dce-uuid headers and
+                          library
+  --with-dce-uuid-include specifically set directory to search for dce-uuid
+                          headers, [default=$with_dce_uuid_root/include]
+  --with-dce-uuid-lib     specifically set directory to search for dce-uuid
+                          library, [default=$with_dce_uuid_root/lib]
+  --with-threads=<yes/no/directory>
+                          Compile + link for multithreading [default=yes]
+  --with-fdb5=<yes|no|directory> (default=no)
+                          location of fdb5 library (optional)
+  --with-szlib=<yes|no|directory> (default=no)
+                          location of szlib library, optional for GRIB1 and
+                          NETCDF4 compression
+  --with-netcdf=<yes|no|directory> (default=no)
+                          location of NetCDF library (lib and include subdirs)
+  --with-eccodes=<yes|no|directory>
+                          location of ECCODES library for grib2
+                          encoding/decoding (lib and include subdirs)
+  --with-mpi-root         set directory to search for MPI headers and library
+  --with-mpi-include      specifically set directory to search for MPI
+                          headers, [default=$with_mpi_root/include]
+  --with-mpi-lib          specifically set directory to search for MPI
+                          library, [default=$with_mpi_root/lib]
+  --with-mpi-fc-mod       specifically set directory to search for MPI module,
+                          [default=$with_mpi_root/include]
+  --with-mpi-fc-lib       specifically set directory to search for MPI
+                          library, [default=$with_mpi_root/lib]
+  --with-on-demand-check-programs
+                          only build test programs when calling 'make check'
+                          [default: build during 'make all']
+  --with-concurrent-mpi-checks
+                          allow for simultaneous runs of MPI tests [default:
+                          run MPI test programs one after another]
+  --without-example-programs
+                          only build example programs when calling 'make
+                          examples' [default: build during 'make all']
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  FC          Fortran compiler command
+  FCFLAGS     Fortran compiler flags
+  FCMODEXT    file extension of compiled Fortran module files
+  F77         Fortran 77 compiler command
+  FFLAGS      Fortran 77 compiler flags
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
+  CPP         C preprocessor
+  CXXCPP      C++ preprocessor
+  UTIL_LINUX_UUID_C_INCLUDE
+              specifically set flags to use when compiling sources using
+              util-linux-uuid includes.
+  UTIL_LINUX_UUID_C_LIB
+              specifically set flags to use when linking util-linux-uuid.
+  OSSP_UUID_C_INCLUDE
+              specifically set flags to use when compiling sources using
+              ossp-uuid includes.
+  OSSP_UUID_C_LIB
+              specifically set flags to use when linking ossp-uuid.
+  DCE_UUID_C_INCLUDE
+              specifically set flags to use when compiling sources using
+              dce-uuid includes.
+  DCE_UUID_C_LIB
+              specifically set flags to use when linking dce-uuid.
+  MPI_C_INCLUDE
+              specifically set flags to use when compiling sources using MPI
+              includes.
+  MPI_C_LIB   specifically set flags to use when linking MPI.
+  MPI_LAUNCH  absolute path to launcher for MPI programs, must be working
+              unless configuring in cross-compilation mode
+  MPI_FC_MOD  flags to enable 'USE MPI' in Fortran program.
+  MPI_FC_LIB  specifically set flags to use when linking MPI.
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+  YAXT_C_INCLUDE
+              specifically set flags to use when compiling sources using YAXT
+              includes.
+  YAXT_C_LIB  specifically set flags to use when linking YAXT.
+  YAXT_FC_MOD flags to enable 'USE YAXT' in Fortran program.
+  YAXT_FC_LIB specifically set flags to use when linking YAXT.
+  PPM_CORE_C_INCLUDE
+              specifically set flags to use when compiling sources using
+              PPM_CORE includes.
+  PPM_CORE_C_LIB
+              specifically set flags to use when linking PPM_CODE.
+  RUBY        the Ruby interpreter
+  PYTHON      the Python interpreter
+  PYTHON_VERSION
+              The installed Python version to use, for example '2.3'. This
+              string will be appended to the Python interpreter canonical
+              name.
+  BUILD_CFLAGS
+              append to CFLAGS during build but not in configure phase
+  BUILD_FCFLAGS
+              append to FCFLAGS during build but not in configure phase
+  BUILD_LDFLAGS
+              append to LDFLAGS during build but not in configure phase
+  BUILD_LIBS  append to LIBS during build but not in configure phase
+  BUILD_MPI_C_LIB
+              append to MPI_C_LIB during build but not in configure phase
+  BUILD_MPI_FC_LIB
+              append to MPI_FC_LIB during build but not in configure phase
+  BUILD_CC    replace CC with expansion of $BUILD_CC during build but not in
+              configure phase
+  BUILD_CXX   replace CXX with expansion of $BUILD_CXX during build but not in
+              configure phase
+  BUILD_FC    replace FC with expansion of $BUILD_FC during build but not in
+              configure phase
+  BUILD_F77   replace F77 with expansion of $BUILD_F77 during build but not in
+              configure phase
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <https://mpimet.mpg.de/cdi>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+cdi configure 2.4.3
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_fc_try_compile LINENO
+# ---------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_compile
+
+# ac_fn_fc_try_run LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_fc_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_run
+
+# ac_fn_fc_try_link LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_link
+
+# ac_fn_f77_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_f77_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_f77_try_compile
+
+# ac_fn_f77_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_f77_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_f77_try_run
+
+# ac_fn_mv_obj LINENO FROM TO
+# ---------------------------
+# Rename FROM.$ac_objext to TO.$ac_objext, and return whether this succeeded.
+acx_fn_mv_obj ()
+{
+as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+      acx_path_from=`echo "$2" | sed -e 's!/\{0,1\}[^/]*$!!'`
+      test -z "$acx_path_from" && acx_path_from=.
+      acx_fn_from=`echo "$2" | sed -e 's@^.*/@@'`
+      acx_path_to=`echo "$3" | sed -e 's!/\{0,1\}[^/]*$!!'`
+      test -z "$acx_path_to" && acx_path_to=.
+      acx_fn_to=`echo "$3" | sed -e 's@^.*/@@'`
+      if expr "$ac_compile" : '.*/libtool --mode=compile' >/dev/null; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: Renaming object file $2.$ac_objext to $3.$ac_objext." >&5; } >&5
+  (sed 's@\(pic_object='"'\)"'\(\(.libs/\)\{0,1\}\)'"$acx_fn_from"'\.o'"'"'@\1\2'"$acx_fn_to"'.o'"'"'@' "$2.$ac_objext" >"$3.$ac_objext" && rm "$2.$ac_objext" \
+        && if test -f "$2.$OBJEXT" ; then mv "$2.$OBJEXT" "$3.$OBJEXT" ; fi \
+        && if test -f "$acx_path_from/.libs/$acx_fn_from.$OBJEXT" ; then \
+          as_dir="$acx_path_to/.libs" as_fn_mkdir_p ; \
+          mv "$acx_path_from/.libs/$acx_fn_from.$OBJEXT" \
+             "$acx_path_to/.libs/$acx_fn_to.$OBJEXT" ; fi) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: Renaming object file $2.$ac_objext to $3.$ac_objext." >&5; } >&5
+  (mv "$2.$ac_objext" "$3.$ac_objext") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+fi
+       eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+       as_fn_set_status $ac_status
+} # acx_fn_mv_obj
+
+# ac_fn_f77_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_f77_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_f77_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_f77_try_link
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by cdi $as_me 2.4.3, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+as_fn_append ac_header_list " stdlib.h"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_header_list " sys/param.h"
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define CDI "$PACKAGE_VERSION"
+_ACEOF
+
+
+ac_aux_dir=
+for ac_dir in config "$srcdir"/config; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+am__api_version='1.16'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='cdi'
+ VERSION='2.4.3'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=yes
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+   if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  case $?:`cat confinc.out 2>/dev/null` in #(
+  '0:this is the am__doit target') :
+    case $s in #(
+  BSD) :
+    am__include='.include' am__quote='"' ;; #(
+  *) :
+    am__include='include' am__quote='' ;;
+esac ;; #(
+  *) :
+     ;;
+esac
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -rf core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+	{
+	case 's': // string
+	  str = va_arg (args_copy, const char *);
+	  break;
+	case 'd': // int
+	  number = va_arg (args_copy, int);
+	  break;
+	case 'f': // float
+	  fnumber = va_arg (args_copy, double);
+	  break;
+	default:
+	  break;
+	}
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+	  || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
+if test "x$ac_cv_prog_cc_c99" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to detect C compiler flag needed to accept ISO C99
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+acx_prog_cc_posix_version_value=200112
+             acx_prog_cc_posix_version_print="POSIX.1-2001"
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking For conformance to ${acx_prog_cc_posix_version_print}." >&5
+$as_echo_n "checking For conformance to ${acx_prog_cc_posix_version_print}.... " >&6; }
+if ${acx_cv_cc_posix_support2001+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+int
+main ()
+{
+  int n[(_POSIX_VERSION >= ${acx_prog_cc_posix_version_value}L) * 2 - 1];
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_cc_posix_support2001=yes
+else
+  acx_cv_cc_posix_support2001=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cc_posix_support2001" >&5
+$as_echo "$acx_cv_cc_posix_support2001" >&6; }
+   if test "x$acx_cv_cc_posix_support2001" = xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: It seems your system does not define _POSIX_VERSION to a value
+greater-or-equal ${acx_prog_cc_posix_version_value}. This is typically the case when the
+compiler is instructed to make ISO C features available only,
+e.g. when using gcc -std=c99" >&5
+$as_echo "$as_me: It seems your system does not define _POSIX_VERSION to a value
+greater-or-equal ${acx_prog_cc_posix_version_value}. This is typically the case when the
+compiler is instructed to make ISO C features available only,
+e.g. when using gcc -std=c99" >&6;}
+      { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "${acx_prog_cc_posix_version_print} profile required
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
+if ${ac_cv_c_restrict+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_restrict=no
+   # The order here caters to the fact that C++ does not require restrict.
+   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+typedef int * int_ptr;
+	int foo (int_ptr $ac_kw ip) {
+	return ip[0];
+       }
+int
+main ()
+{
+int s[1];
+	int * $ac_kw t = s;
+	t[0] = 0;
+	return foo(t)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_restrict=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     test "$ac_cv_c_restrict" != no && break
+   done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+$as_echo "$ac_cv_c_restrict" >&6; }
+
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) $as_echo "#define restrict /**/" >>confdefs.h
+ ;;
+   *)  cat >>confdefs.h <<_ACEOF
+#define restrict $ac_cv_c_restrict
+_ACEOF
+ ;;
+ esac
+
+
+# Check whether --enable-mpi was given.
+if test "${enable_mpi+set}" = set; then :
+  enableval=$enable_mpi; test "x$enableval" != xno && enable_mpi=yes
+else
+  enable_mpi=no
+fi
+
+
+# Check whether --enable-iso-c-interface was given.
+if test "${enable_iso_c_interface+set}" = set; then :
+  enableval=$enable_iso_c_interface; test "x$enableval" != xno && enable_iso_c_interface=yes
+else
+  enable_iso_c_interface=no
+fi
+
+ if test "x$enable_iso_c_interface" = xyes; then
+  ENABLE_ISOC_INTERFACE_TRUE=
+  ENABLE_ISOC_INTERFACE_FALSE='#'
+else
+  ENABLE_ISOC_INTERFACE_TRUE='#'
+  ENABLE_ISOC_INTERFACE_FALSE=
+fi
+
+
+# Check whether --enable-cf-interface was given.
+if test "${enable_cf_interface+set}" = set; then :
+  enableval=$enable_cf_interface; if test "x$enableval" != xno && test "x$enableval" != xauto; then :
+  enable_cf_interface=yes
+fi
+else
+  enable_cf_interface=auto
+fi
+
+if test "x${enable_mpi}${enable_cf_interface}" = xnoauto; then :
+  enable_cf_interface=no
+fi
+
+if test "x$enable_iso_c_interface" = xyes || \
+   test "x$enable_cf_interface" != xno; then
+  if test "x$FC" != xno; then
+    ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$FC"; then
+  ac_cv_prog_FC="$FC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+FC=$ac_cv_prog_FC
+if test -n "$FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$FC" && break
+  done
+fi
+if test -z "$FC"; then
+  ac_ct_FC=$FC
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_FC"; then
+  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_FC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_FC=$ac_cv_prog_ac_ct_FC
+if test -n "$ac_ct_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
+$as_echo "$ac_ct_FC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_FC" && break
+done
+
+  if test "x$ac_ct_FC" = x; then
+    FC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    FC=$ac_ct_FC
+  fi
+fi
+
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
+if ${ac_cv_fc_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_fc_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
+$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FCFLAGS=${FCFLAGS+set}
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
+$as_echo_n "checking whether $FC accepts -g... " >&6; }
+if ${ac_cv_prog_fc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  FCFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_prog_fc_g=yes
+else
+  ac_cv_prog_fc_g=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
+$as_echo "$ac_cv_prog_fc_g" >&6; }
+if test "$ac_test_FCFLAGS" = set; then
+  FCFLAGS=$ac_save_FCFLAGS
+elif test $ac_cv_prog_fc_g = yes; then
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-g -O2"
+  else
+    FCFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-O2"
+  else
+    FCFLAGS=
+  fi
+fi
+
+if test $ac_compiler_gnu = yes; then
+  GFC=yes
+else
+  GFC=
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+    test -z $FC 2>/dev/null && FC=no
+
+if test "x$FC" != xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5
+$as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; }
+if ${ac_cv_fc_srcext_f90+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=f90
+ac_fcflags_srcext_save=$ac_fcflags_srcext
+ac_fcflags_srcext=
+ac_cv_fc_srcext_f90=unknown
+case $ac_ext in #(
+  [fF]77) ac_try=f77;; #(
+  *) ac_try=f95;;
+esac
+for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do
+  test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag"
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_fc_srcext_f90=$ac_flag; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest.$ac_objext conftest.f90
+ac_fcflags_srcext=$ac_fcflags_srcext_save
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5
+$as_echo "$ac_cv_fc_srcext_f90" >&6; }
+if test "x$ac_cv_fc_srcext_f90" = xunknown; then
+  FC=no
+else
+  ac_fc_srcext=f90
+  if test "x$ac_cv_fc_srcext_f90" = xnone; then
+    ac_fcflags_srcext=""
+    FCFLAGS_f90=""
+  else
+    ac_fcflags_srcext=$ac_cv_fc_srcext_f90
+    FCFLAGS_f90=$ac_cv_fc_srcext_f90
+  fi
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+    if test "x$FC" != xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler works" >&5
+$as_echo_n "checking whether the Fortran compiler works... " >&6; }
+if ${acx_cv_fc_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_fc_works=no
+          ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+          if test "$cross_compiling" = yes; then :
+  acx_cv_fc_works=yes
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_run "$LINENO"; then :
+  acx_cv_fc_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+          ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_works" >&5
+$as_echo "$acx_cv_fc_works" >&6; }
+       if test "x$acx_cv_fc_works" = xno; then :
+  FC=no
+fi
+fi
+    if test "x$FC" != xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+
+      unset acx_sl_cv_fc_mod_path_flag_fc
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flag to alter module search path" >&5
+$as_echo_n "checking for flag to alter module search path... " >&6; }
+if ${acx_sl_cv_fc_mod_path_flag_fc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  mkdir conftestdir
+      cd conftestdir
+      cat > conftest.$ac_ext <<_ACEOF
+      module cnftst
+      implicit none
+      integer, public :: i
+      end module cnftst
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+
+else
+  as_fn_error $? "Cannot compile fortran modules" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      cd ..
+      for i in -I -M -module -p; do
+        FCFLAGS_save=$FCFLAGS
+        FCFLAGS="$FCFLAGS ${i}conftestdir"
+        cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use cnftst
+      implicit none
+      i = 0
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  acx_sl_cv_fc_mod_path_flag_fc=$i ; FCFLAGS=$FCFLAGS_save ; break
+else
+  :
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        FCFLAGS=$FCFLAGS_save
+      done
+      FCFLAGS=$FCFLAGS_save
+      rm -rf conftestdir
+      if ${acx_sl_cv_fc_mod_path_flag_fc+:} false; then :
+          :
+else
+          FC_MOD_FLAG=-I
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_sl_cv_fc_mod_path_flag_fc" >&5
+$as_echo "$acx_sl_cv_fc_mod_path_flag_fc" >&6; }
+   FC_MOD_FLAG=$acx_sl_cv_fc_mod_path_flag_fc
+
+
+             { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler flag needed to specify search paths for the \"INCLUDE\" statement" >&5
+$as_echo_n "checking for Fortran compiler flag needed to specify search paths for the \"INCLUDE\" statement... " >&6; }
+if ${acx_cv_fc_ftn_include_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_fc_ftn_include_flag=unknown
+      as_dir=conftest.dir; as_fn_mkdir_p
+      cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+      mv conftest.$ac_ext conftest.dir/conftest.inc
+      cat > conftest.$ac_ext <<_ACEOF
+      include "conftest.inc"
+_ACEOF
+      acx_save_FCFLAGS=$FCFLAGS
+      for acx_flag in -I '-I '; do
+        FCFLAGS="$acx_save_FCFLAGS ${acx_flag}conftest.dir"
+        if ac_fn_fc_try_link "$LINENO"; then :
+  acx_cv_fc_ftn_include_flag=$acx_flag
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+        test "x$acx_cv_fc_ftn_include_flag" != xunknown && break
+      done
+      FCFLAGS=$acx_save_FCFLAGS
+      rm -rf conftest.$ac_ext conftest.dir
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_ftn_include_flag" >&5
+$as_echo "$acx_cv_fc_ftn_include_flag" >&6; }
+   if test "x$acx_cv_fc_ftn_include_flag" = xunknown; then :
+  FC_OPTINC=-I
+else
+  FC_OPTINC=$acx_cv_fc_ftn_include_flag
+
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for conftest_module module file name" >&5
+$as_echo_n "checking for conftest_module module file name... " >&6; }
+if ${acx_cv_fc_mod_name+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+      cat > conftest.$ac_ext <<_ACEOF
+      module conftest_module
+      implicit none
+      integer :: i
+      end module conftest_module
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   while :; do
+     acx_cv_fc_mod_name=
+   if test -n "conftest_module.$FCMODEXT" -a -f "conftest_module.$FCMODEXT"; then :
+  acx_cv_fc_mod_name="conftest_module.$FCMODEXT" ; break
+fi
+     if test -n "conftest_module.mod" -a -f "conftest_module.mod"; then :
+  acx_cv_fc_mod_name="conftest_module.mod" ; break
+fi
+     if test -n "conftest_module.MOD" -a -f "conftest_module.MOD"; then :
+  acx_cv_fc_mod_name="conftest_module.MOD" ; break
+fi
+     if test -n "conftest_module.M" -a -f "conftest_module.M"; then :
+  acx_cv_fc_mod_name="conftest_module.M" ; break
+fi
+     if test -n "CONFTEST_MODULE.MOD" -a -f "CONFTEST_MODULE.MOD"; then :
+  acx_cv_fc_mod_name="CONFTEST_MODULE.MOD" ; break
+fi
+     if test -n "CONFTEST_MODULE.mod" -a -f "CONFTEST_MODULE.mod"; then :
+  acx_cv_fc_mod_name="CONFTEST_MODULE.mod" ; break
+fi
+
+     break
+   done
+   rm -f conftest_module* CONFTEST_MODULE*
+   if expr "$ac_compile" : '.*/libtool --mode=compile' >/dev/null; then :
+  if test -n "$objdir"; then :
+  rm -f "$objdir"/conftest_module* "$objdir"/CONFTEST_MODULE*
+fi
+fi
+   ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_mod_name" >&5
+$as_echo "$acx_cv_fc_mod_name" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of module files" >&5
+$as_echo_n "checking for suffix of module files... " >&6; }
+   ac_fc_mod_uppercase=no
+   case $acx_cv_fc_mod_name in #(
+  conftest_module.$FCMODEXT) :
+    : ;; #(
+  CONFTEST_MODULE.$FCMODEXT) :
+    ac_fc_mod_uppercase=yes ;; #(
+  conftest_module.mod) :
+    FCMODEXT=mod ;; #(
+  conftest_module.MOD) :
+    FCMODEXT=MOD ;; #(
+  conftest_module.M) :
+    FCMODEXT=M ;; #(
+  CONFTEST_MODULE.MOD) :
+    FCMODEXT=MOD ; ac_fc_mod_uppercase=yes ;; #(
+  CONFTEST_MODULE.mod) :
+    FCMODEXT=mod ; ac_fc_mod_uppercase=yes ;; #(
+  *) :
+     ;;
+esac
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${FCMODEXT-not found}" >&5
+$as_echo "${FCMODEXT-not found}" >&6; }
+   ${FCMODEXT+:} false
+   if test $ac_fc_mod_uppercase = yes; then :
+  FCMODCASE=uc
+      { $as_echo "$as_me:${as_lineno-$LINENO}: Fortran module filenames are uppercase." >&5
+$as_echo "$as_me: Fortran module filenames are uppercase." >&6;}
+else
+  FCMODCASE=lc
+fi
+
+
+
+              saved_ac_fc_srcext=$ac_fc_srcext
+       ac_fc_srcext='F90'
+       ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_fc_pp_define_srcext_save=$ac_fc_srcext
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to define symbols for preprocessed Fortran" >&5
+$as_echo_n "checking how to define symbols for preprocessed Fortran... " >&6; }
+if ${ac_cv_fc_pp_define+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_fc_pp_define_srcext_save=$ac_fc_srcext
+ac_cv_fc_pp_define=unknown
+ac_fc_pp_define_FCFLAGS_save=$FCFLAGS
+for ac_flag in -D -WF,-D -Wp,-D -Wc,-D
+do
+  FCFLAGS="$ac_fc_pp_define_FCFLAGS_save ${ac_flag}FOOBAR ${ac_flag}ZORK=42"
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+#ifndef FOOBAR
+      choke me
+#endif
+#if ZORK != 42
+      choke me
+#endif
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_fc_pp_define=$ac_flag
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test x"$ac_cv_fc_pp_define" != xunknown && break
+done
+FCFLAGS=$ac_fc_pp_define_FCFLAGS_save
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_define" >&5
+$as_echo "$ac_cv_fc_pp_define" >&6; }
+ac_fc_srcext=$ac_fc_pp_define_srcext_save
+if test "x$ac_cv_fc_pp_define" = xunknown; then
+  FC_DEFINE=
+  FC_DEFINE=-D
+else
+  FC_DEFINE=$ac_cv_fc_pp_define
+
+fi
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+       ac_fc_srcext=$saved_ac_fc_srcext
+
+       ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+  fi
+else
+  FC=no
+fi
+ if test "x$FCMODCASE" = xuc; then
+  FC_MOD_UPPERCASE_TRUE=
+  FC_MOD_UPPERCASE_FALSE='#'
+else
+  FC_MOD_UPPERCASE_TRUE='#'
+  FC_MOD_UPPERCASE_FALSE=
+fi
+
+if test "x$enable_iso_c_interface" = xyes; then :
+  if test "x$FC" != xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler can handle complex CHARACTER interoperability" >&5
+$as_echo_n "checking if Fortran compiler can handle complex CHARACTER interoperability... " >&6; }
+   cat > conftest.$ac_ext <<_ACEOF
+module conftest_mod
+  use iso_c_binding
+  implicit none
+  private
+  public :: errstr
+contains
+  function errstr(errno)
+    integer, intent(in) :: errno
+    interface
+      function strerror(errno) bind(c, name='strerror')
+        import :: c_int, c_ptr
+        integer(c_int), value, intent(in) :: errno
+        type(c_ptr) :: strerror
+      end function strerror
+      function strlen(s) bind(c, name='strlen')
+        import :: c_ptr, c_size_t
+        type(c_ptr), value, intent(in) :: s
+        integer(c_size_t) :: strlen
+      end function strlen
+    end interface
+    type(c_ptr) :: cptr
+    character(kind=c_char), dimension(:), pointer :: buf
+    character(len=:), pointer :: errstr
+    integer :: i, rv_shape(1)
+
+    cptr = strerror(int(errno, c_int))
+    rv_shape(1) = int(strlen(cptr))
+    call c_f_pointer(cptr, buf, rv_shape)
+    allocate(character(rv_shape(1)) :: errstr)
+    do i = 1, rv_shape(1)
+      errstr(i:i) = buf(i)
+    end do
+  end function errstr
+end module conftest_mod
+
+program conftest
+  use conftest_mod, only: errstr
+  implicit none
+  character(len=:), pointer :: msg
+  msg => errstr(42)
+  write (0, '(a)') msg
+end program conftest
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+FC=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   rm -f conftest_mod* CONFTEST_MOD*
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+   if test "x$FC" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "the Fortran 2003 interface is requested but the Fortran compiler is disabled, missing or lacks the required features
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+fi
+ if test "x$FC" != xno; then
+  BUILD_FC_PROGRAMS_TRUE=
+  BUILD_FC_PROGRAMS_FALSE='#'
+else
+  BUILD_FC_PROGRAMS_TRUE='#'
+  BUILD_FC_PROGRAMS_FALSE=
+fi
+
+
+if test "x$enable_cf_interface" != xno; then
+  if test -n "$F77" && test "x$F77" != xno; then :
+  requested_F77=yes
+else
+  requested_F77=no
+fi
+  if test "x$FC" = xno || test "x$requested_F77" = xyes; then
+    ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$F77"; then
+  ac_cv_prog_F77="$F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $F77" >&5
+$as_echo "$F77" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$F77" && break
+  done
+fi
+if test -z "$F77"; then
+  ac_ct_F77=$F77
+  for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_F77"; then
+  ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_F77="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5
+$as_echo "$ac_ct_F77" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_F77" && break
+done
+
+  if test "x$ac_ct_F77" = x; then
+    F77=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    F77=$ac_ct_F77
+  fi
+fi
+
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; }
+if ${ac_cv_f77_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
+
+      end
+_ACEOF
+if ac_fn_f77_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5
+$as_echo "$ac_cv_f77_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5
+$as_echo_n "checking whether $F77 accepts -g... " >&6; }
+if ${ac_cv_prog_f77_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  FFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_compile "$LINENO"; then :
+  ac_cv_prog_f77_g=yes
+else
+  ac_cv_prog_f77_g=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5
+$as_echo "$ac_cv_prog_f77_g" >&6; }
+if test "$ac_test_FFLAGS" = set; then
+  FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-g -O2"
+  else
+    FFLAGS="-g"
+  fi
+else
+  if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+    FFLAGS="-O2"
+  else
+    FFLAGS=
+  fi
+fi
+
+if test $ac_compiler_gnu = yes; then
+  G77=yes
+else
+  G77=
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+    test -z $F77 2>/dev/null && F77=no
+
+if test "x$F77" != xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler works" >&5
+$as_echo_n "checking whether the Fortran 77 compiler works... " >&6; }
+if ${acx_cv_f77_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_f77_works=no
+          ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+          if test "$cross_compiling" = yes; then :
+  acx_cv_f77_works=yes
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_run "$LINENO"; then :
+  acx_cv_f77_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+          ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_f77_works" >&5
+$as_echo "$acx_cv_f77_works" >&6; }
+       if test "x$acx_cv_f77_works" = xno; then :
+  F77=no
+fi
+fi
+  else
+    F77=no
+  fi
+  if test "x$F77" = xno && test "x$requested_F77" = xyes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "the explicitly requested Fortran 77 compiler is missing or lacks the required features
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+  { requested_F77=; unset requested_F77;}
+else
+  F77=no
+fi
+if test "x$enable_cf_interface" != xno; then :
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking C preprocessor flags for Fortran calling convention cfortran.h" >&5
+$as_echo_n "checking C preprocessor flags for Fortran calling convention cfortran.h... " >&6; }
+if ${acx_cv_cf_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_cf_flag=''
+      acx_temp=`echo " $CPPFLAGS $CFLAGS " | sed -n '/ -DpgiFortran/{
+x
+s/$/ -DpgiFortran/
+x
+}
+/ -DNAGf90Fortran/{
+x
+s/$/ -DNAGf90Fortran/
+x
+}
+/ -Df2cFortran/{
+x
+s/$/ -Df2cFortran/
+x
+}
+/ -DhpuxFortran/{
+x
+s/$/ -DhpuxFortran/
+x
+}
+/ -DapolloFortran/{
+x
+s/$/ -DapolloFortran/
+x
+}
+/ -DsunFortran/{
+x
+s/$/ -DsunFortran/
+x
+}
+/ -DIBMR2Fortran/{
+x
+s/$/ -DIBMR2Fortran/
+x
+}
+/ -DCRAYFortran/{
+x
+s/$/ -DCRAYFortran/
+x
+}
+/ -DPATHSCALE_COMPILER/{
+x
+s/$/ -DPATHSCALE_COMPILER/
+x
+}
+/ -DgFortran/{
+x
+s/$/ -DgFortran/
+x
+}
+/ -DmipsFortran/{
+x
+s/$/ -DmipsFortran/
+x
+}
+/ -DDECFortran/{
+x
+s/$/ -DDECFortran/
+x
+}
+/ -DvmsFortran/{
+x
+s/$/ -DvmsFortran/
+x
+}
+/ -DCONVEXFortran/{
+x
+s/$/ -DCONVEXFortran/
+x
+}
+/ -DPowerStationFortran/{
+x
+s/$/ -DPowerStationFortran/
+x
+}
+/ -DAbsoftUNIXFortran/{
+x
+s/$/ -DAbsoftUNIXFortran/
+x
+}
+/ -DAbsoftProFortran/{
+x
+s/$/ -DAbsoftProFortran/
+x
+}
+/ -DSXFortran/{
+x
+s/$/ -DSXFortran/
+x
+}
+x
+s/^ //
+p'`
+      case $acx_temp in #(
+  -D*\ -D*) :
+    acx_failure_msg="multiple specification of cfortran.h flags: $acx_temp"
+         acx_cv_cf_flag='error' ;; #(
+  -D*) :
+    acx_cv_cf_flag="$acx_temp (user-specified)" ;; #(
+  *) :
+            if test -n "$FC" -a X"$FC" != Xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+
+
+         case $host in #(
+  x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) :
+    case `$FC -V 2>&1 | sed -n 1,10p` in #(
+  *NAG\ Fortran\ Compiler\ Release*) :
+    acx_cv_fc_cf_flag=-DNAGf90Fortran ;; #(
+  *Copyright*The\ Portland\ Group*|*Copyright*NVIDIA\ CORPORATION*|*Intel\(R\)\ Fortran*Compiler*|*Cray\ Fortran*) :
+    acx_cv_fc_cf_flag=-DgFortran ;; #(
+  *) :
+    case `$FC --version 2>&1 | sed -n 1,5p` in #(
+  *G95*) :
+    acx_cv_fc_cf_flag=-DNAGf90Fortran ;; #(
+  *GNU\ Fortran*g77*) :
+    acx_cv_fc_cf_flag=-Dg77Fortran ;; #(
+  *GNU\ Fortran*) :
+                case " $FCFLAGS " in #(
+  *\ -ff2c\ *) :
+    acx_cv_fc_cf_flag=-Df2cFortran ;; #(
+  *) :
+    acx_cv_fc_cf_flag=-DgFortran
+               acx_temp=`$FC --version 2>&1 | sed -n -e '/^GNU Fortran/{' \
+                  -e 's/^GNU Fortran\( ([^)]*)\)\{0,1\} \([0-9.]*\)\( .*\)\{0,1\}/\2/;p;}'`
+               as_arg_v1=$acx_temp
+as_arg_v2=7
+awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null
+case $? in #(
+  1) :
+     ;; #(
+  0) :
+     ;; #(
+  2) :
+    acx_cv_fc_cf_flag="-DgFortran -DgFortran8" ;; #(
+  *) :
+     ;;
+esac ;;
+esac ;; #(
+  *) :
+    case `$FC -v 2>&1 | sed -n 1,5p` in #(
+  *f2c*) :
+    acx_cv_fc_cf_flag=-Df2cFortran ;; #(
+  *) :
+     ;;
+esac ;;
+esac ;;
+esac ;; #(
+  powerpc64-*-linux-*|powerpc-*-linux-*) :
+    if $FC -qversion 2>&1 | sed 5q | grep '^IBM XL Fortran' >/dev/null; then :
+  acx_cv_fc_cf_flag=-DIBMR2Fortran
+fi ;; #(
+  *-ibm-aix*) :
+          if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null; then :
+
+else
+           acx_cv_fc_cf_flag=-DIBMR2Fortran
+fi
+      ;; #(
+  *-*-hpux*) :
+    acx_cv_fc_cf_flag=-DhpuxFortran ;; #(
+  sx*-*-*|es*-*-*) :
+          acx_cv_fc_cf_flag=-DSXFortran ;; #(
+  *) :
+     ;;
+esac
+
+
+               ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+         if test -n "$F77" -a X"$F77" != Xno; then :
+  ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+
+
+         case $host in #(
+  x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) :
+    case `$F77 -V 2>&1 | sed -n 1,10p` in #(
+  *NAG\ Fortran\ Compiler\ Release*) :
+    acx_cv_f77_cf_flag=-DNAGf90Fortran ;; #(
+  *Copyright*The\ Portland\ Group*|*Copyright*NVIDIA\ CORPORATION*|*Intel\(R\)\ Fortran*Compiler*|*Cray\ Fortran*) :
+    acx_cv_f77_cf_flag=-DgFortran ;; #(
+  *) :
+    case `$F77 --version 2>&1 | sed -n 1,5p` in #(
+  *G95*) :
+    acx_cv_f77_cf_flag=-DNAGf90Fortran ;; #(
+  *GNU\ Fortran*g77*) :
+    acx_cv_f77_cf_flag=-Dg77Fortran ;; #(
+  *GNU\ Fortran*) :
+                case " $FFLAGS " in #(
+  *\ -ff2c\ *) :
+    acx_cv_f77_cf_flag=-Df2cFortran ;; #(
+  *) :
+    acx_cv_f77_cf_flag=-DgFortran
+               acx_temp=`$F77 --version 2>&1 | sed -n -e '/^GNU Fortran/{' \
+                  -e 's/^GNU Fortran\( ([^)]*)\)\{0,1\} \([0-9.]*\)\( .*\)\{0,1\}/\2/;p;}'`
+               as_arg_v1=$acx_temp
+as_arg_v2=7
+awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null
+case $? in #(
+  1) :
+     ;; #(
+  0) :
+     ;; #(
+  2) :
+    acx_cv_f77_cf_flag="-DgFortran -DgFortran8" ;; #(
+  *) :
+     ;;
+esac ;;
+esac ;; #(
+  *) :
+    case `$F77 -v 2>&1 | sed -n 1,5p` in #(
+  *f2c*) :
+    acx_cv_f77_cf_flag=-Df2cFortran ;; #(
+  *) :
+     ;;
+esac ;;
+esac ;;
+esac ;; #(
+  powerpc64-*-linux-*|powerpc-*-linux-*) :
+    if $F77 -qversion 2>&1 | sed 5q | grep '^IBM XL Fortran' >/dev/null; then :
+  acx_cv_f77_cf_flag=-DIBMR2Fortran
+fi ;; #(
+  *-ibm-aix*) :
+          if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null; then :
+
+else
+           acx_cv_f77_cf_flag=-DIBMR2Fortran
+fi
+      ;; #(
+  *-*-hpux*) :
+    acx_cv_f77_cf_flag=-DhpuxFortran ;; #(
+  sx*-*-*|es*-*-*) :
+          acx_cv_f77_cf_flag=-DSXFortran ;; #(
+  *) :
+     ;;
+esac
+
+
+               ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+                        if test -z "$FC" -o X"$FC" = Xno; then :
+  acx_cv_cf_flag="$acx_cv_f77_cf_flag (probed)"
+elif test -z "$F77" -o X"$F77" = Xno; then :
+  acx_cv_cf_flag="$acx_cv_fc_cf_flag (probed)"
+else
+  if test x"$acx_cv_f77_cf_flag" = x"$acx_cv_fc_cf_flag"; then :
+  acx_cv_cf_flag="$acx_cv_f77_cf_flag (probed)"
+else
+  acx_failure_msg="cfortran.h flag for $F77 ($acx_cv_f77_cf_flag) does not match the flag for $FC ($acx_cv_fc_cf_flag).
+Did you configure compatible compilers?"
+                     acx_cv_cf_flag='error'
+fi
+fi ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cf_flag" >&5
+$as_echo "$acx_cv_cf_flag" >&6; }
+   case $acx_cv_cf_flag in #(
+  error) :
+    as_fn_error $? "$acx_failure_msg" "$LINENO" 5 ;; #(
+       *\ \(probed\)) :
+    CPPFLAGS="${CPPFLAGS+$CPPFLAGS }"`echo "$acx_cv_cf_flag" | sed 's/ (probed)$//'` ;; #(
+  *) :
+     ;;
+esac
+
+   case $host in #(
+  *-ibm-aix*|powerpc64-*-linux-*|powerpc-*-linux-*) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h" >&5
+$as_echo_n "checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h... " >&6; }
+      if $CC -qversion 2>&1 | sed 5q | grep '^IBM XL C' >/dev/null; then :
+  acx_temp_qextname_f77flags=`echo "$FFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'`
+         acx_temp_qextname_fcflags=`echo "$FCFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'`
+
+               if $FC -qversion 2>&1 | grep '^IBM XL Fortran' >/dev/null; then :
+
+else
+  acx_temp_qextname_fcflags=-qextname
+fi
+         case x"$acx_temp_qextname_fcflags$acx_temp_qextname_f77flags" in #(
+  x-qextname) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: error" >&5
+$as_echo "error" >&6; }
+            acx_failure_msg="option -qextname must be provided consistently to F77 and FC"
+            as_fn_error $? "$acx_failure_msg" "$LINENO" 5 ;; #(
+  x-qextname-qextname) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+            CPPFLAGS="${CPPFLAGS+$CPPFLAGS }-Dappendus" ;; #(
+  *) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; } ;;
+esac
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi ;; #(
+  *) :
+     ;;
+esac
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if C externals constructed with cfortran.h work" >&5
+$as_echo_n "checking if C externals constructed with cfortran.h work... " >&6; }
+if ${acx_cv_cfortran_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_cfortran_works=no
+      save_CPPFLAGS=$CPPFLAGS
+      CPPFLAGS="-I$srcdir/src $CPPFLAGS"
+      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include "cfortran.h"
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+PROTOCCALLSFFUN1(FLOAT,CFTSTF,cftstf,FLOAT)
+#define conftest_F(v) \
+  CCALLSFFUN1(CFTSTF,cftstf,FLOAT,(v));
+
+static float
+cftstC(int i, float v, int *p, float *q)
+{
+  float f;
+  *p = (int)roundf(v * i);
+  *q = f = conftest_F(v * i);
+  return f;
+}
+
+FCALLSCFUN4(FLOAT,cftstC,CFTSTC,cftstc,INT,FLOAT,PINT,PFLOAT)
+
+/* test string returns */
+static const char *
+conftest_str_C(void)
+{
+  static const char msg[100] = "AAAAAAAAAAAAAAAAAAAA"
+    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+    "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
+  return msg;
+}
+
+FCALLSCFUN0(STRING,conftest_str_C,CHTST,chtst)
+
+/* This function is required simply because some Fortran compilers
+ * won't stop with exit code n when encountering STOP n */
+static void
+errExit(void)
+{
+  exit(1);
+}
+
+FCALLSCSUB0(errExit,ERR_EXIT,err_exit)
+
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+     acx_fn_mv_obj "$LINENO" conftest conftest_c
+         if test -n "$FC" -a X"$FC" != Xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+         cat > conftest.$ac_ext <<_ACEOF
+      MODULE conftest_data
+      IMPLICIT NONE
+      PRIVATE
+      REAL :: ri
+      PUBLIC :: ri
+      END MODULE conftest_data
+
+      FUNCTION cftstf(v) RESULT(r)
+      USE conftest_data, ONLY: ri
+      REAL, INTENT(in) :: v
+      REAL :: r
+      r = v * 100.0
+      ri = 1.0 / v
+      END FUNCTION cftstf
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+     acx_fn_mv_obj "$LINENO" conftest conftest_f
+            save_LIBS=$LIBS
+            LIBS="conftest_c.$ac_objext conftest_f.$ac_objext $LIBS"
+            case $FC_FPP_FLAG in #(
+  -x\ f??-cpp-input) :
+    LIBS="-x none $LIBS" ;; #(
+  *) :
+     ;;
+esac
+            if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Skipping run test for cfortran.h in cross-compilation mode," >&5
+$as_echo "$as_me: Skipping run test for cfortran.h in cross-compilation mode," >&6;}
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: cfortran.h link test succeeded for $FC." >&5
+$as_echo "$as_me: cfortran.h link test succeeded for $FC." >&6;}
+               acx_cv_cfortran_works=yes
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      USE conftest_data, ONLY: ri
+      IMPLICIT NONE
+      INTERFACE
+       FUNCTION cftstc(i, v, p, q) RESULT(f)
+         INTEGER, INTENT(in) :: i
+         REAL, INTENT(in) :: v
+         INTEGER, INTENT(out) :: p
+         REAL, INTENT(out) :: q
+         REAL :: f
+       END FUNCTION cftstc
+       FUNCTION chtst() result(s)
+         CHARACTER(99) :: s
+       END FUNCTION chtst
+      END INTERFACE
+      REAL, PARAMETER :: eps = 10e-6
+      REAL :: foo, boo, too
+      INTEGER :: bar, baz, i
+      CHARACTER(99) :: aaaaaa
+      bar = 5
+      foo = 0.3
+      too = cftstc(bar, foo, baz, boo)
+      IF (ABS(baz - NINT(bar * foo)) /= 0) THEN
+        WRITE (0, '(2(a,i0))') "error checking, when baz, baz=", baz, &
+             ", NINT(bar * foo) =", NINT(bar * foo)
+        FLUSH(0)
+        CALL err_exit
+      END IF
+      IF (ABS((ri - 1.0 / (bar * foo)) / ABS(ri)) > eps)  THEN
+        WRITE (0, '(2(a,g24.15))') "error checking ri, ri=", ri, ", 1.0 / &
+             &(bar * foo) = ", 1.0 / (bar * foo)
+        FLUSH(0)
+        CALL err_exit
+      END IF
+      IF (ABS((boo - (bar * foo * 100.0))/ABS(boo)) > eps)  THEN
+        WRITE (0, '(2(a,g24.15))') "error checking boo, boo=", boo, &
+             ", bar * foo * 100.0 = ", bar * foo * 100.0
+        FLUSH(0)
+        CALL err_exit
+      END IF
+      IF (too /= boo) THEN
+        WRITE (0, '(2(a,g24.15))') "error checking too vs. boo, too=", too, &
+             ", boo = ", boo
+        FLUSH(0)
+        CALL err_exit
+      END IF
+      aaaaaa = chtst()
+      DO i = 1, 99
+        IF (aaaaaa(i:i) /= 'A') THEN
+          WRITE (0, '(a,i0,a)') "error checking aaaaaa(", i, ")=", &
+              aaaaaa(i:i)
+          FLUSH(0)
+          CALL err_exit
+        END IF
+      END DO
+      end
+_ACEOF
+if ac_fn_fc_try_run "$LINENO"; then :
+  acx_cv_cfortran_works=yes
+else
+  acx_cv_cfortran_works="error"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+	       rm -f "conftest_f.$ac_objext" "conftest_f.$OBJEXT"
+	       rm -f conftest_data* CONFTEST_DATA* 2>/dev/null
+	    LIBS=$save_LIBS
+else
+  acx_cv_cfortran_works="error compiling Fortran subroutine"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  acx_cv_cfortran_works=${acx_cv_cfortran_works-yes}
+fi
+         if test -n "$F77" -a X"$F77" != Xno -a \( x"$acx_cv_cfortran_works" = xyes -o -z "$FC" -o X"$FC" = Xno \); then :
+  ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+         cat > conftest.$ac_ext <<_ACEOF
+      REAL FUNCTION CFTSTF(v)
+      REAL RI
+      COMMON /CFTSTD/ RI
+      REAL V
+      REAL R
+      CFTSTF = V * 100.0
+      RI = 1.0 / V
+      END FUNCTION CFTSTF
+_ACEOF
+if ac_fn_f77_try_compile "$LINENO"; then :
+     acx_fn_mv_obj "$LINENO" conftest conftest_f
+            save_LIBS=$LIBS
+            LIBS="conftest_c.$ac_objext conftest_f.$ac_objext $LIBS"
+            case $FC_FPP_FLAG in #(
+  -x\ f??-cpp-input) :
+    LIBS="-x none $LIBS" ;; #(
+  *) :
+     ;;
+esac
+            if test "$cross_compiling" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: Skipping run test for cfortran.h in cross-compilation mode," >&5
+$as_echo "$as_me: Skipping run test for cfortran.h in cross-compilation mode," >&6;}
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: cfortran.h link test succeeded for $F77." >&5
+$as_echo "$as_me: cfortran.h link test succeeded for $F77." >&6;}
+               acx_cv_cfortran_works=yes
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+      REAL RI
+      COMMON /CFTSTD/ RI
+      REAL EPS
+      PARAMETER(EPS=10E-6)
+      REAL FOO, BOO, TOO
+      INTEGER BAR, BAZ, I
+      CHARACTER(99) AAAAAA
+      EXTERNAL CFTSTC, CFTSTF, CHTST, ERR_EXIT
+      REAL CFTSTC, CFTSTF
+      CHARACTER(99) CHTST
+      BAR = 5
+      FOO = 0.3
+      TOO = CFTSTC(BAR, FOO, BAZ, BOO)
+      IF (ABS(BAZ - NINT(BAR * FOO)) /= 0) THEN
+        WRITE (0, '(2(A,I0))') "ERROR CHECKING, WHEN BAZ, BAZ=", BAZ,
+     &       ", NINT(BAR * FOO) =", NINT(BAR * FOO)
+        CALL ERR_EXIT
+      END IF
+      IF (ABS((RI - 1.0 / (BAR * FOO)) / ABS(RI)) > EPS)  THEN
+        WRITE (0, '(2(A,F24.15))') "ERROR CHECKING RI, RI=", RI, ",
+     &       1.0 / (BAR * FOO) = ", 1.0 / (BAR * FOO)
+        CALL err_exit
+      END IF
+      IF (ABS((BOO - (BAR * FOO * 100.0))/ABS(BOO)) > EPS)  THEN
+        WRITE (0, '(2(A,F24.15))') "ERROR CHECKING BOO, BOO=", BOO,
+     &       ", BAR * FOO * 100.0 = ", BAR * FOO * 100.0
+        CALL ERR_EXIT
+      END IF
+      IF (TOO /= BOO) THEN
+        WRITE (0, '(2(A,F24.15))') "ERROR CHECKING TOO VS. BOO, TOO=",
+     &       TOO, ", BOO = ", BOO
+        CALL ERR_EXIT
+      END IF
+      AAAAAA = CHTST()
+      DO i = 1, 99
+        IF (AAAAAA(I:I) /= 'A') THEN
+          WRITE (0, '(A,I0,2A)') "ERROR CHECKING AAAAAA(", I, ")=",
+     &        AAAAAA(I:I)
+          CALL ERR_EXIT
+        END IF
+      END DO
+      end
+_ACEOF
+if ac_fn_f77_try_run "$LINENO"; then :
+  acx_cv_cfortran_works=yes
+else
+  acx_cv_cfortran_works="error"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+	       rm -f "conftest_f.$ac_objext" "conftest_f.$OBJEXT"
+	    LIBS=$save_LIBS
+else
+  acx_cv_cfortran_works="error compiling Fortran subroutine"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+         rm -f "conftest_c.$ac_objext" "conftest_c.$OBJEXT"
+
+else
+  acx_cv_cfortran_works="compiling with cfortran.h failed"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+      CPPFLAGS=$save_CPPFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cfortran_works" >&5
+$as_echo "$acx_cv_cfortran_works" >&6; }
+   case x"$acx_cv_cfortran_works" in #(
+  x"error") :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Linking/Running with C EXTERNAL built with cfortran.h does not work!
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+  x"compiling with cfortran.h failed") :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Compilation with cfortran.h is not working!
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+  x"error compiling Fortran subroutine") :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "compilation of simple Fortran source failed!
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+  xyes) :
+
+$as_echo "#define HAVE_CF_INTERFACE 1" >>confdefs.h
+ ;; #(
+  *) :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Unexpected error when linking C and Fortran via cfortran.h!
+See \`config.log' for more details" "$LINENO" 5; } ;;
+esac
+
+   if test "x$F77" != xno; then :
+  ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement" >&5
+$as_echo_n "checking for Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement... " >&6; }
+if ${acx_cv_f77_ftn_include_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_f77_ftn_include_flag=unknown
+      as_dir=conftest.dir; as_fn_mkdir_p
+      cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+      mv conftest.$ac_ext conftest.dir/conftest.inc
+      cat > conftest.$ac_ext <<_ACEOF
+      include "conftest.inc"
+_ACEOF
+      acx_save_FFLAGS=$FFLAGS
+      for acx_flag in -I '-I '; do
+        FFLAGS="$acx_save_FFLAGS ${acx_flag}conftest.dir"
+        if ac_fn_f77_try_link "$LINENO"; then :
+  acx_cv_f77_ftn_include_flag=$acx_flag
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+        test "x$acx_cv_f77_ftn_include_flag" != xunknown && break
+      done
+      FFLAGS=$acx_save_FFLAGS
+      rm -rf conftest.$ac_ext conftest.dir
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_f77_ftn_include_flag" >&5
+$as_echo "$acx_cv_f77_ftn_include_flag" >&6; }
+   if test "x$acx_cv_f77_ftn_include_flag" = xunknown; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to detect Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+      if test "x$FC" != xno && test "x$acx_cv_f77_ftn_include_flag" != "x$FC_OPTINC"; then :
+  as_fn_error $? "Fortran and Fortran 77 compilers require different flags needed to specify search paths for the \"INCLUDE\" statements" "$LINENO" 5
+fi
+fi
+   if test "x$FC" = xno && test "x$F77" = xno; then :
+  if test "x$enable_cf_interface" = xauto; then :
+  enable_cf_interface=no
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "the Fortran 77 interface is requested but both Fortran and Fortran 77 compilers are disabled, missing or lack the required features
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+fi
+fi
+if test "x$enable_cf_interface" = xauto; then :
+  enable_cf_interface=yes
+fi
+ if test "x$enable_cf_interface" = xyes; then
+  ENABLE_CF_INTERFACE_TRUE=
+  ENABLE_CF_INTERFACE_FALSE='#'
+else
+  ENABLE_CF_INTERFACE_TRUE='#'
+  ENABLE_CF_INTERFACE_FALSE=
+fi
+
+
+# Check whether --enable-ruby-interface was given.
+if test "${enable_ruby_interface+set}" = set; then :
+  enableval=$enable_ruby_interface; test "x$enableval" != xno && enable_ruby_interface=yes
+else
+  enable_ruby_interface=no
+fi
+
+
+# Check whether --enable-python-interface was given.
+if test "${enable_python_interface+set}" = set; then :
+  enableval=$enable_python_interface; test "x$enableval" != xno && enable_python_interface=yes
+else
+  enable_python_interface=no
+fi
+
+
+if test "x$enable_ruby_interface" = xyes || \
+   test "x$enable_python_interface" = xyes; then
+  if test "x$CXX" != xno; then
+    ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+    test -z $CXX 2>/dev/null && CXX=no
+
+if test "x$CXX" != xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5
+$as_echo_n "checking whether the C++ compiler works... " >&6; }
+if ${acx_cv_cxx_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_cxx_works=no
+          ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  acx_cv_cxx_works=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cxx_works" >&5
+$as_echo "$acx_cv_cxx_works" >&6; }
+       if test "x$acx_cv_cxx_works" = xno; then :
+  CXX=no
+fi
+fi
+  fi
+  if test "x$CXX" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "either the Ruby or the Python interface is requested but the C++ compiler is disabled, missing or lacks the required features
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+else
+  CXX=no
+   if false; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+fi
+
+
+
+# Check whether --enable-openmp was given.
+if test "${enable_openmp+set}" = set; then :
+  enableval=$enable_openmp; test "x$enableval" != xno && enable_openmp=yes
+else
+    enable_openmp=no
+fi
+
+
+  OPENMP_CFLAGS=
+
+  if test "$enable_openmp" != no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5
+$as_echo_n "checking for $CC option to support OpenMP... " >&6; }
+if ${ac_cv_prog_c_openmp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef _OPENMP
+ choke me
+#endif
+#include <omp.h>
+int main () { return omp_get_num_threads (); }
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_prog_c_openmp='none needed'
+else
+  ac_cv_prog_c_openmp='unsupported'
+	  	  	  	  	  	  	                                	  	  	  	  	  	  for ac_option in -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \
+                           -Popenmp --openmp; do
+	    ac_save_CFLAGS=$CFLAGS
+	    CFLAGS="$CFLAGS $ac_option"
+	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifndef _OPENMP
+ choke me
+#endif
+#include <omp.h>
+int main () { return omp_get_num_threads (); }
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_prog_c_openmp=$ac_option
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	    CFLAGS=$ac_save_CFLAGS
+	    if test "$ac_cv_prog_c_openmp" != unsupported; then
+	      break
+	    fi
+	  done
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5
+$as_echo "$ac_cv_prog_c_openmp" >&6; }
+    case $ac_cv_prog_c_openmp in #(
+      "none needed" | unsupported)
+	;; #(
+      *)
+	OPENMP_CFLAGS=$ac_cv_prog_c_openmp ;;
+    esac
+  fi
+
+
+if test "x$enable_openmp" = xno; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifndef _OPENMP
+ choke me
+#endif
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  as_fn_error $? "OpenMP support is disabled but the compiler enables it by default: change CFLAGS to disable it" "$LINENO" 5
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+elif test "x$ac_cv_prog_c_openmp" = xunsupported; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot link C OpenMP programs
+See \`config.log' for more details" "$LINENO" 5; }
+elif test -n "$OPENMP_CFLAGS"; then :
+  as_fn_append CFLAGS " $OPENMP_CFLAGS"
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: setting up libtool" >&5
+$as_echo "$as_me: setting up libtool" >&6;}
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case $ECHO in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+      if test x"$enable_shared" != xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking any compiler has problems building shared objects" >&5
+$as_echo_n "checking any compiler has problems building shared objects... " >&6; }
+if ${acx_cv_disable_shared+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_disable_shared=no
+         ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+                  $as_echo "$as_me:${as_lineno-$LINENO}: testing if $FC cannot build working shared objects" >&5
+   case $host in #(
+  *-ibm-aix*) :
+    if $FC -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null; then :
+  acx_cv_disable_shared=yes
+fi ;; #(
+  x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) :
+    if $FC -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null; then :
+  case " $FCFLAGS $LDFLAGS " in #(
+  *\ -Qlocation,ld,*\ *) :
+    acx_cv_disable_shared=yes ;; #(
+  *) :
+    FCFLAGS="$FCFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;;
+esac
+fi ;; #(
+  *) :
+     ;;
+esac
+   $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5
+            ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+         ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+                  $as_echo "$as_me:${as_lineno-$LINENO}: testing if $F77 cannot build working shared objects" >&5
+   case $host in #(
+  *-ibm-aix*) :
+    if $F77 -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null; then :
+  acx_cv_disable_shared=yes
+fi ;; #(
+  x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) :
+    if $F77 -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null; then :
+  case " $FFLAGS $LDFLAGS " in #(
+  *\ -Qlocation,ld,*\ *) :
+    acx_cv_disable_shared=yes ;; #(
+  *) :
+    FFLAGS="$FFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;;
+esac
+fi ;; #(
+  *) :
+     ;;
+esac
+   $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5
+            ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+                  $as_echo "$as_me:${as_lineno-$LINENO}: testing if $CC cannot build working shared objects" >&5
+   case $host in #(
+  *-ibm-aix*) :
+    if $CC -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null; then :
+  acx_cv_disable_shared=yes
+fi ;; #(
+  x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) :
+    if $CC -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null; then :
+  case " $CFLAGS $LDFLAGS " in #(
+  *\ -Qlocation,ld,*\ *) :
+    acx_cv_disable_shared=yes ;; #(
+  *) :
+    CFLAGS="$CFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;;
+esac
+fi ;; #(
+  *) :
+     ;;
+esac
+   $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5
+            ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5
+$as_echo "$acx_cv_disable_shared" >&6; }
+       if test x"$acx_cv_disable_shared" = xyes; then :
+  enable_shared=no
+fi
+fi
+
+
+
+
+
+# Set options
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  pic_mode=yes
+fi
+
+
+
+
+
+
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+
+
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;; #(
+	*NAG\ Fortran\ Compiler*)
+	  lt_prog_compiler_wl='-Wl,-Wl,,'
+	  lt_prog_compiler_pic='-PIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	*PGI\ Compilers\ and\ Tools*|*NVIDIA\ Compilers\ and\ Tools*|*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	tmp_compiler_flags='$compiler_flags'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*NAG\ Fortran\ Compiler*)
+	  tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs"; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
+	else
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='$wl-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test yes = "$hardcode_automatic"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report what library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is the NAG Fortran compiler" >&5
+$as_echo_n "checking whether this is the NAG Fortran compiler... " >&6; }
+    $CC -V 2>&1 | grep '^NAG Fortran Compiler Release' >/dev/null 2>&1
+    _lt_result=$?
+    if test $_lt_result -eq 0; then :
+  _lt_result=yes
+else
+  _lt_result=no
+fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5
+$as_echo "$_lt_result" >&6; }
+    acx_is_nagfor=$_lt_result
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='$wl-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp* | pgc++* )
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed -n 1,5p` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='$wl-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+              '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+              '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+    GCC_CXX=$GXX
+    LD_CXX=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    { output_verbose_link_cmd=; unset output_verbose_link_cmd;}
+        # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = x"$p" ||
+          test x-R = x"$p" ||
+	   test x-l = x"$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX=$prev$p
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX=$prev$p
+	 else
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX=$p
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX=$p
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp* | pgc++* )
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed -n 1,5p` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test no = "$ld_shlibs_CXX" && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test yes = "$hardcode_automatic_CXX"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct_CXX" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+      ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+if test -z "$F77" || test no = "$F77"; then
+  _lt_disable_F77=yes
+fi
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_direct_absolute_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+inherit_rpath_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+reload_flag_F77=$reload_flag
+reload_cmds_F77=$reload_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  compiler_F77=$CC
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+  GCC=$G77
+  if test -n "$compiler"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[4-9]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+    GCC_F77=$G77
+    LD_F77=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl_F77='-Wl,'
+    lt_prog_compiler_static_F77='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_F77='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_F77='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_F77=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_F77=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_F77='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic_F77='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl_F77='-Xlinker '
+      if test -n "$lt_prog_compiler_pic_F77"; then
+        lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_F77='-Bstatic'
+      else
+	lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_F77='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl_F77='-Wl,-Wl,,'
+        lt_prog_compiler_pic_F77='-PIC'
+        lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_F77='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_F77='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_F77='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_F77='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-KPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fPIC'
+	lt_prog_compiler_static_F77='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='--shared'
+	lt_prog_compiler_static_F77='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl_F77='-Wl,-Wl,,'
+	lt_prog_compiler_pic_F77='-PIC'
+	lt_prog_compiler_static_F77='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fPIC'
+	lt_prog_compiler_static_F77='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-fpic'
+	lt_prog_compiler_static_F77='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_F77='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_F77='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl_F77='-Wl,'
+	lt_prog_compiler_pic_F77='-qpic'
+	lt_prog_compiler_static_F77='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_F77='-KPIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  lt_prog_compiler_pic_F77='-fPIC'
+	  lt_prog_compiler_static_F77='-static'
+	  ;; #(
+	*NAG\ Fortran\ Compiler*)
+	  lt_prog_compiler_wl_F77='-Wl,-Wl,,'
+	  lt_prog_compiler_pic_F77='-PIC'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  ;;
+	*PGI\ Compilers\ and\ Tools*|*NVIDIA\ Compilers\ and\ Tools*|*Portland\ Group*)
+	  lt_prog_compiler_wl_F77='-Wl,'
+	  lt_prog_compiler_pic_F77='-fpic'
+	  lt_prog_compiler_static_F77='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_F77='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_F77='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl_F77='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_F77='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_F77='-Qoption ld '
+      lt_prog_compiler_pic_F77='-PIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_F77='-Kconform_pic'
+	lt_prog_compiler_static_F77='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_pic_F77='-KPIC'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_F77='-Wl,'
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_F77='-pic'
+      lt_prog_compiler_static_F77='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_F77=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_F77=
+    ;;
+  *)
+    lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5
+$as_echo "$lt_cv_prog_compiler_pic_F77" >&6; }
+lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_F77=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_F77"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_F77=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_F77"; then
+    case $lt_prog_compiler_pic_F77 in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+     esac
+else
+    lt_prog_compiler_pic_F77=
+     lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_F77=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_F77=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_F77=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_F77"; then
+    :
+else
+    lt_prog_compiler_static_F77=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_F77=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_F77=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_F77" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag_F77=
+  always_export_symbols_F77=no
+  archive_cmds_F77=
+  archive_expsym_cmds_F77=
+  compiler_needs_object_F77=no
+  enable_shared_with_static_runtimes_F77=no
+  export_dynamic_flag_spec_F77=
+  export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic_F77=no
+  hardcode_direct_F77=no
+  hardcode_direct_absolute_F77=no
+  hardcode_libdir_flag_spec_F77=
+  hardcode_libdir_separator_F77=
+  hardcode_minus_L_F77=no
+  hardcode_shlibpath_var_F77=unsupported
+  inherit_rpath_F77=no
+  link_all_deplibs_F77=unknown
+  module_cmds_F77=
+  module_expsym_cmds_F77=
+  old_archive_from_new_cmds_F77=
+  old_archive_from_expsyms_cmds_F77=
+  thread_safe_flag_spec_F77=
+  whole_archive_flag_spec_F77=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_F77=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_F77=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec_F77='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_F77=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec_F77=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds_F77=''
+        ;;
+      m68k)
+            archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_F77='-L$libdir'
+            hardcode_minus_L_F77=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_F77=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      export_dynamic_flag_spec_F77='$wl--export-all-symbols'
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=no
+      enable_shared_with_static_runtimes_F77=yes
+      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds_F77='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs_F77=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      shrext_cmds=.dll
+      archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes_F77=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir'
+      export_dynamic_flag_spec_F77='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_F77='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	tmp_compiler_flags='$compiler_flags'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec_F77=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object_F77=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_F77='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object_F77=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*NAG\ Fortran\ Compiler*)
+	  tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	esac
+	archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec_F77='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+	  archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs_F77=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_F77=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+	    archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs_F77=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs_F77"; then
+      runpath_var=
+      hardcode_libdir_flag_spec_F77=
+      export_dynamic_flag_spec_F77=
+      whole_archive_flag_spec_F77=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_F77=unsupported
+      always_export_symbols_F77=yes
+      archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_F77=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_F77=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_F77='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_F77=''
+      hardcode_direct_F77=yes
+      hardcode_direct_absolute_F77=yes
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      file_list_spec_F77='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct_F77=no
+	hardcode_direct_absolute_F77=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct_F77=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_F77=yes
+	  hardcode_libdir_flag_spec_F77='-L$libdir'
+	  hardcode_libdir_separator_F77=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec_F77='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_F77=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_F77='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__F77
+fi
+
+        hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec_F77='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_F77="-z nodefs"
+	  archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__F77"; then
+    lt_cv_aix_libpath__F77=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__F77
+fi
+
+	 hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_F77=' $wl-bernotok'
+	  allow_undefined_flag_F77=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec_F77='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_F77='$convenience'
+	  fi
+	  archive_cmds_need_lc_F77=yes
+	  archive_expsym_cmds_F77='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds_F77=''
+        ;;
+      m68k)
+            archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_F77='-L$libdir'
+            hardcode_minus_L_F77=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_F77=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec_F77=' '
+	allow_undefined_flag_F77=unsupported
+	always_export_symbols_F77=yes
+	file_list_spec_F77='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_F77='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds_F77='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, F77)='true'
+	enable_shared_with_static_runtimes_F77=yes
+	exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds_F77='chmod 644 $oldlib'
+	postlink_cmds_F77='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec_F77=' '
+	allow_undefined_flag_F77=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds_F77='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes_F77=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_F77=no
+  hardcode_direct_F77=no
+  hardcode_automatic_F77=yes
+  hardcode_shlibpath_var_F77=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    compiler_needs_object_F77=yes
+  else
+    whole_archive_flag_spec_F77=''
+  fi
+  link_all_deplibs_F77=yes
+  allow_undefined_flag_F77=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_F77="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_F77="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs_F77=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_direct_F77=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_F77=yes
+      export_dynamic_flag_spec_F77='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir'
+	hardcode_libdir_separator_F77=:
+	hardcode_direct_F77=yes
+	hardcode_direct_absolute_F77=yes
+	export_dynamic_flag_spec_F77='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_F77=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_F77='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir'
+	hardcode_libdir_separator_F77=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct_F77=no
+	  hardcode_shlibpath_var_F77=no
+	  ;;
+	*)
+	  hardcode_direct_F77=yes
+	  hardcode_direct_absolute_F77=yes
+	  export_dynamic_flag_spec_F77='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_F77=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat > conftest.$ac_ext <<_ACEOF
+
+      subroutine foo
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_F77=:
+      inherit_rpath_F77=yes
+      link_all_deplibs_F77=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs_F77=yes
+	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_direct_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    newsos6)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_F77=yes
+      hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_F77=:
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_F77=yes
+	hardcode_shlibpath_var_F77=no
+	hardcode_direct_absolute_F77=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec_F77='$wl-E'
+	else
+	  archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs_F77=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_minus_L_F77=yes
+      allow_undefined_flag_F77=unsupported
+      shrext_cmds=.dll
+      archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes_F77=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*'
+	archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*'
+	archive_cmds_F77='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag_F77=' -expect_unresolved \*'
+	archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_F77='-rpath $libdir'
+      fi
+      archive_cmds_need_lc_F77='no'
+      hardcode_libdir_separator_F77=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_F77=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds_F77='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds_F77='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds_F77='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec_F77='-R$libdir'
+      hardcode_shlibpath_var_F77=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec_F77='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_F77=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_F77='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_direct_F77=yes
+      hardcode_minus_L_F77=yes
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_F77='$CC -r -o $output$reload_objs'
+	  hardcode_direct_F77=no
+        ;;
+	motorola)
+	  archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_F77=no
+      export_dynamic_flag_spec_F77='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_F77=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_F77=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_F77='$wl-z,text'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_F77='$wl-z,text'
+      allow_undefined_flag_F77='$wl-z,nodefs'
+      archive_cmds_need_lc_F77=no
+      hardcode_shlibpath_var_F77=no
+      hardcode_libdir_flag_spec_F77='$wl-R,$libdir'
+      hardcode_libdir_separator_F77=':'
+      link_all_deplibs_F77=yes
+      export_dynamic_flag_spec_F77='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_F77='-L$libdir'
+      hardcode_shlibpath_var_F77=no
+      ;;
+
+    *)
+      ld_shlibs_F77=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec_F77='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5
+$as_echo "$ld_shlibs_F77" >&6; }
+test no = "$ld_shlibs_F77" && can_build_shared=no
+
+with_gnu_ld_F77=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_F77=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds_F77 in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_F77+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_F77
+	  pic_flag=$lt_prog_compiler_pic_F77
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+	  allow_undefined_flag_F77=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_F77=no
+	  else
+	    lt_cv_archive_cmds_need_lc_F77=yes
+	  fi
+	  allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_F77" >&6; }
+      archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_F77='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\""
+    cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" ||
+   test -n "$runpath_var_F77" ||
+   test yes = "$hardcode_automatic_F77"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct_F77" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" &&
+     test no != "$hardcode_minus_L_F77"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_F77=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_F77=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_F77=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5
+$as_echo "$hardcode_action_F77" >&6; }
+
+if test relink = "$hardcode_action_F77" ||
+   test yes = "$inherit_rpath_F77"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is the NAG Fortran compiler" >&5
+$as_echo_n "checking whether this is the NAG Fortran compiler... " >&6; }
+    $CC -V 2>&1 | grep '^NAG Fortran Compiler Release' >/dev/null 2>&1
+    _lt_result=$?
+    if test $_lt_result -eq 0; then :
+  _lt_result=yes
+else
+  _lt_result=no
+fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5
+$as_echo "$_lt_result" >&6; }
+    acx_is_nagfor_F77=$_lt_result
+
+
+
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+      ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+if test -z "$FC" || test no = "$FC"; then
+  _lt_disable_FC=yes
+fi
+
+archive_cmds_need_lc_FC=no
+allow_undefined_flag_FC=
+always_export_symbols_FC=no
+archive_expsym_cmds_FC=
+export_dynamic_flag_spec_FC=
+hardcode_direct_FC=no
+hardcode_direct_absolute_FC=no
+hardcode_libdir_flag_spec_FC=
+hardcode_libdir_separator_FC=
+hardcode_minus_L_FC=no
+hardcode_automatic_FC=no
+inherit_rpath_FC=no
+module_cmds_FC=
+module_expsym_cmds_FC=
+link_all_deplibs_FC=unknown
+old_archive_cmds_FC=$old_archive_cmds
+reload_flag_FC=$reload_flag
+reload_cmds_FC=$reload_cmds
+no_undefined_flag_FC=
+whole_archive_flag_spec_FC=
+enable_shared_with_static_runtimes_FC=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+objext_FC=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  compiler_FC=$CC
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+  if test -n "$compiler"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[4-9]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+    GCC_FC=$ac_cv_fc_compiler_gnu
+    LD_FC=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    { output_verbose_link_cmd=; unset output_verbose_link_cmd;}
+        # Dependencies to place before and after the object being linked:
+predep_objects_FC=
+postdep_objects_FC=
+predeps_FC=
+postdeps_FC=
+compiler_lib_search_path_FC=
+
+cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = x"$p" ||
+          test x-R = x"$p" ||
+	   test x-l = x"$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_FC"; then
+	     compiler_lib_search_path_FC=$prev$p
+	   else
+	     compiler_lib_search_path_FC="${compiler_lib_search_path_FC} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_FC"; then
+	   postdeps_FC=$prev$p
+	 else
+	   postdeps_FC="${postdeps_FC} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$predep_objects_FC"; then
+	   predep_objects_FC=$p
+	 else
+	   predep_objects_FC="$predep_objects_FC $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_FC"; then
+	   postdep_objects_FC=$p
+	 else
+	   postdep_objects_FC="$postdep_objects_FC $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling FC test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+
+
+case " $postdeps_FC " in
+*" -lc "*) archive_cmds_need_lc_FC=no ;;
+esac
+ compiler_lib_search_dirs_FC=
+if test -n "${compiler_lib_search_path_FC}"; then
+ compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_FC=
+lt_prog_compiler_pic_FC=
+lt_prog_compiler_static_FC=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl_FC='-Wl,'
+    lt_prog_compiler_static_FC='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_FC='-Bstatic'
+      fi
+      lt_prog_compiler_pic_FC='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_FC='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic_FC='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_FC='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_FC='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_FC='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_FC=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_FC='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared_FC=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_FC='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_FC=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic_FC='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl_FC='-Xlinker '
+      if test -n "$lt_prog_compiler_pic_FC"; then
+        lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_FC='-Bstatic'
+      else
+	lt_prog_compiler_static_FC='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_FC='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl_FC='-Wl,-Wl,,'
+        lt_prog_compiler_pic_FC='-PIC'
+        lt_prog_compiler_static_FC='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic_FC='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_FC='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic_FC='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static_FC='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-KPIC'
+	lt_prog_compiler_static_FC='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-fPIC'
+	lt_prog_compiler_static_FC='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='--shared'
+	lt_prog_compiler_static_FC='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl_FC='-Wl,-Wl,,'
+	lt_prog_compiler_pic_FC='-PIC'
+	lt_prog_compiler_static_FC='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-fPIC'
+	lt_prog_compiler_static_FC='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-fpic'
+	lt_prog_compiler_static_FC='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl_FC='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static_FC='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl_FC='-Wl,'
+	lt_prog_compiler_pic_FC='-qpic'
+	lt_prog_compiler_static_FC='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic_FC='-KPIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  lt_prog_compiler_pic_FC='-fPIC'
+	  lt_prog_compiler_static_FC='-static'
+	  ;; #(
+	*NAG\ Fortran\ Compiler*)
+	  lt_prog_compiler_wl_FC='-Wl,-Wl,,'
+	  lt_prog_compiler_pic_FC='-PIC'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  ;;
+	*PGI\ Compilers\ and\ Tools*|*NVIDIA\ Compilers\ and\ Tools*|*Portland\ Group*)
+	  lt_prog_compiler_wl_FC='-Wl,'
+	  lt_prog_compiler_pic_FC='-fpic'
+	  lt_prog_compiler_static_FC='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_FC='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static_FC='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl_FC='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl_FC='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl_FC='-Qoption ld '
+      lt_prog_compiler_pic_FC='-PIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_FC='-Kconform_pic'
+	lt_prog_compiler_static_FC='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_pic_FC='-KPIC'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl_FC='-Wl,'
+      lt_prog_compiler_can_build_shared_FC=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic_FC='-pic'
+      lt_prog_compiler_static_FC='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared_FC=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_FC=
+    ;;
+  *)
+    lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5
+$as_echo "$lt_cv_prog_compiler_pic_FC" >&6; }
+lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_FC=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_FC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_FC=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_FC" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works_FC"; then
+    case $lt_prog_compiler_pic_FC in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;;
+     esac
+else
+    lt_prog_compiler_pic_FC=
+     lt_prog_compiler_can_build_shared_FC=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_FC=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_FC=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_FC=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_FC" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_FC" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works_FC"; then
+    :
+else
+    lt_prog_compiler_static_FC=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_FC=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_FC=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_FC=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_FC=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_FC" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_FC" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_FC" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag_FC=
+  always_export_symbols_FC=no
+  archive_cmds_FC=
+  archive_expsym_cmds_FC=
+  compiler_needs_object_FC=no
+  enable_shared_with_static_runtimes_FC=no
+  export_dynamic_flag_spec_FC=
+  export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic_FC=no
+  hardcode_direct_FC=no
+  hardcode_direct_absolute_FC=no
+  hardcode_libdir_flag_spec_FC=
+  hardcode_libdir_separator_FC=
+  hardcode_minus_L_FC=no
+  hardcode_shlibpath_var_FC=unsupported
+  inherit_rpath_FC=no
+  link_all_deplibs_FC=unknown
+  module_cmds_FC=
+  module_expsym_cmds_FC=
+  old_archive_from_new_cmds_FC=
+  old_archive_from_expsyms_cmds_FC=
+  thread_safe_flag_spec_FC=
+  whole_archive_flag_spec_FC=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms_FC=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms_FC='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  ld_shlibs_FC=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec_FC='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_FC=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec_FC=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds_FC=''
+        ;;
+      m68k)
+            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_FC='-L$libdir'
+            hardcode_minus_L_FC=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag_FC=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      export_dynamic_flag_spec_FC='$wl--export-all-symbols'
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=no
+      enable_shared_with_static_runtimes_FC=yes
+      export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds_FC='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs_FC=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_minus_L_FC=yes
+      allow_undefined_flag_FC=unsupported
+      shrext_cmds=.dll
+      archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes_FC=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir'
+      export_dynamic_flag_spec_FC='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_FC='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	tmp_compiler_flags='$compiler_flags'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec_FC=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec_FC='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed -n 1,5p` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_FC='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	*NAG\ Fortran\ Compiler*)
+	  tmp_sharedflag='-Wl,-shared'
+	  tmp_compiler_flags='`echo " $compiler_flags " | sed -E -e '"'"': start'"'"' -e '"'"'s/ -W[cl],-no-pie[[:blank:]]/ /g;t start'"'"' -e '"'"'s/^ //;s/ $//'"'"'`' ;;
+	esac
+	archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs '"$tmp_compiler_flags"' $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec_FC='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+	  archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs_FC=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+	    archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs_FC=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs_FC"; then
+      runpath_var=
+      hardcode_libdir_flag_spec_FC=
+      export_dynamic_flag_spec_FC=
+      whole_archive_flag_spec_FC=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=yes
+      archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_FC=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_FC=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_FC='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds_FC=''
+      hardcode_direct_FC=yes
+      hardcode_direct_absolute_FC=yes
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      file_list_spec_FC='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct_FC=no
+	hardcode_direct_absolute_FC=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct_FC=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_FC=yes
+	  hardcode_libdir_flag_spec_FC='-L$libdir'
+	  hardcode_libdir_separator_FC=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec_FC='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_FC=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_FC='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
+
+        hardcode_libdir_flag_spec_FC='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec_FC='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_FC="-z nodefs"
+	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
+
+	 hardcode_libdir_flag_spec_FC='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_FC=' $wl-bernotok'
+	  allow_undefined_flag_FC=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec_FC='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_FC='$convenience'
+	  fi
+	  archive_cmds_need_lc_FC=yes
+	  archive_expsym_cmds_FC='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds_FC=''
+        ;;
+      m68k)
+            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_FC='-L$libdir'
+            hardcode_minus_L_FC=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_FC=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	always_export_symbols_FC=yes
+	file_list_spec_FC='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds_FC='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, FC)='true'
+	enable_shared_with_static_runtimes_FC=yes
+	exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds_FC='chmod 644 $oldlib'
+	postlink_cmds_FC='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds_FC='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes_FC=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_FC=no
+  hardcode_direct_FC=no
+  hardcode_automatic_FC=yes
+  hardcode_shlibpath_var_FC=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    compiler_needs_object_FC=yes
+  else
+    whole_archive_flag_spec_FC=''
+  fi
+  link_all_deplibs_FC=yes
+  allow_undefined_flag_FC=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_FC="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_FC="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs_FC=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_direct_FC=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_FC=yes
+      export_dynamic_flag_spec_FC='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir'
+	hardcode_libdir_separator_FC=:
+	hardcode_direct_FC=yes
+	hardcode_direct_absolute_FC=yes
+	export_dynamic_flag_spec_FC='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_FC=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	archive_cmds_FC='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec_FC='$wl+b $wl$libdir'
+	hardcode_libdir_separator_FC=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct_FC=no
+	  hardcode_shlibpath_var_FC=no
+	  ;;
+	*)
+	  hardcode_direct_FC=yes
+	  hardcode_direct_absolute_FC=yes
+	  export_dynamic_flag_spec_FC='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_FC=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat > conftest.$ac_ext <<_ACEOF
+
+      subroutine foo
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_FC=:
+      inherit_rpath_FC=yes
+      link_all_deplibs_FC=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs_FC=yes
+	archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    newsos6)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_FC=yes
+	hardcode_shlibpath_var_FC=no
+	hardcode_direct_absolute_FC=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec_FC='$wl-E'
+	else
+	  archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_minus_L_FC=yes
+      allow_undefined_flag_FC=unsupported
+      shrext_cmds=.dll
+      archive_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds_FC='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes_FC=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*'
+	archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator_FC=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*'
+	archive_cmds_FC='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_FC='-rpath $libdir'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_separator_FC=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_FC=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds_FC='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds_FC='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds_FC='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_shlibpath_var_FC=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec_FC='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs_FC=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_FC='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_FC='$CC -r -o $output$reload_objs'
+	  hardcode_direct_FC=no
+        ;;
+	motorola)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_FC=no
+      export_dynamic_flag_spec_FC='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_FC=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_FC=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_FC='$wl-z,text'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_FC='$wl-z,text'
+      allow_undefined_flag_FC='$wl-z,nodefs'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='$wl-R,$libdir'
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      export_dynamic_flag_spec_FC='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *)
+      ld_shlibs_FC=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec_FC='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5
+$as_echo "$ld_shlibs_FC" >&6; }
+test no = "$ld_shlibs_FC" && can_build_shared=no
+
+with_gnu_ld_FC=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_FC" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_FC=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds_FC in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_FC
+	  pic_flag=$lt_prog_compiler_pic_FC
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_FC
+	  allow_undefined_flag_FC=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_FC=no
+	  else
+	    lt_cv_archive_cmds_need_lc_FC=yes
+	  fi
+	  allow_undefined_flag_FC=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; }
+      archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_FC='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\""
+    cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_FC=
+if test -n "$hardcode_libdir_flag_spec_FC" ||
+   test -n "$runpath_var_FC" ||
+   test yes = "$hardcode_automatic_FC"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct_FC" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" &&
+     test no != "$hardcode_minus_L_FC"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_FC=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_FC=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_FC=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5
+$as_echo "$hardcode_action_FC" >&6; }
+
+if test relink = "$hardcode_action_FC" ||
+   test yes = "$inherit_rpath_FC"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is the NAG Fortran compiler" >&5
+$as_echo_n "checking whether this is the NAG Fortran compiler... " >&6; }
+    $CC -V 2>&1 | grep '^NAG Fortran Compiler Release' >/dev/null 2>&1
+    _lt_result=$?
+    if test $_lt_result -eq 0; then :
+  _lt_result=yes
+else
+  _lt_result=no
+fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5
+$as_echo "$_lt_result" >&6; }
+    acx_is_nagfor_FC=$_lt_result
+
+
+
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+                           ## _KPSE_USE_LIBTOOL: Generate a libtool script for use in configure tests
+: ${CONFIG_LT=./config.lt}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5
+$as_echo "$as_me: creating $CONFIG_LT" >&6;}
+as_write_fail=0
+cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate a libtool stub with the current configuration.
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>"$CONFIG_LT" <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## --------------------------------- ##
+## Main body of "$CONFIG_LT" script. ##
+## --------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x "$CONFIG_LT"
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $0 [OPTIONS]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+cdi config.lt 2.4.3
+configured by $0, generated by GNU Autoconf 2.69.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $#
+do
+  case $1 in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) as_fn_error $? "unrecognized option: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+
+    *) as_fn_error $? "unrecognized argument: $1
+Try '$0 --help' for more information." "$LINENO" 5 ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec 6>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor='`$ECHO "$acx_is_nagfor" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`'
+LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`'
+reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`'
+reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`'
+compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`'
+GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_CXX='`$ECHO "$acx_is_nagfor_CXX" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_F77='`$ECHO "$acx_is_nagfor_F77" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_FC='`$ECHO "$acx_is_nagfor_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`'
+file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`'
+predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`'
+postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`'
+predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`'
+postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+LD_F77 \
+LD_FC \
+reload_flag_CXX \
+reload_flag_F77 \
+reload_flag_FC \
+compiler_CXX \
+compiler_F77 \
+compiler_FC \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_no_builtin_flag_F77 \
+lt_prog_compiler_no_builtin_flag_FC \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_pic_F77 \
+lt_prog_compiler_pic_FC \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_wl_F77 \
+lt_prog_compiler_wl_FC \
+lt_prog_compiler_static_CXX \
+lt_prog_compiler_static_F77 \
+lt_prog_compiler_static_FC \
+lt_cv_prog_compiler_c_o_CXX \
+lt_cv_prog_compiler_c_o_F77 \
+lt_cv_prog_compiler_c_o_FC \
+export_dynamic_flag_spec_CXX \
+export_dynamic_flag_spec_F77 \
+export_dynamic_flag_spec_FC \
+whole_archive_flag_spec_CXX \
+whole_archive_flag_spec_F77 \
+whole_archive_flag_spec_FC \
+compiler_needs_object_CXX \
+compiler_needs_object_F77 \
+compiler_needs_object_FC \
+with_gnu_ld_CXX \
+with_gnu_ld_F77 \
+with_gnu_ld_FC \
+allow_undefined_flag_CXX \
+allow_undefined_flag_F77 \
+allow_undefined_flag_FC \
+no_undefined_flag_CXX \
+no_undefined_flag_F77 \
+no_undefined_flag_FC \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_flag_spec_F77 \
+hardcode_libdir_flag_spec_FC \
+hardcode_libdir_separator_CXX \
+hardcode_libdir_separator_F77 \
+hardcode_libdir_separator_FC \
+exclude_expsyms_CXX \
+exclude_expsyms_F77 \
+exclude_expsyms_FC \
+include_expsyms_CXX \
+include_expsyms_F77 \
+include_expsyms_FC \
+file_list_spec_CXX \
+file_list_spec_F77 \
+file_list_spec_FC \
+compiler_lib_search_dirs_CXX \
+compiler_lib_search_dirs_F77 \
+compiler_lib_search_dirs_FC \
+predep_objects_CXX \
+predep_objects_F77 \
+predep_objects_FC \
+postdep_objects_CXX \
+postdep_objects_F77 \
+postdep_objects_FC \
+predeps_CXX \
+predeps_F77 \
+predeps_FC \
+postdeps_CXX \
+postdeps_F77 \
+postdeps_FC \
+compiler_lib_search_path_CXX \
+compiler_lib_search_path_F77 \
+compiler_lib_search_path_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+reload_cmds_F77 \
+reload_cmds_FC \
+old_archive_cmds_CXX \
+old_archive_cmds_F77 \
+old_archive_cmds_FC \
+old_archive_from_new_cmds_CXX \
+old_archive_from_new_cmds_F77 \
+old_archive_from_new_cmds_FC \
+old_archive_from_expsyms_cmds_CXX \
+old_archive_from_expsyms_cmds_F77 \
+old_archive_from_expsyms_cmds_FC \
+archive_cmds_CXX \
+archive_cmds_F77 \
+archive_cmds_FC \
+archive_expsym_cmds_CXX \
+archive_expsym_cmds_F77 \
+archive_expsym_cmds_FC \
+module_cmds_CXX \
+module_cmds_F77 \
+module_cmds_FC \
+module_expsym_cmds_CXX \
+module_expsym_cmds_F77 \
+module_expsym_cmds_FC \
+export_symbols_cmds_CXX \
+export_symbols_cmds_F77 \
+export_symbols_cmds_FC \
+prelink_cmds_CXX \
+prelink_cmds_F77 \
+prelink_cmds_FC \
+postlink_cmds_CXX \
+postlink_cmds_F77 \
+postlink_cmds_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+
+
+
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5
+$as_echo "$as_me: creating $ofile" >&6;}
+
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX F77 FC '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: F77
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_F77
+reload_cmds=$lt_reload_cmds_F77
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_F77
+
+# A language specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_F77
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_F77
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_F77
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_F77
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_F77
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_F77
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_F77
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_F77
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_F77
+postdep_objects=$lt_postdep_objects_F77
+predeps=$lt_predeps_F77
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# ### END LIBTOOL TAG CONFIG: F77
+_LT_EOF
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: FC
+
+# The linker used to build libraries.
+LD=$lt_LD_FC
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_FC
+reload_cmds=$lt_reload_cmds_FC
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_FC
+
+# A language specific compiler.
+CC=$lt_compiler_FC
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_FC
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_FC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_FC
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_FC
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_FC
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_FC
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_FC
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_FC
+archive_expsym_cmds=$lt_archive_expsym_cmds_FC
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_FC
+module_expsym_cmds=$lt_module_expsym_cmds_FC
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_FC
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_FC
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_FC
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_FC
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_FC
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_FC
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_FC
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_FC
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_FC
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_FC
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_FC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_FC
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_FC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_FC
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_FC
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_FC
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_FC
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_FC
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_FC
+postdep_objects=$lt_postdep_objects_FC
+predeps=$lt_predeps_FC
+postdeps=$lt_postdeps_FC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_FC
+
+# ### END LIBTOOL TAG CONFIG: FC
+_LT_EOF
+
+
+as_fn_exit 0
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec 5>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec 5>>config.log
+$lt_cl_success || as_fn_exit 1
+
+
+acx_lt_saved_ac_objext=$ac_objext
+ac_objext=lo
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+ac_clean_files_save="$ac_clean_files_save $ac_pwd/$objdir"
+ac_clean_files="$ac_clean_files $ac_pwd/$objdir"
+
+   for acx_flag_var_ in CFLAGS CXXFLAGS FCFLAGS F77FLAGS LDFLAGS FCLDFLAGS
+do :
+  if eval test x\$\{$acx_flag_var_+set\} = xset; then :
+  eval acx_temp="\" \$$acx_flag_var_ \""
+         case $acx_temp in #(
+  *\ -shared-intel\ *|*\ -static-intel\ *) :
+    acx_temp=`echo "$acx_temp" | sed -E -e 's/ (-shared-intel|-static-intel) / -Xcompiler \1 -XCClinker \1 /g'` ;; #(
+  *) :
+     ;;
+esac
+         case $acx_temp in #(
+  *\ -Qlocation,*\ *) :
+    acx_temp=`echo "$acx_temp" | sed -E -e 's/ (-Qlocation,[^, ]*,[^[:blank:]]*)/ -Xcompiler \1 -XCClinker \1/g'` ;; #(
+  *) :
+     ;;
+esac
+         eval $acx_flag_var_=\"`echo "$acx_temp" | sed -E -e 's/ -(align|allow|assume|ccdefault|check|convert|debug|debug-parameters|diag-type|diag-enable|diag-disable|double-size|dynamic-linker|dyncom|export-dir|extend-source|fp-model|fpscomp|gen-interfaces|heap-arrays|imacros|integer-size|iprefix|iquote|iwithprefixbefore|module|names|opt-report|opt-streaming-stores|pch-dir|pch-use|prof-dir|prof-file|real-size|reentrancy|stand|tcollect-filter|tune|warn|watch) ([^-][^[:blank:]]*)/ -Xcompiler -\1 -Xcompiler \2/g' -e 's/^ //;s/ $//'`\"
+fi
+done
+         if test -n "$CC" -a X"$CC" != Xno; then :
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool can link C programs" >&5
+$as_echo_n "checking whether libtool can link C programs... " >&6; }
+if ${acx_cv_libtool_c_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_libtool_c_works=no
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_cv_libtool_c_works=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_c_works" >&5
+$as_echo "$acx_cv_libtool_c_works" >&6; }
+   if test "x$acx_cv_libtool_c_works" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to link a C program using libtool
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+               if test x"$acx_is_nagfor" = xyes; then :
+  case " $CFLAGS $LDFLAGS " in #(
+  *\ -B*\ *) :
+    extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b'
+ ;; #(
+  *) :
+    CFLAGS="$CFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;;
+esac
+fi
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+   if test -n "$FC" -a X"$FC" != Xno; then :
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+
+
+   acx_temp=`$FC -V 2>&1 | sed -n 1,5p`
+   case "$acx_temp" in #(
+  *NAG\ Fortran\ Compiler\ Release*) :
+    if test x${FCFLAGS+set} = xset; then :
+  FCFLAGS=`echo "$FCFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \
+-e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \
+-e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \
+   | tr '\n' ' ' | sed -e 's/ $//'`
+fi
+      if test x${FCLDFLAGS+set} = xset; then :
+  FCLDFLAGS=`echo "$FCLDFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \
+-e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \
+-e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \
+   | tr '\n' ' ' | sed -e 's/ $//'`
+fi ;; #(
+  *) :
+     ;;
+esac
+   case "x${FC_MODOUT}x" in #(
+  x'-module 'x|x'-mod 'x) :
+    FC_MODOUT="-Xcompiler ${FC_MODOUT}-Xcompiler " ;; #(
+  *) :
+     ;;
+esac
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool can link Fortran programs" >&5
+$as_echo_n "checking whether libtool can link Fortran programs... " >&6; }
+if ${acx_cv_libtool_fc_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_libtool_fc_works=no
+      cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  acx_cv_libtool_fc_works=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_fc_works" >&5
+$as_echo "$acx_cv_libtool_fc_works" >&6; }
+   if test "x$acx_cv_libtool_fc_works" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to link a Fortran program using libtool
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+               if test x"$acx_is_nagfor_FC" = xyes; then :
+  case " $FCFLAGS $LDFLAGS " in #(
+  *\ -B*\ *) :
+    extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b'
+ ;; #(
+  *) :
+    FCFLAGS="$FCFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;;
+esac
+fi
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+   if test -n "$F77" -a X"$F77" != Xno; then :
+  ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=F77 $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=F77 $ac_compile"
+
+
+
+   acx_temp=`$F77 -V 2>&1 | sed -n 1,5p`
+   case "$acx_temp" in #(
+  *NAG\ Fortran\ Compiler\ Release*) :
+    if test x${FFLAGS+set} = xset; then :
+  FFLAGS=`echo "$FFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \
+-e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \
+-e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \
+   | tr '\n' ' ' | sed -e 's/ $//'`
+fi
+      if test x${F77LDFLAGS+set} = xset; then :
+  F77LDFLAGS=`echo "$F77LDFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \
+-e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \
+-e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \
+   | tr '\n' ' ' | sed -e 's/ $//'`
+fi ;; #(
+  *) :
+     ;;
+esac
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool can link Fortran 77 programs" >&5
+$as_echo_n "checking whether libtool can link Fortran 77 programs... " >&6; }
+if ${acx_cv_libtool_f77_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_libtool_f77_works=no
+      cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_f77_try_link "$LINENO"; then :
+  acx_cv_libtool_f77_works=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_f77_works" >&5
+$as_echo "$acx_cv_libtool_f77_works" >&6; }
+   if test "x$acx_cv_libtool_f77_works" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to link a Fortran 77 program using libtool
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+               if test x"$acx_is_nagfor_F77" = xyes; then :
+  case " $FFLAGS $LDFLAGS " in #(
+  *\ -B*\ *) :
+    extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b'
+ ;; #(
+  *) :
+    FFLAGS="$FFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;;
+esac
+fi
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+   if test -n "$CXX" -a X"$CXX" != Xno; then :
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CXX $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CXX $ac_compile"
+
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether libtool can link C++ programs" >&5
+$as_echo_n "checking whether libtool can link C++ programs... " >&6; }
+if ${acx_cv_libtool_cxx_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_libtool_cxx_works=no
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  acx_cv_libtool_cxx_works=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_cxx_works" >&5
+$as_echo "$acx_cv_libtool_cxx_works" >&6; }
+   if test "x$acx_cv_libtool_cxx_works" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "unable to link a C++ program using libtool
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+               if test x"$acx_is_nagfor_F77" = xyes; then :
+  case " $FFLAGS $LDFLAGS " in #(
+  *\ -B*\ *) :
+    extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b'
+ ;; #(
+  *) :
+    FFLAGS="$FFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;;
+esac
+fi
+         ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+
+
+
+  for ac_header in $ac_header_list
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+for ac_func in getpagesize
+do :
+  ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
+if test "x$ac_cv_func_getpagesize" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GETPAGESIZE 1
+_ACEOF
+
+fi
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
+$as_echo_n "checking for working mmap... " >&6; }
+if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+	mmap private not fixed
+	mmap private fixed at somewhere currently unmapped
+	mmap private fixed at somewhere already mapped
+	mmap shared not fixed
+	mmap shared fixed at somewhere currently unmapped
+	mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propagated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192	/* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+  char *data, *data2, *data3;
+  const char *cdata2;
+  int i, pagesize;
+  int fd, fd2;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    return 2;
+  if (write (fd, data, pagesize) != pagesize)
+    return 3;
+  close (fd);
+
+  /* Next, check that the tail of a page is zero-filled.  File must have
+     non-zero length, otherwise we risk SIGBUS for entire page.  */
+  fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
+  if (fd2 < 0)
+    return 4;
+  cdata2 = "";
+  if (write (fd2, cdata2, 1) != 1)
+    return 5;
+  data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
+  if (data2 == MAP_FAILED)
+    return 6;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data2 + i))
+      return 7;
+  close (fd2);
+  if (munmap (data2, pagesize))
+    return 8;
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    return 9;
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    return 10;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      return 11;
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    return 12;
+  if (read (fd, data3, pagesize) != pagesize)
+    return 13;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      return 14;
+  close (fd);
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
+$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+$as_echo "#define HAVE_MMAP 1" >>confdefs.h
+
+fi
+rm -f conftest.mmap conftest.txt
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+fi
+
+for ac_header in malloc.h sys/time.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+for ac_header in execinfo.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_execinfo_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_EXECINFO_H 1
+_ACEOF
+
+fi
+
+done
+
+   if test x"$ac_cv_header_execinfo_h" = xyes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking size parameter type for backtrace()" >&5
+$as_echo_n "checking size parameter type for backtrace()... " >&6; }
+if ${ax_cv_proto_backtrace_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+	 for ax_cv_proto_backtrace_type in size_t int none; do
+	   if test "${ax_cv_proto_backtrace_type}" = none; then :
+  ax_cv_proto_backtrace_type= ; break
+fi
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <execinfo.h>
+extern
+${ax_cv_proto_backtrace_type} backtrace(void **addrlist, ${ax_cv_proto_backtrace_type} len);
+char **backtrace_symbols(void *const *buffer, ${ax_cv_proto_backtrace_type} size);
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+	 done
+	 ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_proto_backtrace_type" >&5
+$as_echo "$ax_cv_proto_backtrace_type" >&6; }
+fi
+   if test x${ax_cv_proto_backtrace_type} != x; then :
+
+cat >>confdefs.h <<_ACEOF
+#define backtrace_size_t $ax_cv_proto_backtrace_type
+_ACEOF
+
+fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing backtrace" >&5
+$as_echo_n "checking for library containing backtrace... " >&6; }
+if ${ac_cv_search_backtrace+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char backtrace ();
+int
+main ()
+{
+return backtrace ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' execinfo; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_backtrace=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_backtrace+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_backtrace+:} false; then :
+
+else
+  ac_cv_search_backtrace=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_backtrace" >&5
+$as_echo "$ac_cv_search_backtrace" >&6; }
+ac_res=$ac_cv_search_backtrace
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+   if test x"${ax_cv_proto_backtrace_type}" != x -a x"$ac_cv_header_execinfo_h" = xyes -a x"$ac_cv_search_backtrace" != xno; then :
+
+$as_echo "#define HAVE_BACKTRACE 1" >>confdefs.h
+
+
+fi
+for ac_func in mallinfo pwrite timegm
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline"
+if test "x$ac_cv_func_getline" = xyes; then :
+  $as_echo "#define HAVE_GETLINE 1" >>confdefs.h
+
+else
+  case " $LIBOBJS " in
+  *" getline.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS getline.$ac_objext"
+ ;;
+esac
+
+fi
+
+
+# Sed expression to map a string onto a valid argument string part.
+asx_tr_arg="eval sed 'y%*+%pp%;s%[^-$as_cr_alnum]%-%g'"
+
+have_dce_uuid_c_bindings=no
+   have_util_linux_uuid_c_bindings=no
+   have_ossp_uuid_c_bindings=no
+   # Check whether --enable-util-linux-uuid was given.
+if test "${enable_util_linux_uuid+set}" = set; then :
+  enableval=$enable_util_linux_uuid;
+else
+  enable_util_linux_uuid=auto
+fi
+
+   # Check whether --enable-ossp-uuid was given.
+if test "${enable_ossp_uuid+set}" = set; then :
+  enableval=$enable_ossp_uuid;
+else
+  enable_ossp_uuid=auto
+fi
+
+   # Check whether --enable-dce-uuid was given.
+if test "${enable_dce_uuid+set}" = set; then :
+  enableval=$enable_dce_uuid;
+else
+  enable_dce_uuid=auto
+fi
+
+
+
+# Check whether --with-util-linux-uuid was given.
+if test "${with_util_linux_uuid+set}" = set; then :
+  withval=$with_util_linux_uuid; case $with_util_linux_uuid in #(
+  yes) :
+    enable_ossp_uuid=no enable_dce_uuid=no ;; #(
+  no) :
+    enable_util_linux_uuid=no ;; #(
+  /*) :
+    if test x${with_util_linux_uuid_root+set} != xset; then :
+  with_util_linux_uuid_root=$with_util_linux_uuid
+elif test x"${with_util_linux_uuid_root}" != x"${with_util_linux_uuid}"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "inconsistent directories specified for --with-util-linux-uuid and --with-util-linux-uuid-root
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+         enable_ossp_uuid=no enable_dce_uuid=no ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+# Check whether --with-ossp-uuid was given.
+if test "${with_ossp_uuid+set}" = set; then :
+  withval=$with_ossp_uuid; case $with_ossp_uuid in #(
+  yes) :
+    enable_util_linux_uuid=no enable_dce_uuid=no ;; #(
+  no) :
+    enable_ossp_uuid=no ;; #(
+  /*) :
+    if test x${with_ossp_uuid_root+set} != xset; then :
+  with_ossp_uuid_root=$with_ossp_uuid
+elif test x"${with_ossp_uuid_root}" != x"${with_ossp_uuid}"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "inconsistent directories specified for --with-ossp-uuid and --with-ossp-uuid-root
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+         enable_util_linux_uuid=no enable_dce_uuid=no ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+# Check whether --with-dce-uuid was given.
+if test "${with_dce_uuid+set}" = set; then :
+  withval=$with_dce_uuid; case $with_dce_uuid in #(
+  yes) :
+    enable_util_linux_uuid=no enable_ossp_uuid=no ;; #(
+  no) :
+    enable_dce_uuid=no ;; #(
+  /*) :
+    if test x${with_dce_uuid_root+set} != xset; then :
+  with_dce_uuid_root=$with_dce_uuid
+elif test x"${with_dce_uuid_root}" != x"${with_dce_uuid}"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "inconsistent directories specified for --with-dce-uuid and --with-dce-uuid-root
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+         enable_util_linux_uuid=no enable_ossp_uuid=no ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+   if test x"$enable_util_linux_uuid" != xno; then :
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+                  have_util_linux_uuid_c_bindings=yes
+
+# Check whether --with-util-linux-uuid-root was given.
+if test "${with_util_linux_uuid_root+set}" = set; then :
+  withval=$with_util_linux_uuid_root; UTIL_LINUX_UUIDROOT=$withval
+fi
+
+   if ${UTIL_LINUX_UUIDROOT+:} false; then :
+  if ${UTIL_LINUX_UUID_C_LIB+:} false; then :
+
+else
+  UTIL_LINUX_UUID_C_LIB="-L$UTIL_LINUX_UUIDROOT/lib"
+fi
+      if ${UTIL_LINUX_UUID_C_INCLUDE+:} false; then :
+
+else
+  UTIL_LINUX_UUID_C_INCLUDE="-I$UTIL_LINUX_UUIDROOT/include"
+fi
+fi
+
+# Check whether --with-util-linux-uuid-include was given.
+if test "${with_util_linux_uuid_include+set}" = set; then :
+  withval=$with_util_linux_uuid_include; UTIL_LINUX_UUID_C_INCLUDE="-I$withval"
+fi
+
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid/uuid.h extra include path" >&5
+$as_echo_n "checking for uuid/uuid.h extra include path... " >&6; }
+   if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_uuid_uuid_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_include_search_uuid_uuid_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_uuid_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+#include <uuid/uuid.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_uuid_uuid_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE"
+else
+  	           acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_uuid_uuid_h_SAVE
+fi
+
+   if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+        if test x"$acx_cv_c_include_uuid_uuid_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_uuid_h" >&5
+$as_echo "$acx_cv_c_include_uuid_uuid_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_uuid_uuid_h+:} false; then :
+  UTIL_LINUX_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_uuid_h" | sed -e 's/^ *//;s/ *$//'`
+else
+  have_util_linux_uuid_c_bindings=no;
+fi
+
+
+# Check whether --with-util-linux-uuid-lib was given.
+if test "${with_util_linux_uuid_lib+set}" = set; then :
+  withval=$with_util_linux_uuid_lib; UTIL_LINUX_UUID_C_LIB="-L$withval"
+fi
+
+                  if test "x$have_util_linux_uuid_c_bindings" = xyes; then :
+              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5
+$as_echo_n "checking for library containing uuid_generate... " >&6; }
+   if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_generate ();
+int
+main ()
+{
+return uuid_generate ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' uuid
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$UTIL_LINUX_UUID_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB"
+else
+  acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_generate ();
+int
+main ()
+{
+return uuid_generate ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' uuid
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$UTIL_LINUX_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB $acx_libset"
+else
+  acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_uuid_generate_c+:} false; then :
+  if test x"$acx_cv_option_search_uuid_generate_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_generate_c" >&5
+$as_echo "$acx_cv_option_search_uuid_generate_c" >&6; }
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	have_util_linux_uuid_c_bindings=no
+
+fi
+
+         UTIL_LINUX_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_generate_c" | sed -e 's/^ *//;s/ *$//'`
+
+fi
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+      if test x"$have_util_linux_uuid_c_bindings" = xyes; then :
+  acx_save_CPPFLAGS=$CPPFLAGS
+         CPPFLAGS="$CPPFLAGS $UTIL_LINUX_UUID_C_INCLUDE"
+         for ac_header in uuid/uuid.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_uuid_uuid_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UUID_UUID_H 1
+_ACEOF
+ ac_fn_c_check_decl "$LINENO" "uuid_generate" "ac_cv_have_decl_uuid_generate" "$ac_includes_default
+#include <uuid/uuid.h>
+"
+if test "x$ac_cv_have_decl_uuid_generate" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_UUID_GENERATE $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+else
+  have_util_linux_uuid_c_bindings=no
+fi
+
+else
+  have_util_linux_uuid_c_bindings=no
+fi
+
+done
+
+         CPPFLAGS=$acx_save_CPPFLAGS
+fi
+else
+  have_util_linux_uuid_c_bindings=no
+fi
+   if test x"$enable_ossp_uuid" != xno -a x"$have_util_linux_uuid_c_bindings" = xno; then :
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+                  have_ossp_uuid_c_bindings=yes
+
+# Check whether --with-ossp-uuid-root was given.
+if test "${with_ossp_uuid_root+set}" = set; then :
+  withval=$with_ossp_uuid_root; OSSP_UUIDROOT=$withval
+fi
+
+   if ${OSSP_UUIDROOT+:} false; then :
+  if ${OSSP_UUID_C_LIB+:} false; then :
+
+else
+  OSSP_UUID_C_LIB="-L$OSSP_UUIDROOT/lib"
+fi
+      if ${OSSP_UUID_C_INCLUDE+:} false; then :
+
+else
+  OSSP_UUID_C_INCLUDE="-I$OSSP_UUIDROOT/include"
+fi
+fi
+
+# Check whether --with-ossp-uuid-include was given.
+if test "${with_ossp_uuid_include+set}" = set; then :
+  withval=$with_ossp_uuid_include; OSSP_UUID_C_INCLUDE="-I$withval"
+fi
+
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5
+$as_echo_n "checking for uuid.h extra include path... " >&6; }
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_uuid_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <uuid.h>
+$ac_includes_default
+
+#include <uuid.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_uuid_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE"
+else
+  	           acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_uuid_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_uuid_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_uuid_h_SAVE
+fi
+
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+        if test x"$acx_cv_c_include_uuid_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5
+$as_echo "$acx_cv_c_include_uuid_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  OSSP_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'`
+else
+  have_ossp_uuid_c_bindings=no;
+fi
+
+
+# Check whether --with-ossp-uuid-lib was given.
+if test "${with_ossp_uuid_lib+set}" = set; then :
+  withval=$with_ossp_uuid_lib; OSSP_UUID_C_LIB="-L$withval"
+fi
+
+                  if test "x$have_ossp_uuid_c_bindings" = xyes; then :
+              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5
+$as_echo_n "checking for library containing uuid_create... " >&6; }
+   if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_create ();
+int
+main ()
+{
+return uuid_create ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' ossp-uuid uuid
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$OSSP_UUID_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$OSSP_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB"
+else
+  acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_create ();
+int
+main ()
+{
+return uuid_create ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' ossp-uuid uuid
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$OSSP_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$OSSP_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB $acx_libset"
+else
+  acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  if test x"$acx_cv_option_search_uuid_create_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5
+$as_echo "$acx_cv_option_search_uuid_create_c" >&6; }
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	have_ossp_uuid_c_bindings=no
+
+fi
+
+         OSSP_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'`
+
+fi
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+      if test x"$have_ossp_uuid_c_bindings" = xyes; then :
+  acx_save_CPPFLAGS=$CPPFLAGS
+         CPPFLAGS="${CPPFLAGS+$CPPFLAGS }$OSSP_UUID_C_INCLUDE"
+         for ac_header in uuid.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "#include <uuid.h>
+$ac_includes_default
+"
+if test "x$ac_cv_header_uuid_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UUID_H 1
+_ACEOF
+ ac_fn_c_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "#include <uuid.h>
+$ac_includes_default
+"
+if test "x$ac_cv_have_decl_uuid_create" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_UUID_CREATE $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  ac_fn_c_check_decl "$LINENO" "UUID_MAKE_V5" "ac_cv_have_decl_UUID_MAKE_V5" "#include <uuid.h>
+$ac_includes_default
+"
+if test "x$ac_cv_have_decl_UUID_MAKE_V5" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_UUID_MAKE_V5 $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+else
+  have_ossp_uuid_c_bindings=no
+fi
+
+else
+  have_ossp_uuid_c_bindings=no
+fi
+
+else
+  have_ossp_uuid_c_bindings=no
+fi
+
+done
+
+         CPPFLAGS=$acx_save_CPPFLAGS
+fi
+else
+  have_ossp_uuid_c_bindings=no
+fi
+   # check for DCE uuid_create if util-linux and OSSP variants cannot be found
+   if test x"$enable_dce_uuid" != xno -a x"$have_util_linux_uuid_c_bindings$have_ossp_uuid_c_bindings" = xnono; then :
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+                  have_dce_uuid_c_bindings=yes
+
+# Check whether --with-dce-uuid-root was given.
+if test "${with_dce_uuid_root+set}" = set; then :
+  withval=$with_dce_uuid_root; DCE_UUIDROOT=$withval
+fi
+
+   if ${DCE_UUIDROOT+:} false; then :
+  if ${DCE_UUID_C_LIB+:} false; then :
+
+else
+  DCE_UUID_C_LIB="-L$DCE_UUIDROOT/lib"
+fi
+      if ${DCE_UUID_C_INCLUDE+:} false; then :
+
+else
+  DCE_UUID_C_INCLUDE="-I$DCE_UUIDROOT/include"
+fi
+fi
+
+# Check whether --with-dce-uuid-include was given.
+if test "${with_dce_uuid_include+set}" = set; then :
+  withval=$with_dce_uuid_include; DCE_UUID_C_INCLUDE="-I$withval"
+fi
+
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5
+$as_echo_n "checking for uuid.h extra include path... " >&6; }
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_uuid_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+#include <uuid.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_uuid_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE"
+else
+  	           acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_uuid_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_uuid_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_uuid_h_SAVE
+fi
+
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+        if test x"$acx_cv_c_include_uuid_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5
+$as_echo "$acx_cv_c_include_uuid_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_uuid_h+:} false; then :
+  DCE_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'`
+else
+  have_dce_uuid_c_bindings=no;
+fi
+
+
+# Check whether --with-dce-uuid-lib was given.
+if test "${with_dce_uuid_lib+set}" = set; then :
+  withval=$with_dce_uuid_lib; DCE_UUID_C_LIB="-L$withval"
+fi
+
+                  if test "x$have_dce_uuid_c_bindings" = xyes; then :
+              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5
+$as_echo_n "checking for library containing uuid_create... " >&6; }
+   if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_create ();
+int
+main ()
+{
+return uuid_create ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in ''
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$DCE_UUID_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$DCE_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB"
+else
+  acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char uuid_create ();
+int
+main ()
+{
+return uuid_create ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in ''
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$DCE_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$DCE_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB $acx_libset"
+else
+  acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_uuid_create_c+:} false; then :
+  if test x"$acx_cv_option_search_uuid_create_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5
+$as_echo "$acx_cv_option_search_uuid_create_c" >&6; }
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	have_dce_uuid_c_bindings=no
+
+fi
+
+         DCE_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'`
+
+fi
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+      if test x"$have_dce_uuid_c_bindings" = xyes; then :
+  acx_save_CPPFLAGS=$CPPFLAGS
+         CPPFLAGS="$CPPFLAGS $DCE_UUID_C_INCLUDE"
+         for ac_header in uuid.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_uuid_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_UUID_H 1
+_ACEOF
+ ac_fn_c_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "$ac_includes_default
+#include <uuid.h>
+"
+if test "x$ac_cv_have_decl_uuid_create" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_UUID_CREATE $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  have_dce_uuid_c_bindings=yes
+else
+  have_dce_uuid_c_bindings=no
+fi
+
+else
+  have_dce_uuid_c_bindings=yes
+fi
+
+done
+
+         CPPFLAGS=$acx_save_CPPFLAGS
+fi
+fi
+
+if test x"$have_util_linux_uuid_c_bindings" = xyes; then :
+  UUID_C_INCLUDE=$UTIL_LINUX_UUID_C_INCLUDE
+   UUID_C_LIB=$UTIL_LINUX_UUID_C_LIB
+elif test x"$have_ossp_uuid_c_bindings" = xyes; then :
+  UUID_C_INCLUDE=$OSSP_UUID_C_INCLUDE
+   UUID_C_LIB=$OSSP_UUID_C_LIB
+elif test x"$have_dce_uuid_c_bindings" = xyes; then :
+  UUID_C_INCLUDE=$DCE_UUID_C_INCLUDE
+   UUID_C_LIB=$DCE_UUID_C_LIB
+fi
+
+
+if test -n "$UUID_C_INCLUDE"; then :
+  as_fn_append CPPFLAGS " $UUID_C_INCLUDE"
+fi
+LIBS="$UUID_C_LIB $LIBS"
+ac_fn_c_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "$ac_includes_default
+#include <math.h>
+"
+if test "x$ac_cv_have_decl_isnan" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ISNAN $ac_have_decl
+_ACEOF
+
+ac_fn_c_check_decl "$LINENO" "_SC_LARGE_PAGESIZE" "ac_cv_have_decl__SC_LARGE_PAGESIZE" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl__SC_LARGE_PAGESIZE" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SC_LARGE_PAGESIZE $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "PAGESIZE" "ac_cv_have_decl_PAGESIZE" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl_PAGESIZE" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PAGESIZE $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "PAGE_SIZE" "ac_cv_have_decl_PAGE_SIZE" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl_PAGE_SIZE" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PAGE_SIZE $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "_SC_PAGE_SIZE" "ac_cv_have_decl__SC_PAGE_SIZE" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl__SC_PAGE_SIZE" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SC_PAGE_SIZE $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "_SC_PAGESIZE" "ac_cv_have_decl__SC_PAGESIZE" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl__SC_PAGESIZE" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SC_PAGESIZE $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "_PC_REC_XFER_ALIGN" "ac_cv_have_decl__PC_REC_XFER_ALIGN" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl__PC_REC_XFER_ALIGN" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__PC_REC_XFER_ALIGN $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "POSIX_REC_XFER_ALIGN" "ac_cv_have_decl_POSIX_REC_XFER_ALIGN" "$ac_includes_default
+#include <limits.h>
+#include <unistd.h>
+"
+if test "x$ac_cv_have_decl_POSIX_REC_XFER_ALIGN" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_POSIX_REC_XFER_ALIGN $ac_have_decl
+_ACEOF
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5
+$as_echo_n "checking for library containing floor... " >&6; }
+if ${ac_cv_search_floor+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char floor ();
+int
+main ()
+{
+return floor ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_floor=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_floor+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_floor+:} false; then :
+
+else
+  ac_cv_search_floor=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor" >&5
+$as_echo "$ac_cv_search_floor" >&6; }
+ac_res=$ac_cv_search_floor
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+for builtin in __builtin_ctz
+do :
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __builtin_ctz is declared" >&5
+$as_echo_n "checking whether __builtin_ctz is declared... " >&6; }
+if ${acx_cv_have_decl___builtin_ctz+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+  unsigned lbz = __builtin_ctz(56U)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_cv_have_decl___builtin_ctz=yes
+else
+  acx_cv_have_decl___builtin_ctz=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_decl___builtin_ctz" >&5
+$as_echo "$acx_cv_have_decl___builtin_ctz" >&6; }
+   if test "x$acx_cv_have_decl___builtin_ctz" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___BUILTIN_CTZ 1
+_ACEOF
+
+      break
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___BUILTIN_CTZ 0
+_ACEOF
+
+fi
+done
+
+
+
+#  ----------------------------------------------------------------------
+#  Checks for multithreaded compiling + linking
+
+# Check whether --with-threads was given.
+if test "${with_threads+set}" = set; then :
+  withval=$with_threads;
+else
+  with_threads=yes
+fi
+
+THREADS_INCLUDE=''
+THREADS_LIBS=''
+case $with_threads in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking multithreading" >&5
+$as_echo_n "checking multithreading... " >&6; }
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; } ;; #(
+  yes) :
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+ax_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on Tru64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
+        ax_pthread_save_CC="$CC"
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        if test "x$PTHREAD_CC" != "x"; then :
+  CC="$PTHREAD_CC"
+fi
+        if test "x$PTHREAD_CXX" != "x"; then :
+  CXX="$PTHREAD_CXX"
+fi
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5
+$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+        if test "x$ax_pthread_ok" = "xno"; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        CC="$ax_pthread_save_CC"
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try. Items with a "," contain both
+# C compiler flags (before ",") and linker flags (after ","). Other items
+# starting with a "-" are C compiler flags, and remaining items are
+# library names, except for "none" which indicates that we try without
+# any flags at all, and "pthread-config" which is a program returning
+# the flags for the Pth emulation library.
+
+ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
+#           (Note: HP C rejects this with "bad form for `-t' option")
+# -pthreads: Solaris/gcc (Note: HP C also rejects)
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads and
+#      -D_REENTRANT too), HP C (must be checked before -lpthread, which
+#      is present but should not be used directly; and before -mthreads,
+#      because the compiler interprets this as "-mt" + "-hreads")
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case $host_os in
+
+        freebsd*)
+
+        # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+        # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+
+        ax_pthread_flags="-kthread lthread $ax_pthread_flags"
+        ;;
+
+        hpux*)
+
+        # From the cc(1) man page: "[-mt] Sets various -D flags to enable
+        # multi-threading and also sets -lpthread."
+
+        ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
+        ;;
+
+        openedition*)
+
+        # IBM z/OS requires a feature-test macro to be defined in order to
+        # enable POSIX threads at all, so give the user a hint if this is
+        # not set. (We don't define these ourselves, as they can affect
+        # other portions of the system API in unpredictable ways.)
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#            if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
+             AX_PTHREAD_ZOS_MISSING
+#            endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5
+$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;}
+fi
+rm -f conftest*
+
+        ;;
+
+        solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed. (N.B.: The stubs are missing
+        # pthread_cleanup_push, or rather a function called by this macro,
+        # so we could check for that, but who knows whether they'll stub
+        # that too in a future libc.)  So we'll check first for the
+        # standard Solaris way of linking pthreads (-mt -lpthread).
+
+        ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags"
+        ;;
+esac
+
+# Are we compiling with Clang?
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5
+$as_echo_n "checking whether $CC is Clang... " >&6; }
+if ${ax_cv_PTHREAD_CLANG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_CLANG=no
+     # Note that Autoconf sets GCC=yes for Clang as well as GCC
+     if test "x$GCC" = "xyes"; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
+#            if defined(__clang__) && defined(__llvm__)
+             AX_PTHREAD_CC_IS_CLANG
+#            endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then :
+  ax_cv_PTHREAD_CLANG=yes
+fi
+rm -f conftest*
+
+     fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG" >&6; }
+ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
+
+
+# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
+
+# Note that for GCC and Clang -pthread generally implies -lpthread,
+# except when -nostdlib is passed.
+# This is problematic using libtool to build C++ shared libraries with pthread:
+# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460
+# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333
+# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555
+# To solve this, first try -pthread together with -lpthread for GCC
+
+if test "x$GCC" = "xyes"; then :
+  ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"
+fi
+
+# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first
+
+if test "x$ax_pthread_clang" = "xyes"; then :
+  ax_pthread_flags="-pthread,-lpthread -pthread"
+fi
+
+
+# The presence of a feature test macro requesting re-entrant function
+# definitions is, on some systems, a strong hint that pthreads support is
+# correctly enabled
+
+case $host_os in
+        darwin* | hpux* | linux* | osf* | solaris*)
+        ax_pthread_check_macro="_REENTRANT"
+        ;;
+
+        aix*)
+        ax_pthread_check_macro="_THREAD_SAFE"
+        ;;
+
+        *)
+        ax_pthread_check_macro="--"
+        ;;
+esac
+if test "x$ax_pthread_check_macro" = "x--"; then :
+  ax_pthread_check_cond=0
+else
+  ax_pthread_check_cond="!defined($ax_pthread_check_macro)"
+fi
+
+
+if test "x$ax_pthread_ok" = "xno"; then
+for ax_pthread_try_flag in $ax_pthread_flags; do
+
+        case $ax_pthread_try_flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                *,*)
+                PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"`
+                PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"`
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5
+$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; }
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5
+$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; }
+                PTHREAD_CFLAGS="$ax_pthread_try_flag"
+                ;;
+
+                pthread-config)
+                # Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ax_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ax_pthread_config"; then
+  ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ax_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
+fi
+fi
+ax_pthread_config=$ac_cv_prog_ax_pthread_config
+if test -n "$ax_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
+$as_echo "$ax_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+                if test "x$ax_pthread_config" = "xno"; then :
+  continue
+fi
+                PTHREAD_CFLAGS="`pthread-config --cflags`"
+                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+                ;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5
+$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; }
+                PTHREAD_LIBS="-l$ax_pthread_try_flag"
+                ;;
+        esac
+
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+#                       if $ax_pthread_check_cond
+#                        error "$ax_pthread_check_macro must be defined"
+#                       endif
+                        static void *some_global = NULL;
+                        static void routine(void *a)
+                          {
+                             /* To avoid any unused-parameter or
+                                unused-but-set-parameter warning.  */
+                             some_global = a;
+                          }
+                        static void *start_routine(void *a) { return a; }
+int
+main ()
+{
+pthread_t th; pthread_attr_t attr;
+                        pthread_create(&th, 0, start_routine, 0);
+                        pthread_join(th, 0);
+                        pthread_attr_init(&attr);
+                        pthread_cleanup_push(routine, 0);
+                        pthread_cleanup_pop(0) /* ; */
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
+$as_echo "$ax_pthread_ok" >&6; }
+        if test "x$ax_pthread_ok" = "xyes"; then :
+  break
+fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+
+# Clang needs special handling, because older versions handle the -pthread
+# option in a rather... idiosyncratic way
+
+if test "x$ax_pthread_clang" = "xyes"; then
+
+        # Clang takes -pthread; it has never supported any other flag
+
+        # (Note 1: This will need to be revisited if a system that Clang
+        # supports has POSIX threads in a separate library.  This tends not
+        # to be the way of modern systems, but it's conceivable.)
+
+        # (Note 2: On some systems, notably Darwin, -pthread is not needed
+        # to get POSIX threads support; the API is always present and
+        # active.  We could reasonably leave PTHREAD_CFLAGS empty.  But
+        # -pthread does define _REENTRANT, and while the Darwin headers
+        # ignore this macro, third-party headers might not.)
+
+        # However, older versions of Clang make a point of warning the user
+        # that, in an invocation where only linking and no compilation is
+        # taking place, the -pthread option has no effect ("argument unused
+        # during compilation").  They expect -pthread to be passed in only
+        # when source code is being compiled.
+        #
+        # Problem is, this is at odds with the way Automake and most other
+        # C build frameworks function, which is that the same flags used in
+        # compilation (CFLAGS) are also used in linking.  Many systems
+        # supported by AX_PTHREAD require exactly this for POSIX threads
+        # support, and in fact it is often not straightforward to specify a
+        # flag that is used only in the compilation phase and not in
+        # linking.  Such a scenario is extremely rare in practice.
+        #
+        # Even though use of the -pthread flag in linking would only print
+        # a warning, this can be a nuisance for well-run software projects
+        # that build with -Werror.  So if the active version of Clang has
+        # this misfeature, we search for an option to squash it.
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5
+$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; }
+if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
+             # Create an alternate version of $ac_link that compiles and
+             # links in two steps (.c -> .o, .o -> exe) instead of one
+             # (.c -> exe), because the warning occurs only in the second
+             # step
+             ax_pthread_save_ac_link="$ac_link"
+             ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
+             ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
+             ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
+             ax_pthread_save_CFLAGS="$CFLAGS"
+             for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
+                if test "x$ax_pthread_try" = "xunknown"; then :
+  break
+fi
+                CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
+                ac_link="$ax_pthread_save_ac_link"
+                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_link="$ax_pthread_2step_ac_link"
+                     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int main(void){return 0;}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+             done
+             ac_link="$ax_pthread_save_ac_link"
+             CFLAGS="$ax_pthread_save_CFLAGS"
+             if test "x$ax_pthread_try" = "x"; then :
+  ax_pthread_try=no
+fi
+             ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5
+$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; }
+
+        case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
+                no | unknown) ;;
+                *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
+        esac
+
+fi # $ax_pthread_clang = yes
+
+
+
+# Various other checks:
+if test "x$ax_pthread_ok" = "xyes"; then
+        ax_pthread_save_CFLAGS="$CFLAGS"
+        ax_pthread_save_LIBS="$LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_JOINABLE_ATTR=unknown
+             for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+                 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr = $ax_pthread_attr; return attr /* ; */
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+             done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5
+$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; }
+        if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
+               test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
+               test "x$ax_pthread_joinable_attr_defined" != "xyes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR
+_ACEOF
+
+               ax_pthread_joinable_attr_defined=yes
+
+fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5
+$as_echo_n "checking whether more special flags are required for pthreads... " >&6; }
+if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ax_cv_PTHREAD_SPECIAL_FLAGS=no
+             case $host_os in
+             solaris*)
+             ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
+             ;;
+             esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5
+$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; }
+        if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
+               test "x$ax_pthread_special_flags_added" != "xyes"; then :
+  PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
+               ax_pthread_special_flags_added=yes
+fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
+$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
+if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int i = PTHREAD_PRIO_INHERIT;
+                                               return i;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ax_cv_PTHREAD_PRIO_INHERIT=yes
+else
+  ax_cv_PTHREAD_PRIO_INHERIT=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
+$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
+        if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
+               test "x$ax_pthread_prio_inherit_defined" != "xyes"; then :
+
+$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h
+
+               ax_pthread_prio_inherit_defined=yes
+
+fi
+
+        CFLAGS="$ax_pthread_save_CFLAGS"
+        LIBS="$ax_pthread_save_LIBS"
+
+        # More AIX lossage: compile with *_r variant
+        if test "x$GCC" != "xyes"; then
+            case $host_os in
+                aix*)
+                case "x/$CC" in #(
+  x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
+    #handle absolute path differently from PATH based program lookup
+                     case "x$CC" in #(
+  x/*) :
+
+			   if as_fn_executable_p ${CC}_r; then :
+  PTHREAD_CC="${CC}_r"
+fi
+			   if test "x${CXX}" != "x"; then :
+  if as_fn_executable_p ${CXX}_r; then :
+  PTHREAD_CXX="${CXX}_r"
+fi
+fi
+			  ;; #(
+  *) :
+
+			   for ac_prog in ${CC}_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+
+			   if test "x${CXX}" != "x"; then :
+  for ac_prog in ${CXX}_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CXX"; then
+  ac_cv_prog_PTHREAD_CXX="$PTHREAD_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PTHREAD_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX
+if test -n "$PTHREAD_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5
+$as_echo "$PTHREAD_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CXX" && break
+done
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+fi
+
+                      ;;
+esac
+                     ;; #(
+  *) :
+     ;;
+esac
+                ;;
+            esac
+        fi
+fi
+
+test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
+test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX"
+
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test "x$ax_pthread_ok" = "xyes"; then
+
+$as_echo "#define HAVE_LIBPTHREAD 1" >>confdefs.h
+
+        :
+else
+        ax_pthread_ok=no
+        as_fn_error $? "multithreaded settings NOT found" "$LINENO" 5
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+               LIBS="$PTHREAD_LIBS $LIBS"
+               CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+               CC="$PTHREAD_CC"
+               $as_echo "CC:$CC CFLAGS:$CFLAGS LIBS:$LIBS" >&6 ;; #(
+  *) :
+    THREADS_ROOT=$with_threads
+             LDFLAGS="-L$THREADS_ROOT/lib $LDFLAGS"
+             CPPFLAGS="-I$THREADS_ROOT/include $CPPFLAGS "
+             for ac_header in pthread.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_pthread_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_H 1
+_ACEOF
+
+fi
+
+done
+
+             { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
+if ${ac_cv_lib_pthread_pthread_create+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_create ();
+int
+main ()
+{
+return pthread_create ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pthread_pthread_create=yes
+else
+  ac_cv_lib_pthread_pthread_create=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+fi
+
+             THREADS_LIBS=" -L$THREADS_ROOT/lib -lpthread"
+             THREADS_INCLUDE=" -I$THREADS_ROOT/include" ;; #(
+  *) :
+     ;;
+esac
+
+
+#  ----------------------------------------------------------------------
+#  Compile application with FDB5 library
+FDB5_INCLUDE=''
+FDB5_LIBS=''
+
+# Check whether --with-fdb5 was given.
+if test "${with_fdb5+set}" = set; then :
+  withval=$with_fdb5; case "$with_fdb5" in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5
+$as_echo_n "checking for fdb5 library... " >&6; }
+                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; } ;; #(
+  yes) :
+    for ac_header in fdb5/api/fdb_c.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_FDB5_API_FDB_C_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5
+fi
+
+done
+
+                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5
+$as_echo_n "checking for library containing fdb_initialise... " >&6; }
+if ${ac_cv_search_fdb_initialise+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fdb_initialise ();
+int
+main ()
+{
+return fdb_initialise ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' fdb5; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_fdb_initialise=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_fdb_initialise+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_fdb_initialise+:} false; then :
+
+else
+  ac_cv_search_fdb_initialise=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fdb_initialise" >&5
+$as_echo "$ac_cv_search_fdb_initialise" >&6; }
+ac_res=$ac_cv_search_fdb_initialise
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBFDB5 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to fdb5" "$LINENO" 5
+fi
+
+                            FDB5_LIBS=" -lfdb5" ;; #(
+  *) :
+    FDB5_ROOT=$with_fdb5
+                          if test -d "$FDB5_ROOT"; then :
+  LDFLAGS="-L$FDB5_ROOT/lib $LDFLAGS"
+                                 CPPFLAGS="-I$FDB5_ROOT/include $CPPFLAGS"
+                                 for ac_header in fdb5/api/fdb_c.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_FDB5_API_FDB_C_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5
+fi
+
+done
+
+                                 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5
+$as_echo_n "checking for library containing fdb_initialise... " >&6; }
+if ${ac_cv_search_fdb_initialise+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fdb_initialise ();
+int
+main ()
+{
+return fdb_initialise ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' fdb5; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_fdb_initialise=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_fdb_initialise+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_fdb_initialise+:} false; then :
+
+else
+  ac_cv_search_fdb_initialise=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fdb_initialise" >&5
+$as_echo "$ac_cv_search_fdb_initialise" >&6; }
+ac_res=$ac_cv_search_fdb_initialise
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBFDB5 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to fdb5" "$LINENO" 5
+fi
+
+                                 FDB5_LIBS=" -L$FDB5_ROOT/lib -lfdb5"
+                                 FDB5_INCLUDE=" -I$FDB5_ROOT/include"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: $FDB5_ROOT is not a directory! FDB5 suppressed" >&5
+$as_echo "$as_me: $FDB5_ROOT is not a directory! FDB5 suppressed" >&6;}
+fi ;; #(
+  *) :
+     ;;
+esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5
+$as_echo_n "checking for fdb5 library... " >&6; }
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; }
+fi
+
+
+
+#  ----------------------------------------------------------------------
+#  Compile application with SZLIB library, needed for GRIB1
+SZLIB_INCLUDE=''
+SZLIB_LIBS=''
+
+# Check whether --with-szlib was given.
+if test "${with_szlib+set}" = set; then :
+  withval=$with_szlib; case "$with_szlib" in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5
+$as_echo_n "checking for szlib library... " >&6; }
+                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; } ;; #(
+  yes) :
+    for ac_header in szlib.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_szlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SZLIB_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find szlib.h" "$LINENO" 5
+fi
+
+done
+
+                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5
+$as_echo_n "checking for library containing SZ_BufftoBuffCompress... " >&6; }
+if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SZ_BufftoBuffCompress ();
+int
+main ()
+{
+return SZ_BufftoBuffCompress ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' sz; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_SZ_BufftoBuffCompress=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+
+else
+  ac_cv_search_SZ_BufftoBuffCompress=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SZ_BufftoBuffCompress" >&5
+$as_echo "$ac_cv_search_SZ_BufftoBuffCompress" >&6; }
+ac_res=$ac_cv_search_SZ_BufftoBuffCompress
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBSZ 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to szlib" "$LINENO" 5
+fi
+
+                            SZLIB_LIBS=" -lsz" ;; #(
+  *) :
+    SZLIB_ROOT=$with_szlib
+                          if test -d "$SZLIB_ROOT"; then :
+  LDFLAGS="-L$SZLIB_ROOT/lib $LDFLAGS"
+                                 CPPFLAGS="-I$SZLIB_ROOT/include $CPPFLAGS"
+                                 for ac_header in szlib.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_szlib_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SZLIB_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find szlib.h" "$LINENO" 5
+fi
+
+done
+
+                                 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5
+$as_echo_n "checking for library containing SZ_BufftoBuffCompress... " >&6; }
+if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char SZ_BufftoBuffCompress ();
+int
+main ()
+{
+return SZ_BufftoBuffCompress ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' sz; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_SZ_BufftoBuffCompress=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_SZ_BufftoBuffCompress+:} false; then :
+
+else
+  ac_cv_search_SZ_BufftoBuffCompress=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SZ_BufftoBuffCompress" >&5
+$as_echo "$ac_cv_search_SZ_BufftoBuffCompress" >&6; }
+ac_res=$ac_cv_search_SZ_BufftoBuffCompress
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBSZ 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to szlib" "$LINENO" 5
+fi
+
+                                 SZLIB_LIBS=" -L$SZLIB_ROOT/lib -lsz"
+                                 SZLIB_INCLUDE=" -I$SZLIB_ROOT/include"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&5
+$as_echo "$as_me: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&6;}
+fi ;; #(
+  *) :
+     ;;
+esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5
+$as_echo_n "checking for szlib library... " >&6; }
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; }
+fi
+
+
+
+#  ----------------------------------------------------------------------
+#  Compile application with netcdf
+NETCDF_ROOT=''
+NETCDF_INCLUDE=''
+NETCDF_LIBS=''
+ENABLE_NETCDF=no
+ENABLE_NC2=no
+ENABLE_NC4=no
+ENABLE_NC4HDF5=no
+ENABLE_NC4SZLIB=no
+
+# Check whether --with-netcdf was given.
+if test "${with_netcdf+set}" = set; then :
+  withval=$with_netcdf; case "$with_netcdf" in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5
+$as_echo_n "checking for NetCDF library... " >&6; }
+                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; } ;; #(
+  yes) :
+    for ac_header in netcdf.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_netcdf_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETCDF_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find netcdf.h" "$LINENO" 5
+fi
+
+done
+
+                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5
+$as_echo_n "checking for library containing nc_open... " >&6; }
+if ${ac_cv_search_nc_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nc_open ();
+int
+main ()
+{
+return nc_open ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_nc_open=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_nc_open+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_nc_open+:} false; then :
+
+else
+  ac_cv_search_nc_open=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nc_open" >&5
+$as_echo "$ac_cv_search_nc_open" >&6; }
+ac_res=$ac_cv_search_nc_open
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBNETCDF 1" >>confdefs.h
+
+                                            ENABLE_NETCDF=yes
+else
+  as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5
+fi
+
+                            NETCDF_LIBS=" -lnetcdf"
+                            # Extract the first word of "nc-config", so it can be a program name with args.
+set dummy nc-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NC_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NC_CONFIG"; then
+  ac_cv_prog_NC_CONFIG="$NC_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NC_CONFIG="nc-config"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NC_CONFIG=$ac_cv_prog_NC_CONFIG
+if test -n "$NC_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NC_CONFIG" >&5
+$as_echo "$NC_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ ;; #(
+  *) :
+    if test -d "$with_netcdf"; then :
+  NETCDF_ROOT=$with_netcdf
+                                 LDFLAGS="-L$NETCDF_ROOT/lib $LDFLAGS"
+                                 CPPFLAGS="-I$NETCDF_ROOT/include $CPPFLAGS"
+                                 for ac_header in netcdf.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_netcdf_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETCDF_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find netcdf.h" "$LINENO" 5
+fi
+
+done
+
+                                 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5
+$as_echo_n "checking for library containing nc_open... " >&6; }
+if ${ac_cv_search_nc_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nc_open ();
+int
+main ()
+{
+return nc_open ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_nc_open=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_nc_open+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_nc_open+:} false; then :
+
+else
+  ac_cv_search_nc_open=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nc_open" >&5
+$as_echo "$ac_cv_search_nc_open" >&6; }
+ac_res=$ac_cv_search_nc_open
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBNETCDF 1" >>confdefs.h
+
+                                                 ENABLE_NETCDF=yes
+else
+  as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5
+fi
+
+                                 NETCDF_LIBS=" -L$NETCDF_ROOT/lib -lnetcdf"
+                                 NETCDF_INCLUDE=" -I$NETCDF_ROOT/include"
+                                 # Extract the first word of "nc-config", so it can be a program name with args.
+set dummy nc-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NC_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NC_CONFIG"; then
+  ac_cv_prog_NC_CONFIG="$NC_CONFIG" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in "$NETCDF_ROOT/bin"
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NC_CONFIG="$NETCDF_ROOT/bin/nc-config"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NC_CONFIG=$ac_cv_prog_NC_CONFIG
+if test -n "$NC_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NC_CONFIG" >&5
+$as_echo "$NC_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: $with_netcdf is not a directory! NetCDF suppressed" >&5
+$as_echo "$as_me: $with_netcdf is not a directory! NetCDF suppressed" >&6;}
+fi ;; #(
+  *) :
+     ;;
+esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5
+$as_echo_n "checking for NetCDF library... " >&6; }
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; }
+fi
+
+
+if test "x$ENABLE_NETCDF" = xyes; then :
+  if ${NC_CONFIG:+false} :; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find nc-config! go on with default configuration" >&5
+$as_echo "$as_me: WARNING: Could not find nc-config! go on with default configuration" >&2;}
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's OpenDAP support" >&5
+$as_echo_n "checking netcdf's OpenDAP support... " >&6; }
+if ${acx_cv_have_libnc_dap+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_libnc_dap=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-dap)" = "xyes" && \
+                   acx_cv_have_libnc_dap=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_libnc_dap" >&5
+$as_echo "$acx_cv_have_libnc_dap" >&6; }
+   if test "x$acx_cv_have_libnc_dap" = xyes; then :
+
+$as_echo "#define HAVE_LIBNC_DAP 1" >>confdefs.h
+
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's Zarr support" >&5
+$as_echo_n "checking netcdf's Zarr support... " >&6; }
+if ${acx_cv_have_nczarr+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_nczarr=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-nczarr)" = "xyes" && \
+                   acx_cv_have_nczarr=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_nczarr" >&5
+$as_echo "$acx_cv_have_nczarr" >&6; }
+   if test "x$acx_cv_have_nczarr" = xyes; then :
+
+$as_echo "#define HAVE_NCZARR 1" >>confdefs.h
+
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's nc2 support" >&5
+$as_echo_n "checking netcdf's nc2 support... " >&6; }
+if ${acx_cv_have_netcdf2+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_netcdf2=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-nc2)" = "xyes" && \
+                   acx_cv_have_netcdf2=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_netcdf2" >&5
+$as_echo "$acx_cv_have_netcdf2" >&6; }
+   if test "x$acx_cv_have_netcdf2" = xyes; then :
+
+$as_echo "#define HAVE_NETCDF2 1" >>confdefs.h
+
+              ENABLE_NC2=yes
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's nc4 support" >&5
+$as_echo_n "checking netcdf's nc4 support... " >&6; }
+if ${acx_cv_have_netcdf4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_netcdf4=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-nc4)" = "xyes" && \
+                   acx_cv_have_netcdf4=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_netcdf4" >&5
+$as_echo "$acx_cv_have_netcdf4" >&6; }
+   if test "x$acx_cv_have_netcdf4" = xyes; then :
+
+$as_echo "#define HAVE_NETCDF4 1" >>confdefs.h
+
+              ENABLE_NC4=yes
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's nc4/hdf5 support" >&5
+$as_echo_n "checking netcdf's nc4/hdf5 support... " >&6; }
+if ${acx_cv_have_nc4hdf5+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_nc4hdf5=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-hdf5)" = "xyes" && \
+                   acx_cv_have_nc4hdf5=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_nc4hdf5" >&5
+$as_echo "$acx_cv_have_nc4hdf5" >&6; }
+   if test "x$acx_cv_have_nc4hdf5" = xyes; then :
+
+$as_echo "#define HAVE_NC4HDF5 1" >>confdefs.h
+
+      ENABLE_NC4HDF5=yes
+      ac_fn_c_check_decl "$LINENO" "nc_inq_var_filter" "ac_cv_have_decl_nc_inq_var_filter" "$ac_includes_default
+#include <netcdf.h>
+"
+if test "x$ac_cv_have_decl_nc_inq_var_filter" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_NC_INQ_VAR_FILTER $ac_have_decl
+_ACEOF
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nc_inq_var_filter_ids" >&5
+$as_echo_n "checking for library containing nc_inq_var_filter_ids... " >&6; }
+if ${ac_cv_search_nc_inq_var_filter_ids+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nc_inq_var_filter_ids ();
+int
+main ()
+{
+return nc_inq_var_filter_ids ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_nc_inq_var_filter_ids=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_nc_inq_var_filter_ids+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_nc_inq_var_filter_ids+:} false; then :
+
+else
+  ac_cv_search_nc_inq_var_filter_ids=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nc_inq_var_filter_ids" >&5
+$as_echo "$ac_cv_search_nc_inq_var_filter_ids" >&6; }
+ac_res=$ac_cv_search_nc_inq_var_filter_ids
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  ac_fn_c_check_decl "$LINENO" "nc_inq_var_filter_ids" "ac_cv_have_decl_nc_inq_var_filter_ids" "$ac_includes_default
+#include <netcdf.h>
+#include <netcdf_filter.h>
+"
+if test "x$ac_cv_have_decl_nc_inq_var_filter_ids" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_NC_INQ_VAR_FILTER_IDS $ac_have_decl
+_ACEOF
+
+fi
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ncaux_h5filterspec_parselist" >&5
+$as_echo_n "checking for library containing ncaux_h5filterspec_parselist... " >&6; }
+if ${ac_cv_search_ncaux_h5filterspec_parselist+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ncaux_h5filterspec_parselist ();
+int
+main ()
+{
+return ncaux_h5filterspec_parselist ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_ncaux_h5filterspec_parselist=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_ncaux_h5filterspec_parselist+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_ncaux_h5filterspec_parselist+:} false; then :
+
+else
+  ac_cv_search_ncaux_h5filterspec_parselist=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ncaux_h5filterspec_parselist" >&5
+$as_echo "$ac_cv_search_ncaux_h5filterspec_parselist" >&6; }
+ac_res=$ac_cv_search_ncaux_h5filterspec_parselist
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  ac_fn_c_check_decl "$LINENO" "ncaux_h5filterspec_parselist" "ac_cv_have_decl_ncaux_h5filterspec_parselist" "$ac_includes_default
+#include <netcdf.h>
+#include <netcdf_aux.h>
+"
+if test "x$ac_cv_have_decl_ncaux_h5filterspec_parselist" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_NCAUX_H5FILTERSPEC_PARSELIST $ac_have_decl
+_ACEOF
+
+fi
+
+fi
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking netcdf's nc4/szlib support" >&5
+$as_echo_n "checking netcdf's nc4/szlib support... " >&6; }
+if ${acx_cv_have_nc4szlib+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_nc4szlib=no
+                   test "x$NC_CONFIG" != "x" && \
+                   test "x$($NC_CONFIG --has-szlib)" = "xyes" && \
+                   acx_cv_have_nc4szlib=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_nc4szlib" >&5
+$as_echo "$acx_cv_have_nc4szlib" >&6; }
+   if test "x$acx_cv_have_nc4szlib" = xyes; then :
+
+$as_echo "#define HAVE_NC4SZLIB 1" >>confdefs.h
+
+              ENABLE_NC4SZLIB=yes
+fi
+fi
+
+if test "x$ENABLE_NC4SZLIB" = "xyes"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nc_def_var_szip" >&5
+$as_echo_n "checking for library containing nc_def_var_szip... " >&6; }
+if ${ac_cv_search_nc_def_var_szip+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char nc_def_var_szip ();
+int
+main ()
+{
+return nc_def_var_szip ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_nc_def_var_szip=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_nc_def_var_szip+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_nc_def_var_szip+:} false; then :
+
+else
+  ac_cv_search_nc_def_var_szip=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nc_def_var_szip" >&5
+$as_echo "$ac_cv_search_nc_def_var_szip" >&6; }
+ac_res=$ac_cv_search_nc_def_var_szip
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_NC_DEF_VAR_SZIP 1" >>confdefs.h
+
+fi
+
+fi
+
+if test "x$ENABLE_NC4HDF5" = "xyes"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing H5TS_mutex_lock" >&5
+$as_echo_n "checking for library containing H5TS_mutex_lock... " >&6; }
+if ${ac_cv_search_H5TS_mutex_lock+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char H5TS_mutex_lock ();
+int
+main ()
+{
+return H5TS_mutex_lock ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_H5TS_mutex_lock=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_H5TS_mutex_lock+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_H5TS_mutex_lock+:} false; then :
+
+else
+  ac_cv_search_H5TS_mutex_lock=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_H5TS_mutex_lock" >&5
+$as_echo "$ac_cv_search_H5TS_mutex_lock" >&6; }
+ac_res=$ac_cv_search_H5TS_mutex_lock
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_NC4HDF5_THREADSAFE 1" >>confdefs.h
+
+fi
+
+fi
+
+if test "x$ENABLE_NC4HDF5" = "xyes"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing H5get_libversion" >&5
+$as_echo_n "checking for library containing H5get_libversion... " >&6; }
+if ${ac_cv_search_H5get_libversion+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char H5get_libversion ();
+int
+main ()
+{
+return H5get_libversion ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' netcdf; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_H5get_libversion=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_H5get_libversion+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_H5get_libversion+:} false; then :
+
+else
+  ac_cv_search_H5get_libversion=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_H5get_libversion" >&5
+$as_echo "$ac_cv_search_H5get_libversion" >&6; }
+ac_res=$ac_cv_search_H5get_libversion
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_H5GET_LIBVERSION 1" >>confdefs.h
+
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+#  ----------------------------------------------------------------------
+#  Compile application with ECCODES library (for GRIB2 support)
+ECCODES_INCLUDE=''
+ECCODES_LIBS=''
+
+# Check whether --with-eccodes was given.
+if test "${with_eccodes+set}" = set; then :
+  withval=$with_eccodes; case "$with_eccodes" in #(
+  no) :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ECCODES library" >&5
+$as_echo_n "checking for ECCODES library... " >&6; }
+                           { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; } ;; #(
+  yes) :
+    for ac_header in grib_api.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_grib_api_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GRIB_API_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find grib_api.h" "$LINENO" 5
+fi
+
+done
+
+                            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5
+$as_echo_n "checking for library containing grib_get_message... " >&6; }
+if ${ac_cv_search_grib_get_message+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char grib_get_message ();
+int
+main ()
+{
+return grib_get_message ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' eccodes; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_grib_get_message=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_grib_get_message+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_grib_get_message+:} false; then :
+
+else
+  ac_cv_search_grib_get_message=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_grib_get_message" >&5
+$as_echo "$ac_cv_search_grib_get_message" >&6; }
+ac_res=$ac_cv_search_grib_get_message
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBGRIB_API 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to eccodes library" "$LINENO" 5
+fi
+ ;; #(
+  *) :
+    ECCODES_ROOT=$with_eccodes
+                          if test -d "$ECCODES_ROOT"; then :
+  LDFLAGS="-L$ECCODES_ROOT/lib $LDFLAGS"
+                                 CPPFLAGS="-I$ECCODES_ROOT/include $CPPFLAGS"
+                                 for ac_header in grib_api.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_grib_api_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GRIB_API_H 1
+_ACEOF
+
+else
+  as_fn_error $? "Could not find grib_api.h" "$LINENO" 5
+fi
+
+done
+
+                                 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5
+$as_echo_n "checking for library containing grib_get_message... " >&6; }
+if ${ac_cv_search_grib_get_message+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char grib_get_message ();
+int
+main ()
+{
+return grib_get_message ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' eccodes; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_grib_get_message=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_grib_get_message+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_grib_get_message+:} false; then :
+
+else
+  ac_cv_search_grib_get_message=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_grib_get_message" >&5
+$as_echo "$ac_cv_search_grib_get_message" >&6; }
+ac_res=$ac_cv_search_grib_get_message
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+$as_echo "#define HAVE_LIBGRIB_API 1" >>confdefs.h
+
+else
+  as_fn_error $? "Could not link to eccodes library" "$LINENO" 5
+fi
+
+                                 ECCODES_LIBS=" -L$ECCODES_ROOT/lib -leccodes"
+                                 ECCODES_INCLUDE=" -I$ECCODES_ROOT/include"
+else
+  as_fn_error $? "$ECCODES_ROOT is not a directory! ECCODES suppressed" "$LINENO" 5
+fi ;; #(
+  *) :
+     ;;
+esac
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the ECCODES library" >&5
+$as_echo_n "checking for the ECCODES library... " >&6; }
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
+$as_echo "suppressed" >&6; }
+fi
+
+
+
+ if test "x$with_eccodes" != 'x' -a "x$with_eccodes" != 'xno' ; then
+  HAVE_LIBGRIB_API_TRUE=
+  HAVE_LIBGRIB_API_FALSE='#'
+else
+  HAVE_LIBGRIB_API_TRUE='#'
+  HAVE_LIBGRIB_API_FALSE=
+fi
+
+#  ----------------------------------------------------------------------
+#  Enable GRIB support
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GRIB support" >&5
+$as_echo_n "checking for GRIB support... " >&6; }
+# Check whether --enable-grib was given.
+if test "${enable_grib+set}" = set; then :
+  enableval=$enable_grib; if test "x$enable_grib" != 'xno'; then :
+
+$as_echo "#define HAVE_LIBGRIB 1" >>confdefs.h
+
+                      enable_grib=yes
+fi
+else
+
+$as_echo "#define HAVE_LIBGRIB 1" >>confdefs.h
+
+               enable_grib=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_grib" >&5
+$as_echo "$enable_grib" >&6; }
+ENABLE_GRIB=$enable_grib
+
+#  ----------------------------------------------------------------------
+#  Enable ACROSS support
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ACROSS support" >&5
+$as_echo_n "checking for ACROSS support... " >&6; }
+# Check whether --enable-across was given.
+if test "${enable_across+set}" = set; then :
+  enableval=$enable_across; if test "x$enable_across" != 'xno'; then :
+
+$as_echo "#define HAVE_ACROSS 1" >>confdefs.h
+
+                      enable_across=yes
+fi
+else
+
+$as_echo "#define HAVE_ACROSS 1" >>confdefs.h
+
+               enable_across=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_across" >&5
+$as_echo "$enable_across" >&6; }
+ENABLE_ACROSS=$enable_across
+
+#  ----------------------------------------------------------------------
+#  Compile interface with internal CGRIBEX library
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CGRIBEX support" >&5
+$as_echo_n "checking for CGRIBEX support... " >&6; }
+# Check whether --enable-cgribex was given.
+if test "${enable_cgribex+set}" = set; then :
+  enableval=$enable_cgribex; if test "x$enable_cgribex" != 'xno'; then :
+
+$as_echo "#define HAVE_LIBCGRIBEX 1" >>confdefs.h
+
+                      enable_cgribex=yes
+fi
+else
+
+$as_echo "#define HAVE_LIBCGRIBEX 1" >>confdefs.h
+
+               enable_cgribex=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cgribex" >&5
+$as_echo "$enable_cgribex" >&6; }
+ENABLE_CGRIBEX=$enable_cgribex
+
+#  ----------------------------------------------------------------------
+#  Compile interface with internal SERVICE library
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SERVICE support" >&5
+$as_echo_n "checking for SERVICE support... " >&6; }
+# Check whether --enable-service was given.
+if test "${enable_service+set}" = set; then :
+  enableval=$enable_service; if test "x$enable_service" != 'xno'; then :
+
+$as_echo "#define HAVE_LIBSERVICE 1" >>confdefs.h
+
+                      enable_service=yes
+fi
+else
+
+$as_echo "#define HAVE_LIBSERVICE 1" >>confdefs.h
+
+               enable_service=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_service" >&5
+$as_echo "$enable_service" >&6; }
+ENABLE_SERVICE=$enable_service
+
+#  ----------------------------------------------------------------------
+#  Compile interface with internal EXTRA library
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXTRA support" >&5
+$as_echo_n "checking for EXTRA support... " >&6; }
+# Check whether --enable-extra was given.
+if test "${enable_extra+set}" = set; then :
+  enableval=$enable_extra; if test "x$enable_extra" != 'xno'; then :
+
+$as_echo "#define HAVE_LIBEXTRA 1" >>confdefs.h
+
+                      enable_extra=yes
+fi
+else
+
+$as_echo "#define HAVE_LIBEXTRA 1" >>confdefs.h
+
+               enable_extra=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_extra" >&5
+$as_echo "$enable_extra" >&6; }
+ENABLE_EXTRA=$enable_extra
+
+#  ----------------------------------------------------------------------
+#  Compile interface with internal IEG library
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IEG support" >&5
+$as_echo_n "checking for IEG support... " >&6; }
+# Check whether --enable-ieg was given.
+if test "${enable_ieg+set}" = set; then :
+  enableval=$enable_ieg; if test "x$enable_ieg" != 'xno'; then :
+
+$as_echo "#define HAVE_LIBIEG 1" >>confdefs.h
+
+                      enable_ieg=yes
+fi
+else
+
+$as_echo "#define HAVE_LIBIEG 1" >>confdefs.h
+
+               enable_ieg=yes
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ieg" >&5
+$as_echo "$enable_ieg" >&6; }
+ENABLE_IEG=$enable_ieg
+
+#  ----------------------------------------------------------------------
+# At the moment, there are two possible CDI bindings
+# (default for CDO) linking directly to CDI convenience library with libtool
+# (default for CDI) build and link to a shared CDI library
+if test "x$CDO_DISABLE_CDILIB" = "x1"; then :
+  enable_cdi_lib=no
+else
+  enable_cdi_lib=yes
+fi
+# save CDI binding mode for later automake use
+ if test x$enable_cdi_lib = 'xyes'; then
+  ENABLE_CDI_LIB_TRUE=
+  ENABLE_CDI_LIB_FALSE='#'
+else
+  ENABLE_CDI_LIB_TRUE='#'
+  ENABLE_CDI_LIB_FALSE=
+fi
+
+# create shell variables for the representation of configure results
+if test x$enable_cdi_lib = 'xno'; then :
+  ENABLE_CDI_LIB=false
+
+else
+  ENABLE_CDI_LIB=true
+
+fi
+#  ----------------------------------------------------------------------
+#  Build a static CDI
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for building an additional static CDI binary" >&5
+$as_echo_n "checking for building an additional static CDI binary... " >&6; }
+# Check whether --enable-all-static was given.
+if test "${enable_all_static+set}" = set; then :
+  enableval=$enable_all_static; if test "x$enable_all_static" != "xno"; then :
+  enable_all_static=yes
+else
+  enable_all_static=no
+fi
+else
+  enable_all_static=no
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_all_static" >&5
+$as_echo "$enable_all_static" >&6; }
+ if test x$enable_all_static = 'xyes'; then
+  ENABLE_ALL_STATIC_TRUE=
+  ENABLE_ALL_STATIC_FALSE='#'
+else
+  ENABLE_ALL_STATIC_TRUE='#'
+  ENABLE_ALL_STATIC_FALSE=
+fi
+
+#  ----------------------------------------------------------------------
+#  Build CDO with HIRLAM extensions
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for HIRLAM extensions" >&5
+$as_echo_n "checking for HIRLAM extensions... " >&6; }
+# Check whether --enable-hirlam-extensions was given.
+if test "${enable_hirlam_extensions+set}" = set; then :
+  enableval=$enable_hirlam_extensions; if test "x$enable_hirlam_extensions" != "xno"; then :
+
+$as_echo "#define HIRLAM_EXTENSIONS 1" >>confdefs.h
+
+                     enable_hirlam_extensions=yes
+else
+  enable_hirlam_extensions=no
+fi
+else
+  enable_hirlam_extensions=no
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_hirlam_extensions" >&5
+$as_echo "$enable_hirlam_extensions" >&6; }
+ if test x$enable_hirlam_extensions = 'xyes'; then
+  ENABLE_HIRLAM_EXTENSIONS_TRUE=
+  ENABLE_HIRLAM_EXTENSIONS_FALSE='#'
+else
+  ENABLE_HIRLAM_EXTENSIONS_TRUE='#'
+  ENABLE_HIRLAM_EXTENSIONS_FALSE=
+fi
+
+# ----------------------------------------------------------------------
+# Build CDI application
+# Check whether --enable-cdi-app was given.
+if test "${enable_cdi_app+set}" = set; then :
+  enableval=$enable_cdi_app;
+else
+  enable_cdi_app=yes
+fi
+
+ if test x$enable_cdi_app = 'xyes'; then
+  ENABLE_CDI_APP_TRUE=
+  ENABLE_CDI_APP_FALSE='#'
+else
+  ENABLE_CDI_APP_TRUE='#'
+  ENABLE_CDI_APP_FALSE=
+fi
+
+#
+
+ if test "x$ENABLE_NETCDF" = xyes; then
+  ENABLE_NETCDF_TRUE=
+  ENABLE_NETCDF_FALSE='#'
+else
+  ENABLE_NETCDF_TRUE='#'
+  ENABLE_NETCDF_FALSE=
+fi
+
+for ac_func in grib_get_length
+do :
+  ac_fn_c_check_func "$LINENO" "grib_get_length" "ac_cv_func_grib_get_length"
+if test "x$ac_cv_func_grib_get_length" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_GRIB_GET_LENGTH 1
+_ACEOF
+
+fi
+done
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define COMPILER "$CC $CFLAGS"
+_ACEOF
+
+COMP_VERSION=
+case $CC in #(
+  pgcc*) :
+    COMP_VERSION=`$CC -V | head -2 | tail -n 1` ;; #(
+  *gcc*) :
+    COMP_VERSION=`$CC --version | head -n 1` ;; #(
+  g++*) :
+    COMP_VERSION=`$CC --version | head -n 1` ;; #(
+  clang*) :
+    COMP_VERSION=`$CC --version | head -n 1` ;; #(
+  sxc*) :
+    COMP_VERSION=`$CC -V 2>&1   | tail -n 1` ;; #(
+  xlc*) :
+    COMP_VERSION=`$CC -qversion 2>&1   | head -n 1` ;; #(
+  *) :
+    COMP_VERSION=`$CC -V 2>&1 | sed -n 1p` ;;
+esac
+test -z "$COMP_VERSION" && COMP_VERSION=unknown
+
+cat >>confdefs.h <<_ACEOF
+#define COMP_VERSION "$COMP_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define SYSTEM_TYPE "$ac_cv_build"
+_ACEOF
+
+SYSTEM_TYPE="$ac_cv_build"
+
+
+# Check whether --enable-ppm-dist-array was given.
+if test "${enable_ppm_dist_array+set}" = set; then :
+  enableval=$enable_ppm_dist_array; case $enableval in #(
+  no|auto) :
+     ;; #(
+  *) :
+    if test "x$enable_mpi" = xno; then :
+  as_fn_error $? "usage of the PPM distributed array can be enabled (--enable-ppm-dist-array) only if the parallel I/O with MPI is enabled (--enable-mpi)" "$LINENO" 5
+fi
+      enable_ppm_dist_array=yes ;;
+esac
+else
+  enable_ppm_dist_array=auto
+fi
+
+
+build_pio_fc_programs=no
+have_ppm=no
+HAVE_PPM_DIST_ARRAY=no
+
+
+have_parallel_nc4=no
+if test "x$enable_mpi" = xyes; then :
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+                  have_MPI_c_bindings=yes
+
+# Check whether --with-mpi-root was given.
+if test "${with_mpi_root+set}" = set; then :
+  withval=$with_mpi_root; MPIROOT=$withval
+fi
+
+   if ${MPIROOT+:} false; then :
+  if ${MPI_C_LIB+:} false; then :
+
+else
+  MPI_C_LIB="-L$MPIROOT/lib"
+fi
+      if ${MPI_C_INCLUDE+:} false; then :
+
+else
+  MPI_C_INCLUDE="-I$MPIROOT/include"
+fi
+fi
+
+# Check whether --with-mpi-include was given.
+if test "${with_mpi_include+set}" = set; then :
+  withval=$with_mpi_include; MPI_C_INCLUDE="-I$withval"
+fi
+
+
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpi.h extra include path" >&5
+$as_echo_n "checking for mpi.h extra include path... " >&6; }
+   if ${acx_cv_c_include_mpi_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_mpi_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$MPI_C_INCLUDE $ac_include_search_mpi_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$MPI_C_INCLUDE $ac_res $ac_include_search_mpi_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+#include <mpi.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_mpi_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_mpi_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_mpi_h="$MPI_C_INCLUDE"
+else
+  	           acx_cv_c_include_mpi_h="$MPI_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_mpi_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_mpi_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_mpi_h_SAVE
+fi
+
+   if ${acx_cv_c_include_mpi_h+:} false; then :
+        if test x"$acx_cv_c_include_mpi_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_mpi_h" >&5
+$as_echo "$acx_cv_c_include_mpi_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_mpi_h+:} false; then :
+  MPI_C_INCLUDE=`echo "$acx_cv_c_include_mpi_h" | sed -e 's/^ *//;s/ *$//'`
+else
+  have_MPI_c_bindings=no; { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "required header mpi.h not found or not compilable
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+
+# Check whether --with-mpi-lib was given.
+if test "${with_mpi_lib+set}" = set; then :
+  withval=$with_mpi_lib; MPI_C_LIB="-L$withval"
+fi
+
+                  if test "x$have_MPI_c_bindings" = xyes; then :
+              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing MPI_Waitall" >&5
+$as_echo_n "checking for library containing MPI_Waitall... " >&6; }
+   if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char MPI_Waitall ();
+int
+main ()
+{
+return MPI_Waitall ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' mpi mpich
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$MPI_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$MPI_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB"
+else
+  acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char MPI_Waitall ();
+int
+main ()
+{
+return MPI_Waitall ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' mpi mpich
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$MPI_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$MPI_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB $acx_libset"
+else
+  acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_MPI_Waitall_c+:} false; then :
+  if test x"$acx_cv_option_search_MPI_Waitall_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_MPI_Waitall_c" >&5
+$as_echo "$acx_cv_option_search_MPI_Waitall_c" >&6; }
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	have_MPI_c_bindings=no
+            { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot link C MPI programs
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+         MPI_C_LIB=`echo "$acx_cv_option_search_MPI_Waitall_c" | sed -e 's/^ *//;s/ *$//'`
+
+fi
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+
+   saved_CPPFLAGS=$CPPFLAGS
+   saved_LIBS=$LIBS
+   as_fn_append CPPFLAGS " $MPI_C_INCLUDE"
+   LIBS="$MPI_C_LIB $LIBS"
+   for ac_prog in mpirun mpiexec
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MPI_LAUNCH+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MPI_LAUNCH in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MPI_LAUNCH="$MPI_LAUNCH" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_MPI_LAUNCH="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+MPI_LAUNCH=$ac_cv_path_MPI_LAUNCH
+if test -n "$MPI_LAUNCH"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MPI_LAUNCH" >&5
+$as_echo "$MPI_LAUNCH" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$MPI_LAUNCH" && break
+done
+test -n "$MPI_LAUNCH" || MPI_LAUNCH="true"
+
+
+   if test x"$MPI_LAUNCH" = xtrue; then :
+  MPI_LAUNCH_failMsg="Failed to find MPI launcher"
+else
+  if test x"$cross_compiling" = xno; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MPI_LAUNCH works" >&5
+$as_echo_n "checking if $MPI_LAUNCH works... " >&6; }
+         if test -x `echo "$MPI_LAUNCH" | sed -e 's/[ 	].*//'`; then :
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <mpi.h>
+
+#define xmpi(ret)           \\
+  do {                      \\
+    if (ret != MPI_SUCCESS) \\
+      exit(EXIT_FAILURE);   \\
+  } while (0)
+
+int
+main(int argc, char **argv)
+{
+  xmpi(MPI_Init(&argc, &argv));
+  char *numarg = argv[1];
+  int cmdnum = atoi(numarg);
+  int procnum = 1;
+  xmpi(MPI_Allreduce(MPI_IN_PLACE, &procnum, 1, MPI_INT, MPI_SUM,
+                     MPI_COMM_WORLD));
+  xmpi(MPI_Finalize());
+  return (procnum == cmdnum)?EXIT_SUCCESS:EXIT_FAILURE;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_mpirun_test="$MPI_LAUNCH -n 4 ./conftest$EXEEXT 4"
+               if expr "$ac_link" : '.*/libtool --mode=link' >/dev/null; then :
+  acx_mpirun_test=`echo "$ac_link" | sed -e 's@\(.*/libtool --mode=\)link.*@\1@'`"execute $acx_mpirun_test"
+fi
+               { { echo "running $acx_mpirun_test"; } >&5
+  (LIBC_FATAL_STDERR_=1 $acx_mpirun_test >&2) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+               if test $ac_status -eq 0; then :
+
+else
+  MPI_LAUNCH=true ; MPI_LAUNCH_failMsg="Failed to run MPI programs"
+fi
+else
+  MPI_LAUNCH=true ; MPI_LAUNCH_failMsg="Cannot compile or link simple MPI program"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+            ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+else
+  MPI_LAUNCH_failMsg="Cannot execute $MPI_LAUNCH" ; MPI_LAUNCH=true
+fi
+         if test x"$MPI_LAUNCH" = xtrue; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+fi
+fi
+   if test x"$MPI_LAUNCH" = xtrue; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPI launch command not found or not compilable" >&5
+$as_echo "$as_me: WARNING: MPI launch command not found or not compilable" >&2;}
+else
+  :
+fi
+
+   CPPFLAGS=$saved_CPPFLAGS
+   LIBS=$saved_LIBS
+
+   build_pio_fc_programs=$enable_cf_interface
+   test "x$FC" = xno && build_pio_fc_programs=no
+   if test "x$build_pio_fc_programs" = xyes; then :
+     ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+                           have_MPI_fc_bindings=yes
+
+# Check whether --with-mpi-root was given.
+if test "${with_mpi_root+set}" = set; then :
+  withval=$with_mpi_root; MPIROOT=$withval
+fi
+
+   if ${MPIROOT+:} false; then :
+  if ${MPI_FC_LIB+:} false; then :
+
+else
+  MPI_FC_LIB="-L$MPIROOT/lib"
+fi
+      if ${MPI_FC_MOD+:} false; then :
+
+else
+  MPI_FC_MOD="$FC_MOD_FLAG$MPIROOT/include"
+fi
+fi
+
+# Check whether --with-mpi-fc-mod was given.
+if test "${with_mpi_fc_mod+set}" = set; then :
+  withval=$with_mpi_fc_mod; MPI_FC_MOD="$FC_MOD_FLAG$withval"
+fi
+
+
+
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpi extra module path" >&5
+$as_echo_n "checking for mpi extra module path... " >&6; }
+   if ${acx_cv_fortran_mod_mpi+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_mod_search_FCFLAGS_SAVE=$FCFLAGS
+      for ac_moddir in '' "$MPIROOT/include" "$MPIROOT/lib"
+do :
+  if test -z "$ac_moddir"; then :
+  ac_res="none required"
+           FCFLAGS="$MPI_FC_MOD $ac_mod_search_FCFLAGS_SAVE"
+else
+  ac_res="$FC_MOD_FLAG$ac_moddir"
+           FCFLAGS="$MPI_FC_MOD $ac_res $ac_mod_search_FCFLAGS_SAVE"
+fi
+        ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+   cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use mpi
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  acx_cv_fortran_mod_mpi=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+   if ${acx_cv_fortran_mod_mpi+:} false; then :
+  if test -z "$ac_moddir"; then :
+  acx_cv_fortran_mod_mpi="$MPI_FC_MOD"
+else
+  acx_cv_fortran_mod_mpi="$MPI_FC_MOD $FC_MOD_FLAG$ac_moddir"
+fi
+           break
+fi
+done
+      FCFLAGS=$ac_mod_search_FCFLAGS_SAVE
+fi
+
+   if ${acx_cv_fortran_mod_mpi+:} false; then :
+  if test x"$acx_cv_fortran_mod_mpi" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fortran_mod_mpi" >&5
+$as_echo "$acx_cv_fortran_mod_mpi" >&6; }
+fi
+      MPI_FC_MOD=$acx_cv_fortran_mod_mpi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+      have_MPI_fc_bindings=no; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: required Fortran module mpi not found or not compilable" >&5
+$as_echo "$as_me: WARNING: required Fortran module mpi not found or not compilable" >&2;}
+      build_pio_fc_programs=no
+fi
+
+
+# Check whether --with-mpi-fc-lib was given.
+if test "${with_mpi_fc_lib+set}" = set; then :
+  withval=$with_mpi_fc_lib; MPI_FC_LIB="-L$withval"
+fi
+
+                  if test "x$have_MPI_fc_bindings" = xyes; then :
+           acx_save_FCFLAGS=$FCFLAGS
+         FCFLAGS="$MPI_FC_MOD $FCFLAGS"
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing mpi_waitall" >&5
+$as_echo_n "checking for library containing mpi_waitall... " >&6; }
+   if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use mpi
+      INTEGER :: req(1), stat(mpi_status_size, 1), ierror
+      call mpi_waitall(1, req, stat, ierror)
+      end
+_ACEOF
+   for ac_lib in '' mpi mpi_f90 mpi_f77 mpich
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$MPI_FC_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$MPI_FC_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_fc_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB"
+else
+  acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  break
+fi
+        for acx_libset in "-lmpi_f77 -lmpi" "-lmpi"
+do :
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use mpi
+      INTEGER :: req(1), stat(mpi_status_size, 1), ierror
+      call mpi_waitall(1, req, stat, ierror)
+      end
+_ACEOF
+   for ac_lib in '' mpi mpi_f90 mpi_f77 mpich
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$MPI_FC_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$MPI_FC_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_fc_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB $acx_libset"
+else
+  acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_mpi_waitall_fc+:} false; then :
+  if test x"$acx_cv_option_search_mpi_waitall_fc" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_mpi_waitall_fc" >&5
+$as_echo "$acx_cv_option_search_mpi_waitall_fc" >&6; }
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	have_MPI_fc_bindings=no ; { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot link Fortran MPI programs" >&5
+$as_echo "$as_me: WARNING: cannot link Fortran MPI programs" >&2;}
+      build_pio_fc_programs=no
+fi
+
+         FCFLAGS=$acx_save_FCFLAGS
+         MPI_FC_LIB=`echo "$acx_cv_option_search_mpi_waitall_fc" | sed -e 's/^ *//;s/ *$//'`
+
+fi
+               ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+fi
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+	_pkg_min_version=0.9.0
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+		PKG_CONFIG=""
+	fi
+fi
+            yaxt_c_CFLAGS=$YAXT_C_INCLUDE
+   yaxt_c_LIBS=$YAXT_C_LIB
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt_c" >&5
+$as_echo_n "checking for yaxt_c... " >&6; }
+
+if test -n "$yaxt_c_CFLAGS"; then
+    pkg_cv_yaxt_c_CFLAGS="$yaxt_c_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt_c\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt_c") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_c_CFLAGS=`$PKG_CONFIG --cflags "yaxt_c" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$yaxt_c_LIBS"; then
+    pkg_cv_yaxt_c_LIBS="$yaxt_c_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt_c\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt_c") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_c_LIBS=`$PKG_CONFIG --libs "yaxt_c" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        yaxt_c_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt_c" 2>&1`
+        else
+	        yaxt_c_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt_c" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$yaxt_c_PKG_ERRORS" >&5
+
+	      yaxt_CFLAGS=$YAXT_C_INCLUDE
+      yaxt_LIBS=$YAXT_C_LIB
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5
+$as_echo_n "checking for yaxt... " >&6; }
+
+if test -n "$yaxt_CFLAGS"; then
+    pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$yaxt_LIBS"; then
+    pkg_cv_yaxt_LIBS="$yaxt_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1`
+        else
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$yaxt_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS
+	yaxt_LIBS=$pkg_cv_yaxt_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	YAXT_VERSION=`$PKG_CONFIG --modversion yaxt`
+         YAXT_MAJOR_VERSION=`expr X"$YAXT_VERSION" : "X\([0-9]*\)"`
+         YAXT_MINOR_VERSION=`echo "$YAXT_VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*/\1/'`
+         if test "$YAXT_MAJOR_VERSION" -gt 0 -o "$YAXT_MINOR_VERSION" -gt 4; then :
+  YAXT_C_INCLUDE=$yaxt_CFLAGS
+            YAXT_C_LIB=`echo "$yaxt_LIBS" | sed -e 's/-lyaxt *$/-lyaxt_c/'`
+fi
+fi
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	      yaxt_CFLAGS=$YAXT_C_INCLUDE
+      yaxt_LIBS=$YAXT_C_LIB
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5
+$as_echo_n "checking for yaxt... " >&6; }
+
+if test -n "$yaxt_CFLAGS"; then
+    pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$yaxt_LIBS"; then
+    pkg_cv_yaxt_LIBS="$yaxt_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1`
+        else
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$yaxt_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS
+	yaxt_LIBS=$pkg_cv_yaxt_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	YAXT_VERSION=`$PKG_CONFIG --modversion yaxt`
+         YAXT_MAJOR_VERSION=`expr X"$YAXT_VERSION" : "X\([0-9]*\)"`
+         YAXT_MINOR_VERSION=`echo "$YAXT_VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*/\1/'`
+         if test "$YAXT_MAJOR_VERSION" -gt 0 -o "$YAXT_MINOR_VERSION" -gt 4; then :
+  YAXT_C_INCLUDE=$yaxt_CFLAGS
+            YAXT_C_LIB=`echo "$yaxt_LIBS" | sed -e 's/-lyaxt *$/-lyaxt_c/'`
+fi
+fi
+else
+	yaxt_c_CFLAGS=$pkg_cv_yaxt_c_CFLAGS
+	yaxt_c_LIBS=$pkg_cv_yaxt_c_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	YAXT_C_INCLUDE=$yaxt_c_CFLAGS
+      YAXT_C_LIB=$yaxt_c_LIBS
+fi
+      saved_CPPFLAGS=$CPPFLAGS
+   saved_LIBS=$LIBS
+   as_fn_append CPPFLAGS " $MPI_C_INCLUDE"
+   LIBS="$MPI_C_LIB $LIBS"
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt.h extra include path" >&5
+$as_echo_n "checking for yaxt.h extra include path... " >&6; }
+   if ${acx_cv_c_include_yaxt_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_yaxt_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$YAXT_C_INCLUDE $ac_include_search_yaxt_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$YAXT_C_INCLUDE $ac_res $ac_include_search_yaxt_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+#include <yaxt.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_yaxt_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_yaxt_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_yaxt_h="$YAXT_C_INCLUDE"
+else
+  	           acx_cv_c_include_yaxt_h="$YAXT_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_yaxt_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_yaxt_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_yaxt_h_SAVE
+fi
+
+   if ${acx_cv_c_include_yaxt_h+:} false; then :
+        if test x"$acx_cv_c_include_yaxt_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_yaxt_h" >&5
+$as_echo "$acx_cv_c_include_yaxt_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_yaxt_h+:} false; then :
+  YAXT_C_INCLUDE=$acx_cv_c_include_yaxt_h
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing xt_initialized" >&5
+$as_echo_n "checking for library containing xt_initialized... " >&6; }
+   if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char xt_initialized ();
+int
+main ()
+{
+return xt_initialized ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' yaxt_c yaxt
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$YAXT_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$YAXT_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB"
+else
+  acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char xt_initialized ();
+int
+main ()
+{
+return xt_initialized ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' yaxt_c yaxt
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$YAXT_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$YAXT_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB $acx_libset"
+else
+  acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_xt_initialized_c+:} false; then :
+  if test x"$acx_cv_option_search_xt_initialized_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_xt_initialized_c" >&5
+$as_echo "$acx_cv_option_search_xt_initialized_c" >&6; }
+fi
+	YAXT_C_LIB=$acx_cv_option_search_xt_initialized_c
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot link C YAXT programs
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "required header yaxt.h not found or not compilable
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+   as_fn_append CPPFLAGS " $YAXT_C_INCLUDE"
+   LIBS="$YAXT_C_LIB $LIBS"
+      defined_Xt_uid=no
+   ac_fn_c_check_decl "$LINENO" "MPI_UINT64_T" "ac_cv_have_decl_MPI_UINT64_T" "$ac_includes_default
+#include <mpi.h>
+"
+if test "x$ac_cv_have_decl_MPI_UINT64_T" = xyes; then :
+  $as_echo "#define YAXT_UID_DT MPI_UINT64_T" >>confdefs.h
+
+      defined_Xt_uid=yes
+else
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of Xt_uid" >&5
+$as_echo_n "checking size of Xt_uid... " >&6; }
+if ${ac_cv_sizeof_Xt_uid+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (Xt_uid))" "ac_cv_sizeof_Xt_uid"        "$ac_includes_default
+#include <yaxt.h>
+"; then :
+
+else
+  if test "$ac_cv_type_Xt_uid" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (Xt_uid)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_Xt_uid=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_Xt_uid" >&5
+$as_echo "$ac_cv_sizeof_Xt_uid" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_XT_UID $ac_cv_sizeof_Xt_uid
+_ACEOF
+
+
+      # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+      if test "$ac_cv_sizeof_unsigned_long" -eq "$ac_cv_sizeof_Xt_uid"; then :
+  $as_echo "#define YAXT_UID_DT MPI_UNSIGNED_LONG" >>confdefs.h
+
+         defined_Xt_uid=yes
+else
+  ac_fn_c_check_decl "$LINENO" "MPI_UNSIGNED_LONG_LONG" "ac_cv_have_decl_MPI_UNSIGNED_LONG_LONG" "$ac_includes_default
+#include <mpi.h>
+"
+if test "x$ac_cv_have_decl_MPI_UNSIGNED_LONG_LONG" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MPI_UNSIGNED_LONG_LONG $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long long" >&5
+$as_echo_n "checking size of unsigned long long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_long_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_long_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+_ACEOF
+
+
+            if test "$ac_cv_sizeof_unsigned_long_long" -eq "$ac_cv_sizeof_Xt_uid"; then :
+  $as_echo "#define YAXT_UID_DT MPI_UNSIGNED_LONG_LONG" >>confdefs.h
+
+               defined_Xt_uid=yes
+fi
+fi
+
+fi
+fi
+
+   if test "x$defined_Xt_uid" = xno; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no way to communicate Xt_uid found
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+   { defined_Xt_uid=; unset defined_Xt_uid;}
+   ac_fn_c_check_func "$LINENO" "xt_redist_p2p_aext_new" "ac_cv_func_xt_redist_p2p_aext_new"
+if test "x$ac_cv_func_xt_redist_p2p_aext_new" = xyes; then :
+  # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of MPI_Aint" >&5
+$as_echo_n "checking size of MPI_Aint... " >&6; }
+if ${ac_cv_sizeof_MPI_Aint+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (MPI_Aint))" "ac_cv_sizeof_MPI_Aint"        "$ac_includes_default
+#include <mpi.h>
+"; then :
+
+else
+  if test "$ac_cv_type_MPI_Aint" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (MPI_Aint)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_MPI_Aint=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_MPI_Aint" >&5
+$as_echo "$ac_cv_sizeof_MPI_Aint" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_MPI_AINT $ac_cv_sizeof_MPI_Aint
+_ACEOF
+
+
+      # The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+      if test $ac_cv_sizeof_MPI_Aint -gt $ac_cv_sizeof_int; then :
+
+$as_echo "#define USE_XT_REDIST_P2P_AEXT_NEW 1" >>confdefs.h
+
+fi
+fi
+
+   CPPFLAGS=$saved_CPPFLAGS
+   LIBS=$saved_LIBS
+
+   if test "x$build_pio_fc_programs" = xyes; then :
+                          yaxt_CFLAGS=$YAXT_FC_MOD
+      yaxt_LIBS=$YAXT_FC_LIB
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5
+$as_echo_n "checking for yaxt... " >&6; }
+
+if test -n "$yaxt_CFLAGS"; then
+    pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$yaxt_LIBS"; then
+    pkg_cv_yaxt_LIBS="$yaxt_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1`
+        else
+	        yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$yaxt_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS
+	yaxt_LIBS=$pkg_cv_yaxt_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	YAXT_FC_MOD=$yaxt_CFLAGS
+         YAXT_FC_LIB=$yaxt_LIBS
+fi
+            saved_FCFLAGS=$FCFLAGS
+      saved_LIBS=$LIBS
+      as_fn_append FCFLAGS " $MPI_FC_MOD"
+      LIBS="$MPI_FC_LIB $LIBS"
+      ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for yaxt extra module path" >&5
+$as_echo_n "checking for yaxt extra module path... " >&6; }
+   if ${acx_cv_fortran_mod_yaxt+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_mod_search_FCFLAGS_SAVE=$FCFLAGS
+      for ac_moddir in ''
+do :
+  if test -z "$ac_moddir"; then :
+  ac_res="none required"
+           FCFLAGS="$YAXT_FC_MOD $ac_mod_search_FCFLAGS_SAVE"
+else
+  ac_res="$FC_MOD_FLAG$ac_moddir"
+           FCFLAGS="$YAXT_FC_MOD $ac_res $ac_mod_search_FCFLAGS_SAVE"
+fi
+        ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+   cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use yaxt
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  acx_cv_fortran_mod_yaxt=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile"
+
+   if ${acx_cv_fortran_mod_yaxt+:} false; then :
+  if test -z "$ac_moddir"; then :
+  acx_cv_fortran_mod_yaxt="$YAXT_FC_MOD"
+else
+  acx_cv_fortran_mod_yaxt="$YAXT_FC_MOD $FC_MOD_FLAG$ac_moddir"
+fi
+           break
+fi
+done
+      FCFLAGS=$ac_mod_search_FCFLAGS_SAVE
+fi
+
+   if ${acx_cv_fortran_mod_yaxt+:} false; then :
+  if test x"$acx_cv_fortran_mod_yaxt" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fortran_mod_yaxt" >&5
+$as_echo "$acx_cv_fortran_mod_yaxt" >&6; }
+fi
+      YAXT_FC_MOD=$acx_cv_fortran_mod_yaxt
+         as_fn_append FCFLAGS " $YAXT_FC_MOD"
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing xt_initialized" >&5
+$as_echo_n "checking for library containing xt_initialized... " >&6; }
+   if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use yaxt
+      logical is_initialized
+      is_initialized = xt_initialized()
+      call xt_finalize()
+      end
+_ACEOF
+   for ac_lib in '' yaxt
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$YAXT_FC_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$YAXT_FC_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_fc_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB"
+else
+  acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  break
+fi
+        for acx_libset in "-lyaxt_c"
+do :
+  cat > conftest.$ac_ext <<_ACEOF
+      program conftest
+      use yaxt
+      logical is_initialized
+      is_initialized = xt_initialized()
+      call xt_finalize()
+      end
+_ACEOF
+   for ac_lib in '' yaxt
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$YAXT_FC_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$YAXT_FC_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_fc_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB $acx_libset"
+else
+  acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_xt_initialized_fc+:} false; then :
+  if test x"$acx_cv_option_search_xt_initialized_fc" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_xt_initialized_fc" >&5
+$as_echo "$acx_cv_option_search_xt_initialized_fc" >&6; }
+fi
+	YAXT_FC_LIB=$acx_cv_option_search_xt_initialized_fc
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot link Fortran YAXT programs" >&5
+$as_echo "$as_me: WARNING: cannot link Fortran YAXT programs" >&2;}
+            build_pio_fc_programs=no
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: required Fortran module yaxt not found or not compilable" >&5
+$as_echo "$as_me: WARNING: required Fortran module yaxt not found or not compilable" >&2;}
+         build_pio_fc_programs=no
+fi
+
+      ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+      FCFLAGS=$saved_FCFLAGS
+      LIBS=$saved_LIBS
+fi
+
+            ppm_core_CFLAGS=$PPM_CORE_C_INCLUDE
+   ppm_core_LIBS=$PPM_CORE_C_LIB
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ppm_core" >&5
+$as_echo_n "checking for ppm_core... " >&6; }
+
+if test -n "$ppm_core_CFLAGS"; then
+    pkg_cv_ppm_core_CFLAGS="$ppm_core_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"scales-ppm-core\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "scales-ppm-core") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ppm_core_CFLAGS=`$PKG_CONFIG --cflags "scales-ppm-core" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$ppm_core_LIBS"; then
+    pkg_cv_ppm_core_LIBS="$ppm_core_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"scales-ppm-core\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "scales-ppm-core") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_ppm_core_LIBS=`$PKG_CONFIG --libs "scales-ppm-core" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        ppm_core_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "scales-ppm-core" 2>&1`
+        else
+	        ppm_core_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "scales-ppm-core" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$ppm_core_PKG_ERRORS" >&5
+
+	:
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	:
+else
+	ppm_core_CFLAGS=$pkg_cv_ppm_core_CFLAGS
+	ppm_core_LIBS=$pkg_cv_ppm_core_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	PPM_CORE_C_INCLUDE=$ppm_core_CFLAGS
+      PPM_CORE_C_LIB=$ppm_core_LIBS
+fi
+      saved_CPPFLAGS=$CPPFLAGS
+   saved_LIBS=$LIBS
+   as_fn_append CPPFLAGS " $MPI_C_INCLUDE"
+   LIBS="$MPI_C_LIB $LIBS"
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ppm/ppm.h extra include path" >&5
+$as_echo_n "checking for ppm/ppm.h extra include path... " >&6; }
+   if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+       ac_include_search_ppm_ppm_h_SAVE="$CPPFLAGS"
+            while :; do
+	for ac_incdir in ''
+do :
+  if test -z "$ac_incdir"; then :
+  ac_res="none required"
+	         CPPFLAGS="$PPM_CORE_C_INCLUDE $ac_include_search_ppm_ppm_h_SAVE"
+else
+  ac_res="-I$ac_incdir"
+	         CPPFLAGS="$PPM_CORE_C_INCLUDE $ac_res $ac_include_search_ppm_ppm_h_SAVE"
+fi
+	      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+#include <ppm/ppm.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  acx_cv_c_include_ppm_ppm_h=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+  	        if test -z "$ac_incdir"; then :
+  	           acx_cv_c_include_ppm_ppm_h="$PPM_CORE_C_INCLUDE"
+else
+  	           acx_cv_c_include_ppm_ppm_h="$PPM_CORE_C_INCLUDE -I$ac_incdir"
+fi
+fi
+	      if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+  break
+fi
+done
+	   if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+  break
+fi
+
+	break
+      done
+      CPPFLAGS=$ac_include_search_ppm_ppm_h_SAVE
+fi
+
+   if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+        if test x"$acx_cv_c_include_ppm_ppm_h" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_ppm_ppm_h" >&5
+$as_echo "$acx_cv_c_include_ppm_ppm_h" >&6; }
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+fi
+   if ${acx_cv_c_include_ppm_ppm_h+:} false; then :
+  PPM_CORE_C_INCLUDE=$acx_cv_c_include_ppm_ppm_h
+         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing PPM_initialize" >&5
+$as_echo_n "checking for library containing PPM_initialize... " >&6; }
+   if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_option_func_search_save_LIBS=$LIBS
+      while :; do
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PPM_initialize ();
+int
+main ()
+{
+return PPM_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' scalesppmcore
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$PPM_CORE_C_LIB $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$PPM_CORE_C_LIB $ac_res $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB"
+else
+  acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB -l$ac_lib"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+        if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  break
+fi
+        for acx_libset in ""
+do :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char PPM_initialize ();
+int
+main ()
+{
+return PPM_initialize ();
+  ;
+  return 0;
+}
+_ACEOF
+   for ac_lib in '' scalesppmcore
+do :
+  if test -z "$ac_lib"; then :
+  ac_res="none required"
+         LIBS="$PPM_CORE_C_LIB $acx_libset $acx_option_func_search_save_LIBS"
+else
+  ac_res="-l$ac_lib"
+         LIBS="$PPM_CORE_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS"
+fi
+      if ac_fn_c_try_link "$LINENO"; then :
+  if test x"$ac_res" = x"none required"; then :
+  acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB $acx_libset"
+else
+  acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB -l$ac_lib $acx_libset"
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+      if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  break
+fi
+done
+   rm conftest.$ac_ext
+           if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  break
+fi
+
+done
+        break
+      done
+      LIBS=$acx_option_func_search_save_LIBS
+fi
+
+   if ${acx_cv_option_search_PPM_initialize_c+:} false; then :
+  if test x"$acx_cv_option_search_PPM_initialize_c" = x; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5
+$as_echo "(none required)" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_PPM_initialize_c" >&5
+$as_echo "$acx_cv_option_search_PPM_initialize_c" >&6; }
+fi
+	PPM_CORE_C_LIB=$acx_cv_option_search_PPM_initialize_c
+         have_ppm=yes
+
+$as_echo "#define HAVE_PPM_CORE /**/" >>confdefs.h
+
+         as_fn_append CPPFLAGS " $PPM_CORE_C_INCLUDE"
+         if test "x$enable_ppm_dist_array" != xno; then :
+  for ac_header in ppm/dist_array.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "ppm/dist_array.h" "ac_cv_header_ppm_dist_array_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ppm_dist_array_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PPM_DIST_ARRAY_H 1
+_ACEOF
+ HAVE_PPM_DIST_ARRAY=yes
+fi
+
+done
+
+fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot link C SCALES-PPM-CORE programs" >&5
+$as_echo "$as_me: WARNING: cannot link C SCALES-PPM-CORE programs" >&2;}
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: required header ppm/ppm.h not found or not compilable" >&5
+$as_echo "$as_me: WARNING: required header ppm/ppm.h not found or not compilable" >&2;}
+fi
+
+   CPPFLAGS=$saved_CPPFLAGS
+   LIBS=$saved_LIBS
+
+   if test "x$ENABLE_NETCDF" = xyes; then :
+  for ac_header in netcdf_meta.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netcdf_meta.h" "ac_cv_header_netcdf_meta_h" "$ac_includes_default
+#include <netcdf.h>
+"
+if test "x$ac_cv_header_netcdf_meta_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETCDF_META_H 1
+_ACEOF
+
+fi
+
+done
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking parallel netcdf's pnetcdf support" >&5
+$as_echo_n "checking parallel netcdf's pnetcdf support... " >&6; }
+if ${acx_cv_have_pnetcdf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  acx_cv_have_pnetcdf=no
+         test "x$NC_CONFIG" != "x" && \
+         test "x$($NC_CONFIG --has-pnetcdf)" = "xyes" && \
+         acx_cv_have_pnetcdf=yes
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_pnetcdf" >&5
+$as_echo "$acx_cv_have_pnetcdf" >&6; }
+      if test "x$acx_cv_have_pnetcdf" = xyes; then :
+
+$as_echo "#define HAVE_NETCDF_PAR_PNETCDF 1" >>confdefs.h
+
+fi
+fi
+
+   if test "x$ENABLE_NC4" = xyes && test "x$have_ppm" = xyes; then :
+  saved_CPPFLAGS=$CPPFLAGS
+      as_fn_append CPPFLAGS " $MPI_C_INCLUDE"
+      for ac_header in netcdf_par.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "netcdf_par.h" "ac_cv_header_netcdf_par_h" "$ac_includes_default
+#include <netcdf.h>
+"
+if test "x$ac_cv_header_netcdf_par_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NETCDF_PAR_H 1
+_ACEOF
+
+fi
+
+done
+
+      ac_fn_c_check_decl "$LINENO" "MPI_Bcast" "ac_cv_have_decl_MPI_Bcast" "$ac_includes_default
+#include <netcdf.h>
+#ifdef HAVE_NETCDF_PAR_H
+#include <netcdf_par.h>
+#endif
+"
+if test "x$ac_cv_have_decl_MPI_Bcast" = xyes; then :
+  have_parallel_nc4=yes
+         ac_fn_c_check_decl "$LINENO" "nc_inq_format_extended" "ac_cv_have_decl_nc_inq_format_extended" "$ac_includes_default
+#include <netcdf.h>
+"
+if test "x$ac_cv_have_decl_nc_inq_format_extended" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_NC_INQ_FORMAT_EXTENDED $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: The supplied netCDF library does not support nc_inq_format_extended." >&5
+$as_echo "$as_me: The supplied netCDF library does not support nc_inq_format_extended." >&6;}
+fi
+
+
+$as_echo "#define HAVE_PARALLEL_NC4 1" >>confdefs.h
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: the supplied netCDF library does not support MPI parallel invocations" >&5
+$as_echo "$as_me: WARNING: the supplied netCDF library does not support MPI parallel invocations" >&2;}
+fi
+
+      CPPFLAGS=$saved_CPPFLAGS
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5
+$as_echo_n "checking for thread local storage (TLS) class... " >&6; }
+  if ${ac_cv_tls+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
+       case $ax_tls_keyword in #(
+  none) :
+    ac_cv_tls=none ; break ;; #(
+  *) :
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+int
+main ()
+{
+static  $ax_tls_keyword  int bar;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_tls=$ax_tls_keyword ; break
+else
+  ac_cv_tls=none
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+esac
+    done
+
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
+$as_echo "$ac_cv_tls" >&6; }
+
+  if test "$ac_cv_tls" != "none"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define TLS $ac_cv_tls
+_ACEOF
+
+     :
+else
+  ac_cv_tls=`$CC -qversion 2>&1 | sed -n '/^IBM XL C/{
+n
+s/^Version: \([0-9]*\).*/\1/
+t print
+b
+: print
+p
+}'`
+     if test x"$ac_cv_tls" = x; then :
+  ac_cv_tls=`$CC -V | sed -n '/^pgcc /{
+s/^pgcc \(0-90-9.*\).*/\1/
+p
+}'`
+# pgcc 18.1 and newer support TLS if switched to C11 mode
+        as_arg_v1=$ac_cv_tls
+as_arg_v2=18.9
+awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null
+case $? in #(
+  1) :
+    ac_cv_tls=none ;; #(
+  0) :
+    ac_cv_tls=none ;; #(
+  2) :
+    saved_CFLAGS=$CFLAGS
+   case " $CFLAGS " in #(
+   -c11 ) :
+     ;; #(
+  *) :
+    CFLAGS="$CFLAGS -c11" ;;
+esac
+   if test x"$CFLAGS" = x"$saved_CFLAGS"; then :
+  ac_cv_tls=none
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with -c11 added to CFLAGS" >&5
+$as_echo "$as_me: retrying with -c11 added to CFLAGS" >&6;}
+      { ac_cv_tls=; unset ac_cv_tls;}
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5
+$as_echo_n "checking for thread local storage (TLS) class... " >&6; }
+  if ${ac_cv_tls+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
+       case $ax_tls_keyword in #(
+  none) :
+    ac_cv_tls=none ; break ;; #(
+  *) :
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+int
+main ()
+{
+static  $ax_tls_keyword  int bar;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_tls=$ax_tls_keyword ; break
+else
+  ac_cv_tls=none
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+esac
+    done
+
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
+$as_echo "$ac_cv_tls" >&6; }
+
+  if test "$ac_cv_tls" != "none"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define TLS $ac_cv_tls
+_ACEOF
+
+     :
+else
+  CFLAGS=$saved_CFLAGS
+fi
+
+fi ;; #(
+  *) :
+     ;;
+esac
+elif test "$ac_cv_tls" -gt 7; then :
+  # unless the user already set the -qtls option, add it and retry test
+        saved_CFLAGS=$CFLAGS
+   CFLAGS=`echo "$CFLAGS" | sed -n '/.*-qtls\(=[^ ]*\)\{0,1\}/{
+p
+q
+}
+s/$/ -qtls=initial-exec/
+p
+q
+'`
+   if test x"$CFLAGS" = x"$saved_CFLAGS"; then :
+  ac_cv_tls=none
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: retrying with -qtls=initial-exec added to CFLAGS" >&5
+$as_echo "$as_me: retrying with -qtls=initial-exec added to CFLAGS" >&6;}
+      { ac_cv_tls=; unset ac_cv_tls;}
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5
+$as_echo_n "checking for thread local storage (TLS) class... " >&6; }
+  if ${ac_cv_tls+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do
+       case $ax_tls_keyword in #(
+  none) :
+    ac_cv_tls=none ; break ;; #(
+  *) :
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+int
+main ()
+{
+static  $ax_tls_keyword  int bar;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_tls=$ax_tls_keyword ; break
+else
+  ac_cv_tls=none
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+esac
+    done
+
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5
+$as_echo "$ac_cv_tls" >&6; }
+
+  if test "$ac_cv_tls" != "none"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define TLS $ac_cv_tls
+_ACEOF
+
+     :
+else
+  CFLAGS=$saved_CFLAGS
+fi
+
+fi
+
+else
+  ac_cv_tls=none
+fi
+fi
+
+
+
+fi
+
+   LIBRT=''
+
+   ac_fn_c_check_decl "$LINENO" "_POSIX_ASYNCHRONOUS_IO" "ac_cv_have_decl__POSIX_ASYNCHRONOUS_IO" "$ac_includes_default"
+if test "x$ac_cv_have_decl__POSIX_ASYNCHRONOUS_IO" = xyes; then :
+  saved_LIBS=$LIBS
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing aio_suspend" >&5
+$as_echo_n "checking for library containing aio_suspend... " >&6; }
+if ${ac_cv_search_aio_suspend+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char aio_suspend ();
+int
+main ()
+{
+return aio_suspend ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_aio_suspend=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_aio_suspend+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_aio_suspend+:} false; then :
+
+else
+  ac_cv_search_aio_suspend=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_aio_suspend" >&5
+$as_echo "$ac_cv_search_aio_suspend" >&6; }
+ac_res=$ac_cv_search_aio_suspend
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  test "$ac_res" = "none required" || LIBRT=$ac_res
+fi
+
+      LIBS=$saved_LIBS
+fi
+
+else
+  YAXT_C_INCLUDE=; YAXT_C_LIB=
+   MPI_C_INCLUDE=; MPI_C_LIB=
+fi
+case "$enable_ppm_dist_array$HAVE_PPM_DIST_ARRAY" in #(
+  yesyes|no*) :
+     ;; #(
+  auto*) :
+    enable_ppm_dist_array=$HAVE_PPM_DIST_ARRAY ;; #(
+  *) :
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "usage of the PPM distributed array is requested but the required headers and libraries are not found
+See \`config.log' for more details" "$LINENO" 5; } ;;
+esac
+if test "x$have_ppm" = xno; then :
+  PPM_CORE_C_INCLUDE=; PPM_CORE_C_LIB=
+fi
+if test "x$build_pio_fc_programs" = xno; then :
+  YAXT_FC_MOD=; YAXT_FC_LIB=
+   MPI_FC_MOD=; MPI_FC_LIB=
+fi
+ if test "x$build_pio_fc_programs" = xyes; then
+  BUILD_PIO_FC_PROGRAMS_TRUE=
+  BUILD_PIO_FC_PROGRAMS_FALSE='#'
+else
+  BUILD_PIO_FC_PROGRAMS_TRUE='#'
+  BUILD_PIO_FC_PROGRAMS_FALSE=
+fi
+
+ if test "x$enable_mpi" = xyes; then
+  ENABLE_MPI_TRUE=
+  ENABLE_MPI_FALSE='#'
+else
+  ENABLE_MPI_TRUE='#'
+  ENABLE_MPI_FALSE=
+fi
+
+ if test "x$have_parallel_nc4" = xyes; then
+  HAVE_PARALLEL_NC4_TRUE=
+  HAVE_PARALLEL_NC4_FALSE='#'
+else
+  HAVE_PARALLEL_NC4_TRUE='#'
+  HAVE_PARALLEL_NC4_FALSE=
+fi
+
+
+
+SWIG=${SWIG-"${am_missing_run}swig"}
+
+
+if test "x$enable_ruby_interface" = xyes; then :
+
+   for ac_prog in ruby
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RUBY+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $RUBY in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_RUBY="$RUBY" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_RUBY="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+RUBY=$ac_cv_path_RUBY
+if test -n "$RUBY"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5
+$as_echo "$RUBY" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$RUBY" && break
+done
+
+   ruby_CPPFLAGS=`$RUBY $srcdir/config/interface.rb 2>/dev/null`
+   if test $? -ne 0; then :
+  as_fn_error $? "Ruby interface is requested but the Ruby interpreter is not found" "$LINENO" 5
+fi
+   saved_CPPFLAGS=$CPPFLAGS
+   as_fn_append CPPFLAGS " $ruby_CPPFLAGS"
+   ac_fn_c_check_header_compile "$LINENO" "ruby.h" "ac_cv_header_ruby_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_ruby_h" = xyes; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Ruby interface is requested but the required header ruby.h not found or not compilable
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+
+   CPPFLAGS=$saved_CPPFLAGS
+else
+
+RUBY=${RUBY-"${am_missing_run}ruby"}
+
+fi
+ if test "x$enable_ruby_interface" = xyes; then
+  ENABLE_RUBY_INTERFACE_TRUE=
+  ENABLE_RUBY_INTERFACE_FALSE='#'
+else
+  ENABLE_RUBY_INTERFACE_TRUE='#'
+  ENABLE_RUBY_INTERFACE_FALSE=
+fi
+
+
+if test "x$enable_python_interface" = xyes; then :
+    if ${PYTHON+:} false; then :
+  case $PYTHON in #(
+  [\\/]* | ?:[\\/]*) :
+     ;; #(
+  *) :
+    PYTHON= ;;
+esac
+fi
+
+
+
+
+
+
+        # Find any Python interpreter.
+    if test -z "$PYTHON"; then
+      for ac_prog in python python2 python3  python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3  python3.2 python3.1 python3.0  python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1  python2.0
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PYTHON" && break
+done
+test -n "$PYTHON" || PYTHON=":"
+
+    fi
+    am_display_PYTHON=python
+
+
+  if test "$PYTHON" = :; then
+      :
+  else
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
+$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
+if ${am_cv_python_version+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
+$as_echo "$am_cv_python_version" >&6; }
+  PYTHON_VERSION=$am_cv_python_version
+
+
+
+  PYTHON_PREFIX='${prefix}'
+
+  PYTHON_EXEC_PREFIX='${exec_prefix}'
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
+$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
+if ${am_cv_python_platform+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
+$as_echo "$am_cv_python_platform" >&6; }
+  PYTHON_PLATFORM=$am_cv_python_platform
+
+
+  # Just factor out some code duplication.
+  am_python_setup_sysconfig="\
+import sys
+# Prefer sysconfig over distutils.sysconfig, for better compatibility
+# with python 3.x.  See automake bug#10227.
+try:
+    import sysconfig
+except ImportError:
+    can_use_sysconfig = 0
+else:
+    can_use_sysconfig = 1
+# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
+# <https://github.com/pypa/virtualenv/issues/118>
+try:
+    from platform import python_implementation
+    if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
+        can_use_sysconfig = 0
+except ImportError:
+    pass"
+
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
+$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
+if ${am_cv_python_pythondir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	  ;;
+       esac
+       ;;
+     esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
+$as_echo "$am_cv_python_pythondir" >&6; }
+  pythondir=$am_cv_python_pythondir
+
+
+
+  pkgpythondir=\${pythondir}/$PACKAGE
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
+$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
+if ${am_cv_python_pyexecdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "
+$am_python_setup_sysconfig
+if can_use_sysconfig:
+    sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
+else:
+    from distutils import sysconfig
+    sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
+sys.stdout.write(sitedir)"`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	   ;;
+       esac
+       ;;
+     esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
+$as_echo "$am_cv_python_pyexecdir" >&6; }
+  pyexecdir=$am_cv_python_pyexecdir
+
+
+
+  pkgpyexecdir=\${pyexecdir}/$PACKAGE
+
+
+
+  fi
+
+
+   if $PYTHON -c 'import sys' >/dev/null 2>&1; then :
+
+else
+  as_fn_error $? "Python interface is requested but the Python interpreter is not found" "$LINENO" 5
+fi
+   PYTHON_EXTRA_LDFLAGS=${PYTHON_EXTRA_LDFLAGS-' '}
+   PYTHON_EXTRA_LIBS=${PYTHON_EXTRA_LIBS-' '}
+
+	#
+	# Allow the use of a (user set) custom python version
+	#
+
+
+	# Extract the first word of "python[$PYTHON_VERSION]", so it can be a program name with args.
+set dummy python$PYTHON_VERSION; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+	if test -z "$PYTHON"; then
+	   as_fn_error $? "Cannot find python$PYTHON_VERSION in your system path" "$LINENO" 5
+	   PYTHON_VERSION=""
+	fi
+
+	#
+	# Check for a version of Python >= 2.1.0
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.1.0'" >&5
+$as_echo_n "checking for a version of Python >= '2.1.0'... " >&6; }
+	ac_supports_python_ver=`$PYTHON -c "import sys; \
+		ver = sys.version.split ()[0]; \
+		print (ver >= '2.1.0')"`
+	if test "$ac_supports_python_ver" != "True"; then
+		if test -z "$PYTHON_NOVERSIONCHECK"; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+			{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "
+This version of the AC_PYTHON_DEVEL macro
+doesn't work properly with versions of Python before
+2.1.0. You may need to re-run configure, setting the
+variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG,
+PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
+Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
+to something else than an empty string.
+
+See \`config.log' for more details" "$LINENO" 5; }
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: skip at user request" >&5
+$as_echo "skip at user request" >&6; }
+		fi
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	fi
+
+	#
+	# If the macro parameter ``version'' is set, honour it.
+	# A Python shim class, VPy, is used to implement correct version comparisons via
+	# string expressions, since e.g. a naive textual ">= 2.7.3" won't work for
+	# Python 2.7.10 (the ".1" being evaluated as less than ".3").
+	#
+	if test -n ""; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a version of Python " >&5
+$as_echo_n "checking for a version of Python ... " >&6; }
+                cat << EOF > ax_python_devel_vpy.py
+class VPy:
+    def vtup(self, s):
+        return tuple(map(int, s.strip().replace("rc", ".").split(".")))
+    def __init__(self):
+        import sys
+        self.vpy = tuple(sys.version_info)
+    def __eq__(self, s):
+        return self.vpy == self.vtup(s)
+    def __ne__(self, s):
+        return self.vpy != self.vtup(s)
+    def __lt__(self, s):
+        return self.vpy < self.vtup(s)
+    def __gt__(self, s):
+        return self.vpy > self.vtup(s)
+    def __le__(self, s):
+        return self.vpy <= self.vtup(s)
+    def __ge__(self, s):
+        return self.vpy >= self.vtup(s)
+EOF
+		ac_supports_python_ver=`$PYTHON -c "import ax_python_devel_vpy; \
+                        ver = ax_python_devel_vpy.VPy(); \
+			print (ver )"`
+                rm -rf ax_python_devel_vpy*.py* __pycache__/ax_python_devel_vpy*.py*
+		if test "$ac_supports_python_ver" = "True"; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		else
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+			as_fn_error $? "this package requires Python .
+If you have it installed, but it isn't the default Python
+interpreter in your system path, please pass the PYTHON_VERSION
+variable to configure. See \`\`configure --help'' for reference.
+" "$LINENO" 5
+			PYTHON_VERSION=""
+		fi
+	fi
+
+	#
+	# Check if you have distutils, else fail
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the sysconfig Python package" >&5
+$as_echo_n "checking for the sysconfig Python package... " >&6; }
+	ac_sysconfig_result=`$PYTHON -c "import sysconfig" 2>&1`
+	if test $? -eq 0; then
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+		IMPORT_SYSCONFIG="import sysconfig"
+	else
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the distutils Python package" >&5
+$as_echo_n "checking for the distutils Python package... " >&6; }
+		ac_sysconfig_result=`$PYTHON -c "from distutils import sysconfig" 2>&1`
+		if test $? -eq 0; then
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+			IMPORT_SYSCONFIG="from distutils import sysconfig"
+		else
+			as_fn_error $? "cannot import Python module \"distutils\".
+Please check your Python installation. The error was:
+$ac_sysconfig_result" "$LINENO" 5
+			PYTHON_VERSION=""
+		fi
+	fi
+
+	#
+	# Check for Python include path
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python include path" >&5
+$as_echo_n "checking for Python include path... " >&6; }
+	if test -z "$PYTHON_CPPFLAGS"; then
+		if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+			# sysconfig module has different functions
+			python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_path ('include'));"`
+			plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_path ('platinclude'));"`
+		else
+			# old distutils way
+			python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_python_inc ());"`
+			plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_python_inc (plat_specific=1));"`
+		fi
+		if test -n "${python_path}"; then
+			if test "${plat_python_path}" != "${python_path}"; then
+				python_path="-I$python_path -I$plat_python_path"
+			else
+				python_path="-I$python_path"
+			fi
+		fi
+		PYTHON_CPPFLAGS=$python_path
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5
+$as_echo "$PYTHON_CPPFLAGS" >&6; }
+
+
+	#
+	# Check for Python library path
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library path" >&5
+$as_echo_n "checking for Python library path... " >&6; }
+	if test -z "$PYTHON_LIBS"; then
+		# (makes two attempts to ensure we've got a version number
+		# from the interpreter)
+		ac_python_version=`cat<<EOD | $PYTHON -
+
+# join all versioning strings, on some systems
+# major/minor numbers could be in different list elements
+from sysconfig import *
+e = get_config_var('VERSION')
+if e is not None:
+	print(e)
+EOD`
+
+		if test -z "$ac_python_version"; then
+			if test -n "$PYTHON_VERSION"; then
+				ac_python_version=$PYTHON_VERSION
+			else
+				ac_python_version=`$PYTHON -c "import sys; \
+					print ("%d.%d" % sys.version_info[:2])"`
+			fi
+		fi
+
+		# Make the versioning information available to the compiler
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_PYTHON "$ac_python_version"
+_ACEOF
+
+
+		# First, the library directory:
+		ac_python_libdir=`cat<<EOD | $PYTHON -
+
+# There should be only one
+$IMPORT_SYSCONFIG
+e = sysconfig.get_config_var('LIBDIR')
+if e is not None:
+	print (e)
+EOD`
+
+		# Now, for the library:
+		ac_python_library=`cat<<EOD | $PYTHON -
+
+$IMPORT_SYSCONFIG
+c = sysconfig.get_config_vars()
+if 'LDVERSION' in c:
+	print ('python'+c['LDVERSION'])
+else:
+	print ('python'+c['VERSION'])
+EOD`
+
+		# This small piece shamelessly adapted from PostgreSQL python macro;
+		# credits goes to momjian, I think. I'd like to put the right name
+		# in the credits, if someone can point me in the right direction... ?
+		#
+		if test -n "$ac_python_libdir" -a -n "$ac_python_library"
+		then
+			# use the official shared library
+			ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"`
+			PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library"
+		else
+			# old way: use libpython from python_configdir
+			ac_python_libdir=`$PYTHON -c \
+			  "from sysconfig import get_python_lib as f; \
+			  import os; \
+			  print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"`
+			PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version"
+		fi
+
+		if test -z "PYTHON_LIBS"; then
+			as_fn_error $? "
+  Cannot determine location of your Python DSO. Please check it was installed with
+  dynamic libraries enabled, or try setting PYTHON_LIBS by hand.
+			" "$LINENO" 5
+		fi
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_LIBS" >&5
+$as_echo "$PYTHON_LIBS" >&6; }
+
+
+	#
+	# Check for site packages
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python site-packages path" >&5
+$as_echo_n "checking for Python site-packages path... " >&6; }
+	if test -z "$PYTHON_SITE_PKG"; then
+		if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+			PYTHON_SITE_PKG=`$PYTHON -c "
+$IMPORT_SYSCONFIG;
+if hasattr(sysconfig, 'get_default_scheme'):
+    scheme = sysconfig.get_default_scheme()
+else:
+    scheme = sysconfig._get_default_scheme()
+if scheme == 'posix_local':
+    # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+    scheme = 'posix_prefix'
+prefix = '$prefix'
+if prefix == 'NONE':
+    prefix = '$ac_default_prefix'
+sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix})
+print(sitedir)"`
+		else
+			# distutils.sysconfig way
+			PYTHON_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_python_lib(0,0));"`
+		fi
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5
+$as_echo "$PYTHON_SITE_PKG" >&6; }
+
+
+	#
+	# Check for platform-specific site packages
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python platform specific site-packages path" >&5
+$as_echo_n "checking for Python platform specific site-packages path... " >&6; }
+	if test -z "$PYTHON_PLATFORM_SITE_PKG"; then
+		if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then
+			PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c "
+$IMPORT_SYSCONFIG;
+if hasattr(sysconfig, 'get_default_scheme'):
+    scheme = sysconfig.get_default_scheme()
+else:
+    scheme = sysconfig._get_default_scheme()
+if scheme == 'posix_local':
+    # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/
+    scheme = 'posix_prefix'
+prefix = '$prefix'
+if prefix == 'NONE':
+    prefix = '$ac_default_prefix'
+sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase': prefix})
+print(sitedir)"`
+		else
+			# distutils.sysconfig way
+			PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+				print (sysconfig.get_python_lib(1,0));"`
+		fi
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_PLATFORM_SITE_PKG" >&5
+$as_echo "$PYTHON_PLATFORM_SITE_PKG" >&6; }
+
+
+	#
+	# libraries which must be linked in when embedding
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra libraries" >&5
+$as_echo_n "checking python extra libraries... " >&6; }
+	if test -z "$PYTHON_EXTRA_LIBS"; then
+	   PYTHON_EXTRA_LIBS=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+                conf = sysconfig.get_config_var; \
+                print (conf('LIBS') + ' ' + conf('SYSLIBS'))"`
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LIBS" >&5
+$as_echo "$PYTHON_EXTRA_LIBS" >&6; }
+
+
+	#
+	# linking flags needed when embedding
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking python extra linking flags" >&5
+$as_echo_n "checking python extra linking flags... " >&6; }
+	if test -z "$PYTHON_EXTRA_LDFLAGS"; then
+		PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "$IMPORT_SYSCONFIG; \
+			conf = sysconfig.get_config_var; \
+			print (conf('LINKFORSHARED'))"`
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LDFLAGS" >&5
+$as_echo "$PYTHON_EXTRA_LDFLAGS" >&6; }
+
+
+	#
+	# final check to see if everything compiles alright
+	#
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking consistency of all components of python development environment" >&5
+$as_echo_n "checking consistency of all components of python development environment... " >&6; }
+	# save current global flags
+	ac_save_LIBS="$LIBS"
+	ac_save_LDFLAGS="$LDFLAGS"
+	ac_save_CPPFLAGS="$CPPFLAGS"
+	LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS"
+	LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS"
+	CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
+	ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+		#include <Python.h>
+int
+main ()
+{
+Py_Initialize();
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  pythonexists=yes
+else
+  pythonexists=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link"
+ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile"
+
+	# turn back to default flags
+	CPPFLAGS="$ac_save_CPPFLAGS"
+	LIBS="$ac_save_LIBS"
+	LDFLAGS="$ac_save_LDFLAGS"
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pythonexists" >&5
+$as_echo "$pythonexists" >&6; }
+
+	if test ! "x$pythonexists" = "xyes"; then
+	   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "
+  Could not link test program to Python. Maybe the main Python library has been
+  installed in some non-standard library path. If so, pass it to configure,
+  via the LIBS environment variable.
+  Example: ./configure LIBS=\"-L/usr/non-standard-path/python/lib\"
+  ============================================================================
+   ERROR!
+   You probably have to install the development version of the Python package
+   for your distribution.  The exact name of this package varies among them.
+  ============================================================================
+
+See \`config.log' for more details" "$LINENO" 5; }
+	  PYTHON_VERSION=""
+	fi
+
+	#
+	# all done!
+	#
+
+fi
+ if test "x$enable_python_interface" = xyes; then
+  ENABLE_PYTHON_INTERFACE_TRUE=
+  ENABLE_PYTHON_INTERFACE_FALSE='#'
+else
+  ENABLE_PYTHON_INTERFACE_TRUE='#'
+  ENABLE_PYTHON_INTERFACE_FALSE=
+fi
+
+
+
+# Check whether --with-on-demand-check-programs was given.
+if test "${with_on_demand_check_programs+set}" = set; then :
+  withval=$with_on_demand_check_programs; test "x$withval" != xno && with_on_demand_check_programs=yes
+else
+  with_on_demand_check_programs=no
+fi
+
+ if test "x$with_on_demand_check_programs" = xyes; then
+  with_on_demand_check_programs_TRUE=
+  with_on_demand_check_programs_FALSE='#'
+else
+  with_on_demand_check_programs_TRUE='#'
+  with_on_demand_check_programs_FALSE=
+fi
+
+
+
+# Check whether --with-concurrent-mpi-checks was given.
+if test "${with_concurrent_mpi_checks+set}" = set; then :
+  withval=$with_concurrent_mpi_checks; test "x$withval" != xno && with_concurrent_mpi_checks=yes
+else
+  with_concurrent_mpi_checks=no
+fi
+
+ if test "x$with_concurrent_mpi_checks" = xyes; then
+  with_concurrent_mpi_checks_TRUE=
+  with_concurrent_mpi_checks_FALSE='#'
+else
+  with_concurrent_mpi_checks_TRUE='#'
+  with_concurrent_mpi_checks_FALSE=
+fi
+
+
+
+# Check whether --with-example-programs was given.
+if test "${with_example_programs+set}" = set; then :
+  withval=$with_example_programs; test "x$withval" != xno && with_example_programs=yes
+else
+  with_example_programs=yes
+fi
+
+ if test "x$with_example_programs" = xyes; then
+  with_example_programs_TRUE=
+  with_example_programs_FALSE='#'
+else
+  with_example_programs_TRUE='#'
+  with_example_programs_FALSE=
+fi
+
+
+
+
+if test "x$enable_mpi" = xyes; then :
+  ENABLE_MPI=true
+else
+  ENABLE_MPI=false
+fi
+
+
+if test "x$have_parallel_nc4" = xyes; then :
+  HAVE_PARALLEL_NC4=1
+else
+  HAVE_PARALLEL_NC4=0
+fi
+
+
+if test "x$enable_ruby_interface" = xyes; then :
+  ENABLE_RUBY_INTERFACE=true
+else
+  ENABLE_RUBY_INTERFACE=false
+fi
+
+
+if test "x$enable_python_interface" = xyes; then :
+  ENABLE_PYTHON_INTERFACE=true
+else
+  ENABLE_PYTHON_INTERFACE=false
+fi
+
+
+
+ac_config_headers="$ac_config_headers src/config.h"
+
+ac_config_files="$ac_config_files Makefile app/Makefile cdi.settings examples/Makefile examples/pio/Makefile interfaces/Makefile interfaces/python/Makefile src/Makefile src/cmake/cdi/cdi-config-version.cmake src/cmake/cdi/cdi-config.cmake src/pkgconfig/cdi.pc src/pkgconfig/cdi_f2003.pc src/pkgconfig/cdipio.pc tests/Makefile tests/test_cksum_base"
+
+ac_config_files="$ac_config_files interfaces/test_cpp_nc.run interfaces/test_python_grb.run interfaces/test_python_nc.run interfaces/test_ruby_grb.run interfaces/test_ruby_nc.run tables/gen_tableheaderfile tests/pio_cksum_asynch.run tests/pio_cksum_fpguard.run tests/pio_cksum_grb2.run tests/pio_cksum_mpi_fw_at_all.run tests/pio_cksum_mpi_fw_at_reblock.run tests/pio_cksum_mpi_fw_ordered.run tests/pio_cksum_mpinonb.run tests/pio_cksum_nc.run tests/pio_cksum_nc2.run tests/pio_cksum_nc4.run tests/pio_cksum_writer.run tests/pio_write.parallel.run tests/pio_write.run tests/pio_write_deco2d.parallel.run tests/pio_write_deco2d.run tests/pio_write_dist_array.run tests/test_byteswap.run tests/test_cdf_const.run tests/test_cdf_transformation.run tests/test_cksum_ext.run tests/test_cksum_grb.run tests/test_cksum_grb2.run tests/test_cksum_ieg.run tests/test_cksum_nc.run tests/test_cksum_nc2.run tests/test_cksum_nc4.run tests/test_cksum_nc_chunk.run tests/test_cksum_srv.run tests/test_f2003.run tests/test_grib.run tests/test_resource_copy.parallel.run tests/test_resource_copy.run tests/test_table.run"
+
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/.lo$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_ISOC_INTERFACE_TRUE}" && test -z "${ENABLE_ISOC_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_ISOC_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FC_MOD_UPPERCASE_TRUE}" && test -z "${FC_MOD_UPPERCASE_FALSE}"; then
+  as_fn_error $? "conditional \"FC_MOD_UPPERCASE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_FC_PROGRAMS_TRUE}" && test -z "${BUILD_FC_PROGRAMS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_FC_PROGRAMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_CF_INTERFACE_TRUE}" && test -z "${ENABLE_CF_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_CF_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+ac_objext=${acx_lt_saved_ac_objext}
+
+if test -z "${HAVE_LIBGRIB_API_TRUE}" && test -z "${HAVE_LIBGRIB_API_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_LIBGRIB_API\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_CDI_LIB_TRUE}" && test -z "${ENABLE_CDI_LIB_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_CDI_LIB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_ALL_STATIC_TRUE}" && test -z "${ENABLE_ALL_STATIC_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_ALL_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_HIRLAM_EXTENSIONS_TRUE}" && test -z "${ENABLE_HIRLAM_EXTENSIONS_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_HIRLAM_EXTENSIONS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_CDI_APP_TRUE}" && test -z "${ENABLE_CDI_APP_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_CDI_APP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_NETCDF_TRUE}" && test -z "${ENABLE_NETCDF_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_NETCDF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${BUILD_PIO_FC_PROGRAMS_TRUE}" && test -z "${BUILD_PIO_FC_PROGRAMS_FALSE}"; then
+  as_fn_error $? "conditional \"BUILD_PIO_FC_PROGRAMS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_MPI_TRUE}" && test -z "${ENABLE_MPI_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_MPI\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PARALLEL_NC4_TRUE}" && test -z "${HAVE_PARALLEL_NC4_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PARALLEL_NC4\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_RUBY_INTERFACE_TRUE}" && test -z "${ENABLE_RUBY_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_RUBY_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_PYTHON_INTERFACE_TRUE}" && test -z "${ENABLE_PYTHON_INTERFACE_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_PYTHON_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${with_on_demand_check_programs_TRUE}" && test -z "${with_on_demand_check_programs_FALSE}"; then
+  as_fn_error $? "conditional \"with_on_demand_check_programs\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${with_concurrent_mpi_checks_TRUE}" && test -z "${with_concurrent_mpi_checks_FALSE}"; then
+  as_fn_error $? "conditional \"with_concurrent_mpi_checks\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${with_example_programs_TRUE}" && test -z "${with_example_programs_FALSE}"; then
+  as_fn_error $? "conditional \"with_example_programs\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+CFLAGS="$CFLAGS${BUILD_CFLAGS:+ $BUILD_CFLAGS}"
+FCFLAGS="$FCFLAGS${BUILD_FCFLAGS:+ $BUILD_FCFLAGS}"
+LDFLAGS="$LDFLAGS${BUILD_LDFLAGS:+ $BUILD_LDFLAGS}"
+LIBS="$LIBS${BUILD_LIBS:+ $BUILD_LIBS}"
+MPI_C_LIB="$MPI_C_LIB${BUILD_MPI_C_LIB:+ $BUILD_MPI_C_LIB}"
+MPI_FC_LIB="$MPI_FC_LIB${BUILD_MPI_FC_LIB:+ $BUILD_MPI_FC_LIB}"
+CC="${BUILD_CC:-$CC}"
+CXX="${BUILD_CXX:-$CXX}"
+FC="${BUILD_FC:-$FC}"
+F77="${BUILD_F77:-$F77}"
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by cdi $as_me 2.4.3, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <https://mpimet.mpg.de/cdi>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+cdi config.status 2.4.3
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor='`$ECHO "$acx_is_nagfor" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`'
+LD_FC='`$ECHO "$LD_FC" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`'
+reload_flag_FC='`$ECHO "$reload_flag_FC" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`'
+reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`'
+compiler_FC='`$ECHO "$compiler_FC" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`'
+GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_CXX='`$ECHO "$acx_is_nagfor_CXX" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_F77='`$ECHO "$acx_is_nagfor_F77" | $SED "$delay_single_quote_subst"`'
+acx_is_nagfor_FC='`$ECHO "$acx_is_nagfor_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_cmds_FC='`$ECHO "$archive_cmds_FC" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_cmds_FC='`$ECHO "$module_cmds_FC" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_FC='`$ECHO "$hardcode_direct_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`'
+include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`'
+file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`'
+hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`'
+predep_objects_FC='`$ECHO "$predep_objects_FC" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`'
+postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`'
+predeps_FC='`$ECHO "$predeps_FC" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`'
+postdeps_FC='`$ECHO "$postdeps_FC" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+LD_F77 \
+LD_FC \
+reload_flag_CXX \
+reload_flag_F77 \
+reload_flag_FC \
+compiler_CXX \
+compiler_F77 \
+compiler_FC \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_no_builtin_flag_F77 \
+lt_prog_compiler_no_builtin_flag_FC \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_pic_F77 \
+lt_prog_compiler_pic_FC \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_wl_F77 \
+lt_prog_compiler_wl_FC \
+lt_prog_compiler_static_CXX \
+lt_prog_compiler_static_F77 \
+lt_prog_compiler_static_FC \
+lt_cv_prog_compiler_c_o_CXX \
+lt_cv_prog_compiler_c_o_F77 \
+lt_cv_prog_compiler_c_o_FC \
+export_dynamic_flag_spec_CXX \
+export_dynamic_flag_spec_F77 \
+export_dynamic_flag_spec_FC \
+whole_archive_flag_spec_CXX \
+whole_archive_flag_spec_F77 \
+whole_archive_flag_spec_FC \
+compiler_needs_object_CXX \
+compiler_needs_object_F77 \
+compiler_needs_object_FC \
+with_gnu_ld_CXX \
+with_gnu_ld_F77 \
+with_gnu_ld_FC \
+allow_undefined_flag_CXX \
+allow_undefined_flag_F77 \
+allow_undefined_flag_FC \
+no_undefined_flag_CXX \
+no_undefined_flag_F77 \
+no_undefined_flag_FC \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_flag_spec_F77 \
+hardcode_libdir_flag_spec_FC \
+hardcode_libdir_separator_CXX \
+hardcode_libdir_separator_F77 \
+hardcode_libdir_separator_FC \
+exclude_expsyms_CXX \
+exclude_expsyms_F77 \
+exclude_expsyms_FC \
+include_expsyms_CXX \
+include_expsyms_F77 \
+include_expsyms_FC \
+file_list_spec_CXX \
+file_list_spec_F77 \
+file_list_spec_FC \
+compiler_lib_search_dirs_CXX \
+compiler_lib_search_dirs_F77 \
+compiler_lib_search_dirs_FC \
+predep_objects_CXX \
+predep_objects_F77 \
+predep_objects_FC \
+postdep_objects_CXX \
+postdep_objects_F77 \
+postdep_objects_FC \
+predeps_CXX \
+predeps_F77 \
+predeps_FC \
+postdeps_CXX \
+postdeps_F77 \
+postdeps_FC \
+compiler_lib_search_path_CXX \
+compiler_lib_search_path_F77 \
+compiler_lib_search_path_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
+reload_cmds_CXX \
+reload_cmds_F77 \
+reload_cmds_FC \
+old_archive_cmds_CXX \
+old_archive_cmds_F77 \
+old_archive_cmds_FC \
+old_archive_from_new_cmds_CXX \
+old_archive_from_new_cmds_F77 \
+old_archive_from_new_cmds_FC \
+old_archive_from_expsyms_cmds_CXX \
+old_archive_from_expsyms_cmds_F77 \
+old_archive_from_expsyms_cmds_FC \
+archive_cmds_CXX \
+archive_cmds_F77 \
+archive_cmds_FC \
+archive_expsym_cmds_CXX \
+archive_expsym_cmds_F77 \
+archive_expsym_cmds_FC \
+module_cmds_CXX \
+module_cmds_F77 \
+module_cmds_FC \
+module_expsym_cmds_CXX \
+module_expsym_cmds_F77 \
+module_expsym_cmds_FC \
+export_symbols_cmds_CXX \
+export_symbols_cmds_F77 \
+export_symbols_cmds_FC \
+prelink_cmds_CXX \
+prelink_cmds_F77 \
+prelink_cmds_FC \
+postlink_cmds_CXX \
+postlink_cmds_F77 \
+postlink_cmds_FC; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+
+ac_aux_dir='$ac_aux_dir'
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "app/Makefile") CONFIG_FILES="$CONFIG_FILES app/Makefile" ;;
+    "cdi.settings") CONFIG_FILES="$CONFIG_FILES cdi.settings" ;;
+    "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
+    "examples/pio/Makefile") CONFIG_FILES="$CONFIG_FILES examples/pio/Makefile" ;;
+    "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+    "interfaces/python/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/python/Makefile" ;;
+    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+    "src/cmake/cdi/cdi-config-version.cmake") CONFIG_FILES="$CONFIG_FILES src/cmake/cdi/cdi-config-version.cmake" ;;
+    "src/cmake/cdi/cdi-config.cmake") CONFIG_FILES="$CONFIG_FILES src/cmake/cdi/cdi-config.cmake" ;;
+    "src/pkgconfig/cdi.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdi.pc" ;;
+    "src/pkgconfig/cdi_f2003.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdi_f2003.pc" ;;
+    "src/pkgconfig/cdipio.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdipio.pc" ;;
+    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+    "tests/test_cksum_base") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_base" ;;
+    "interfaces/test_cpp_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_cpp_nc.run" ;;
+    "interfaces/test_python_grb.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_python_grb.run" ;;
+    "interfaces/test_python_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_python_nc.run" ;;
+    "interfaces/test_ruby_grb.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_ruby_grb.run" ;;
+    "interfaces/test_ruby_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_ruby_nc.run" ;;
+    "tables/gen_tableheaderfile") CONFIG_FILES="$CONFIG_FILES tables/gen_tableheaderfile" ;;
+    "tests/pio_cksum_asynch.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_asynch.run" ;;
+    "tests/pio_cksum_fpguard.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_fpguard.run" ;;
+    "tests/pio_cksum_grb2.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_grb2.run" ;;
+    "tests/pio_cksum_mpi_fw_at_all.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_at_all.run" ;;
+    "tests/pio_cksum_mpi_fw_at_reblock.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_at_reblock.run" ;;
+    "tests/pio_cksum_mpi_fw_ordered.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_ordered.run" ;;
+    "tests/pio_cksum_mpinonb.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpinonb.run" ;;
+    "tests/pio_cksum_nc.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc.run" ;;
+    "tests/pio_cksum_nc2.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc2.run" ;;
+    "tests/pio_cksum_nc4.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc4.run" ;;
+    "tests/pio_cksum_writer.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_writer.run" ;;
+    "tests/pio_write.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write.parallel.run" ;;
+    "tests/pio_write.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write.run" ;;
+    "tests/pio_write_deco2d.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_deco2d.parallel.run" ;;
+    "tests/pio_write_deco2d.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_deco2d.run" ;;
+    "tests/pio_write_dist_array.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_dist_array.run" ;;
+    "tests/test_byteswap.run") CONFIG_FILES="$CONFIG_FILES tests/test_byteswap.run" ;;
+    "tests/test_cdf_const.run") CONFIG_FILES="$CONFIG_FILES tests/test_cdf_const.run" ;;
+    "tests/test_cdf_transformation.run") CONFIG_FILES="$CONFIG_FILES tests/test_cdf_transformation.run" ;;
+    "tests/test_cksum_ext.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_ext.run" ;;
+    "tests/test_cksum_grb.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_grb.run" ;;
+    "tests/test_cksum_grb2.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_grb2.run" ;;
+    "tests/test_cksum_ieg.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_ieg.run" ;;
+    "tests/test_cksum_nc.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc.run" ;;
+    "tests/test_cksum_nc2.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc2.run" ;;
+    "tests/test_cksum_nc4.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc4.run" ;;
+    "tests/test_cksum_nc_chunk.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc_chunk.run" ;;
+    "tests/test_cksum_srv.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_srv.run" ;;
+    "tests/test_f2003.run") CONFIG_FILES="$CONFIG_FILES tests/test_f2003.run" ;;
+    "tests/test_grib.run") CONFIG_FILES="$CONFIG_FILES tests/test_grib.run" ;;
+    "tests/test_resource_copy.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/test_resource_copy.parallel.run" ;;
+    "tests/test_resource_copy.run") CONFIG_FILES="$CONFIG_FILES tests/test_resource_copy.run" ;;
+    "tests/test_table.run") CONFIG_FILES="$CONFIG_FILES tests/test_table.run" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  case $CONFIG_FILES in #(
+  *\'*) :
+    eval set x "$CONFIG_FILES" ;; #(
+  *) :
+    set x $CONFIG_FILES ;; #(
+  *) :
+     ;;
+esac
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$am_mf" : 'X\(//\)[^/]' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { echo "$as_me:$LINENO: cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles" >&5
+   (cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+  { am_dirpart=; unset am_dirpart;}
+  { am_filepart=; unset am_filepart;}
+  { am_mf=; unset am_mf;}
+  { am_rc=; unset am_rc;}
+  rm -f conftest-deps.mk
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags='CXX F77 FC '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: F77
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_F77
+reload_cmds=$lt_reload_cmds_F77
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_F77
+
+# A language specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_F77
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_F77
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_F77
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_F77
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_F77
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_F77
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_F77
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_F77
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_F77
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_F77
+postdep_objects=$lt_postdep_objects_F77
+predeps=$lt_predeps_F77
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# ### END LIBTOOL TAG CONFIG: F77
+_LT_EOF
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: FC
+
+# The linker used to build libraries.
+LD=$lt_LD_FC
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_FC
+reload_cmds=$lt_reload_cmds_FC
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_FC
+
+# A language specific compiler.
+CC=$lt_compiler_FC
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_FC
+
+# Is the compiler the NAG Fortran compiler?
+with_nagfor=$acx_is_nagfor_FC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_FC
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_FC
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_FC
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_FC
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_FC
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_FC
+archive_expsym_cmds=$lt_archive_expsym_cmds_FC
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_FC
+module_expsym_cmds=$lt_module_expsym_cmds_FC
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_FC
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_FC
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_FC
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_FC
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_FC
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_FC
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_FC
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_FC
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_FC
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_FC
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_FC
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_FC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_FC
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_FC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_FC
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_FC
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_FC
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_FC
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_FC
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_FC
+postdep_objects=$lt_postdep_objects_FC
+predeps=$lt_predeps_FC
+postdeps=$lt_postdeps_FC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_FC
+
+# ### END LIBTOOL TAG CONFIG: FC
+_LT_EOF
+
+ ;;
+    "interfaces/test_cpp_nc.run":F) chmod a+x "$ac_file" ;;
+    "interfaces/test_python_grb.run":F) chmod a+x "$ac_file" ;;
+    "interfaces/test_python_nc.run":F) chmod a+x "$ac_file" ;;
+    "interfaces/test_ruby_grb.run":F) chmod a+x "$ac_file" ;;
+    "interfaces/test_ruby_nc.run":F) chmod a+x "$ac_file" ;;
+    "tables/gen_tableheaderfile":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_asynch.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_fpguard.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_grb2.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_mpi_fw_at_all.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_mpi_fw_at_reblock.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_mpi_fw_ordered.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_mpinonb.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_nc.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_nc2.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_nc4.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_cksum_writer.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_write.parallel.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_write.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_write_deco2d.parallel.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_write_deco2d.run":F) chmod a+x "$ac_file" ;;
+    "tests/pio_write_dist_array.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_byteswap.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cdf_const.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cdf_transformation.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_ext.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_grb.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_grb2.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_ieg.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_nc.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_nc2.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_nc4.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_nc_chunk.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_cksum_srv.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_f2003.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_grib.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_resource_copy.parallel.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_resource_copy.run":F) chmod a+x "$ac_file" ;;
+    "tests/test_table.run":F) chmod a+x "$ac_file" ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: CDI is configured with the following options:" >&5
+$as_echo "$as_me: CDI is configured with the following options:" >&6;}
+cat cdi.settings >&6
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}:
+
+  Configuration completed.
+
+    You can now run 'make' to compile the CDI package and 'make install' to install it afterwards.
+" >&5
+$as_echo "$as_me:
+
+  Configuration completed.
+
+    You can now run 'make' to compile the CDI package and 'make install' to install it afterwards.
+" >&6;}
diff --git a/doc/cdi_cman.pdf b/doc/cdi_cman.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f9585ffa49bae3d13e0c1858a2886c7ae6abb8be
GIT binary patch
literal 356748
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%0AHSDfAx
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

literal 0
HcmV?d00001

diff --git a/doc/cdi_fman.pdf b/doc/cdi_fman.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..1e93e3eaa3c4af4a97c9fc67a3274fcf83f4c2de
GIT binary patch
literal 383315
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
F{}+LdAvyp6

literal 0
HcmV?d00001

diff --git a/examples/Makefile.in b/examples/Makefile.in
new file mode 100644
index 000000000..1266617a0
--- /dev/null
+++ b/examples/Makefile.in
@@ -0,0 +1,1057 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = $(am__EXEEXT_5) $(am__append_5)
+check_PROGRAMS = $(am__EXEEXT_4)
+EXTRA_PROGRAMS = cdi_append$(EXEEXT) cdi_copy$(EXEEXT) \
+	cdi_read$(EXEEXT) cdi_write$(EXEEXT) cdi_write_ens$(EXEEXT) \
+	cdi_write_hybrid$(EXEEXT) cdi_write_local$(EXEEXT) \
+	cdi_write_relativ$(EXEEXT)
+@ENABLE_NETCDF_TRUE@am__append_1 = cdi_write_const
+@ENABLE_ISOC_INTERFACE_TRUE@am__append_2 = cdi_read_f2003 cdi_write_f2003
+@with_on_demand_check_programs_TRUE@am__append_3 = $(test_PROGRAMS_)
+@with_on_demand_check_programs_FALSE@am__append_4 = $(test_PROGRAMS_)
+@with_example_programs_TRUE@am__append_5 = $(EXTRA_PROGRAMS)
+@with_example_programs_FALSE@am__append_6 = $(EXTRA_PROGRAMS)
+@ENABLE_ISOC_INTERFACE_TRUE@am__append_7 = $(FC_MOD_FLAG)$(top_builddir)/src
+@ENABLE_ALL_STATIC_TRUE@am__append_8 = -all-static
+subdir = examples
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@ENABLE_NETCDF_TRUE@am__EXEEXT_1 = cdi_write_const$(EXEEXT)
+@ENABLE_ISOC_INTERFACE_TRUE@am__EXEEXT_2 = cdi_read_f2003$(EXEEXT) \
+@ENABLE_ISOC_INTERFACE_TRUE@	cdi_write_f2003$(EXEEXT)
+am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2)
+@with_on_demand_check_programs_TRUE@am__EXEEXT_4 = $(am__EXEEXT_3)
+@with_on_demand_check_programs_FALSE@am__EXEEXT_5 = $(am__EXEEXT_3)
+PROGRAMS = $(noinst_PROGRAMS)
+am_cdi_append_OBJECTS = cdi_append.$(OBJEXT)
+cdi_append_OBJECTS = $(am_cdi_append_OBJECTS)
+cdi_append_LDADD = $(LDADD)
+cdi_append_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_cdi_copy_OBJECTS = cdi_copy.$(OBJEXT)
+cdi_copy_OBJECTS = $(am_cdi_copy_OBJECTS)
+cdi_copy_LDADD = $(LDADD)
+cdi_copy_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_read_OBJECTS = cdi_read.$(OBJEXT)
+cdi_read_OBJECTS = $(am_cdi_read_OBJECTS)
+cdi_read_LDADD = $(LDADD)
+cdi_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_read_f2003_OBJECTS = cdi_read_f2003.$(OBJEXT)
+cdi_read_f2003_OBJECTS = $(am_cdi_read_f2003_OBJECTS)
+cdi_read_f2003_DEPENDENCIES = $(top_builddir)/src/libcdi_f2003.la \
+	$(LDADD)
+am_cdi_write_OBJECTS = cdi_write.$(OBJEXT)
+cdi_write_OBJECTS = $(am_cdi_write_OBJECTS)
+cdi_write_LDADD = $(LDADD)
+cdi_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_write_const_OBJECTS = cdi_write_const.$(OBJEXT)
+cdi_write_const_OBJECTS = $(am_cdi_write_const_OBJECTS)
+cdi_write_const_LDADD = $(LDADD)
+cdi_write_const_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_write_ens_OBJECTS = cdi_write_ens.$(OBJEXT)
+cdi_write_ens_OBJECTS = $(am_cdi_write_ens_OBJECTS)
+cdi_write_ens_LDADD = $(LDADD)
+cdi_write_ens_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_write_f2003_OBJECTS = cdi_write_f2003.$(OBJEXT)
+cdi_write_f2003_OBJECTS = $(am_cdi_write_f2003_OBJECTS)
+cdi_write_f2003_DEPENDENCIES = $(top_builddir)/src/libcdi_f2003.la \
+	$(LDADD)
+am_cdi_write_hybrid_OBJECTS = cdi_write_hybrid.$(OBJEXT)
+cdi_write_hybrid_OBJECTS = $(am_cdi_write_hybrid_OBJECTS)
+cdi_write_hybrid_LDADD = $(LDADD)
+cdi_write_hybrid_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_write_local_OBJECTS = cdi_write_local.$(OBJEXT)
+cdi_write_local_OBJECTS = $(am_cdi_write_local_OBJECTS)
+cdi_write_local_LDADD = $(LDADD)
+cdi_write_local_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cdi_write_relativ_OBJECTS = cdi_write_relativ.$(OBJEXT)
+cdi_write_relativ_OBJECTS = $(am_cdi_write_relativ_OBJECTS)
+cdi_write_relativ_LDADD = $(LDADD)
+cdi_write_relativ_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/cdi_append.Po \
+	./$(DEPDIR)/cdi_copy.Po ./$(DEPDIR)/cdi_read.Po \
+	./$(DEPDIR)/cdi_write.Po ./$(DEPDIR)/cdi_write_const.Po \
+	./$(DEPDIR)/cdi_write_ens.Po ./$(DEPDIR)/cdi_write_hybrid.Po \
+	./$(DEPDIR)/cdi_write_local.Po \
+	./$(DEPDIR)/cdi_write_relativ.Po
+am__mv = mv -f
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_@AM_V@)
+am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 =
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_@AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 =
+SOURCES = $(cdi_append_SOURCES) $(cdi_copy_SOURCES) \
+	$(cdi_read_SOURCES) $(cdi_read_f2003_SOURCES) \
+	$(cdi_write_SOURCES) $(cdi_write_const_SOURCES) \
+	$(cdi_write_ens_SOURCES) $(cdi_write_f2003_SOURCES) \
+	$(cdi_write_hybrid_SOURCES) $(cdi_write_local_SOURCES) \
+	$(cdi_write_relativ_SOURCES)
+DIST_SOURCES = $(cdi_append_SOURCES) $(cdi_copy_SOURCES) \
+	$(cdi_read_SOURCES) $(cdi_read_f2003_SOURCES) \
+	$(cdi_write_SOURCES) $(cdi_write_const_SOURCES) \
+	$(cdi_write_ens_SOURCES) $(cdi_write_f2003_SOURCES) \
+	$(cdi_write_hybrid_SOURCES) $(cdi_write_local_SOURCES) \
+	$(cdi_write_relativ_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	distdir distdir-am
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \
+	README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = pio
+CLEANFILES = $(am__append_6)
+
+# Examples that are part of the test suite:
+test_PROGRAMS_ = $(am__append_1) $(am__append_2)
+AM_CPPFLAGS = -I$(top_srcdir)/src
+AM_FCFLAGS = $(am__append_7) -static
+AM_LDFLAGS = $(am__append_8)
+LDADD = $(top_builddir)/src/libcdi.la
+cdi_append_SOURCES = cdi_append.c
+cdi_copy_SOURCES = cdi_copy.c
+cdi_read_SOURCES = cdi_read.c
+cdi_write_SOURCES = cdi_write.c
+cdi_write_ens_SOURCES = cdi_write_ens.c
+cdi_write_hybrid_SOURCES = cdi_write_hybrid.c
+cdi_write_local_SOURCES = cdi_write_local.c
+cdi_write_relativ_SOURCES = cdi_write_relativ.c
+cdi_write_const_SOURCES = cdi_write_const.c
+cdi_read_f2003_SOURCES = cdi_read_f2003.f90
+cdi_read_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD)
+cdi_write_f2003_SOURCES = cdi_write_f2003.f90
+cdi_write_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD)
+@FC_MOD_UPPERCASE_FALSE@mo_cdi_mod = mo_cdi.$(FCMODEXT)
+@FC_MOD_UPPERCASE_TRUE@mo_cdi_mod = MO_CDI.$(FCMODEXT)
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+
+# Avoid compiling twice by running Libtool with '-static'
+#   This is safe because all Libtool libraries in this directory are
+#   static-only and contain PIC objects:
+AM_CFLAGS = -static
+AM_CXXFLAGS = -static
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .f90 .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign examples/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+cdi_append$(EXEEXT): $(cdi_append_OBJECTS) $(cdi_append_DEPENDENCIES) $(EXTRA_cdi_append_DEPENDENCIES)
+	@rm -f cdi_append$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_append_OBJECTS) $(cdi_append_LDADD) $(LIBS)
+
+cdi_copy$(EXEEXT): $(cdi_copy_OBJECTS) $(cdi_copy_DEPENDENCIES) $(EXTRA_cdi_copy_DEPENDENCIES)
+	@rm -f cdi_copy$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_copy_OBJECTS) $(cdi_copy_LDADD) $(LIBS)
+
+cdi_read$(EXEEXT): $(cdi_read_OBJECTS) $(cdi_read_DEPENDENCIES) $(EXTRA_cdi_read_DEPENDENCIES)
+	@rm -f cdi_read$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_read_OBJECTS) $(cdi_read_LDADD) $(LIBS)
+
+cdi_read_f2003$(EXEEXT): $(cdi_read_f2003_OBJECTS) $(cdi_read_f2003_DEPENDENCIES) $(EXTRA_cdi_read_f2003_DEPENDENCIES)
+	@rm -f cdi_read_f2003$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(cdi_read_f2003_OBJECTS) $(cdi_read_f2003_LDADD) $(LIBS)
+
+cdi_write$(EXEEXT): $(cdi_write_OBJECTS) $(cdi_write_DEPENDENCIES) $(EXTRA_cdi_write_DEPENDENCIES)
+	@rm -f cdi_write$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_OBJECTS) $(cdi_write_LDADD) $(LIBS)
+
+cdi_write_const$(EXEEXT): $(cdi_write_const_OBJECTS) $(cdi_write_const_DEPENDENCIES) $(EXTRA_cdi_write_const_DEPENDENCIES)
+	@rm -f cdi_write_const$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_const_OBJECTS) $(cdi_write_const_LDADD) $(LIBS)
+
+cdi_write_ens$(EXEEXT): $(cdi_write_ens_OBJECTS) $(cdi_write_ens_DEPENDENCIES) $(EXTRA_cdi_write_ens_DEPENDENCIES)
+	@rm -f cdi_write_ens$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_ens_OBJECTS) $(cdi_write_ens_LDADD) $(LIBS)
+
+cdi_write_f2003$(EXEEXT): $(cdi_write_f2003_OBJECTS) $(cdi_write_f2003_DEPENDENCIES) $(EXTRA_cdi_write_f2003_DEPENDENCIES)
+	@rm -f cdi_write_f2003$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(cdi_write_f2003_OBJECTS) $(cdi_write_f2003_LDADD) $(LIBS)
+
+cdi_write_hybrid$(EXEEXT): $(cdi_write_hybrid_OBJECTS) $(cdi_write_hybrid_DEPENDENCIES) $(EXTRA_cdi_write_hybrid_DEPENDENCIES)
+	@rm -f cdi_write_hybrid$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_hybrid_OBJECTS) $(cdi_write_hybrid_LDADD) $(LIBS)
+
+cdi_write_local$(EXEEXT): $(cdi_write_local_OBJECTS) $(cdi_write_local_DEPENDENCIES) $(EXTRA_cdi_write_local_DEPENDENCIES)
+	@rm -f cdi_write_local$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_local_OBJECTS) $(cdi_write_local_LDADD) $(LIBS)
+
+cdi_write_relativ$(EXEEXT): $(cdi_write_relativ_OBJECTS) $(cdi_write_relativ_DEPENDENCIES) $(EXTRA_cdi_write_relativ_DEPENDENCIES)
+	@rm -f cdi_write_relativ$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cdi_write_relativ_OBJECTS) $(cdi_write_relativ_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_append.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_copy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_const.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_ens.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_hybrid.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_local.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_relativ.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+check: check-recursive
+all-am: Makefile $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-recursive
+		-rm -f ./$(DEPDIR)/cdi_append.Po
+	-rm -f ./$(DEPDIR)/cdi_copy.Po
+	-rm -f ./$(DEPDIR)/cdi_read.Po
+	-rm -f ./$(DEPDIR)/cdi_write.Po
+	-rm -f ./$(DEPDIR)/cdi_write_const.Po
+	-rm -f ./$(DEPDIR)/cdi_write_ens.Po
+	-rm -f ./$(DEPDIR)/cdi_write_hybrid.Po
+	-rm -f ./$(DEPDIR)/cdi_write_local.Po
+	-rm -f ./$(DEPDIR)/cdi_write_relativ.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+examples: examples-recursive
+
+examples-am: examples-local
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+		-rm -f ./$(DEPDIR)/cdi_append.Po
+	-rm -f ./$(DEPDIR)/cdi_copy.Po
+	-rm -f ./$(DEPDIR)/cdi_read.Po
+	-rm -f ./$(DEPDIR)/cdi_write.Po
+	-rm -f ./$(DEPDIR)/cdi_write_const.Po
+	-rm -f ./$(DEPDIR)/cdi_write_ens.Po
+	-rm -f ./$(DEPDIR)/cdi_write_hybrid.Po
+	-rm -f ./$(DEPDIR)/cdi_write_local.Po
+	-rm -f ./$(DEPDIR)/cdi_write_relativ.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--depfiles check check-am clean clean-checkPROGRAMS \
+	clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am examples-am examples-local html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am
+
+.PRECIOUS: Makefile
+
+examples-local: $(test_PROGRAMS_) $(EXTRA_PROGRAMS)
+
+cdi_read_f2003.$(OBJEXT) cdi_write_f2003.$(OBJEXT): $(top_builddir)/src/$(mo_cdi_mod)
+
+clean-local:
+	-rm -f *.grb *.grb2 *.nc
+	-rm -rf *.dSYM
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/examples/pio/Makefile.in b/examples/pio/Makefile.in
new file mode 100644
index 000000000..498057bf6
--- /dev/null
+++ b/examples/pio/Makefile.in
@@ -0,0 +1,895 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+EXTRA_PROGRAMS = collectData$(EXEEXT) collectDataNStreams$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+@ENABLE_MPI_TRUE@am__append_1 = \
+@ENABLE_MPI_TRUE@  collectData.parallel \
+@ENABLE_MPI_TRUE@  collectDataNStreams.parallel \
+@ENABLE_MPI_TRUE@  compareResourcesArray
+
+@BUILD_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_2 = collectData2003
+@BUILD_PIO_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_3 = collectData2003.parallel
+@with_example_programs_TRUE@am__append_4 = $(EXTRA_PROGRAMS)
+@with_example_programs_FALSE@am__append_5 = $(EXTRA_PROGRAMS)
+@ENABLE_CF_INTERFACE_TRUE@am__append_6 = $(FC_OPTINC)$(top_builddir)/src $(FC_OPTINC)$(top_srcdir)/src
+@ENABLE_ALL_STATIC_TRUE@am__append_7 = -all-static
+subdir = examples/pio
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@ENABLE_MPI_TRUE@am__EXEEXT_1 = collectData.parallel$(EXEEXT) \
+@ENABLE_MPI_TRUE@	collectDataNStreams.parallel$(EXEEXT) \
+@ENABLE_MPI_TRUE@	compareResourcesArray$(EXEEXT)
+@BUILD_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__EXEEXT_2 = collectData2003$(EXEEXT)
+@BUILD_PIO_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__EXEEXT_3 = collectData2003.parallel$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_collectData_OBJECTS = collectData.$(OBJEXT)
+collectData_OBJECTS = $(am_collectData_OBJECTS)
+collectData_LDADD = $(LDADD)
+collectData_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am__objects_1 = collectData.parallel.$(OBJEXT)
+nodist_collectData_parallel_OBJECTS = $(am__objects_1)
+collectData_parallel_OBJECTS = $(nodist_collectData_parallel_OBJECTS)
+am__DEPENDENCIES_1 =
+collectData_parallel_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \
+	$(am__DEPENDENCIES_1) $(LDADD)
+am_collectData2003_OBJECTS = collectData2003.$(OBJEXT)
+collectData2003_OBJECTS = $(am_collectData2003_OBJECTS)
+collectData2003_LDADD = $(LDADD)
+collectData2003_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am__objects_2 = collectData2003.parallel.$(OBJEXT)
+nodist_collectData2003_parallel_OBJECTS = $(am__objects_2)
+collectData2003_parallel_OBJECTS =  \
+	$(nodist_collectData2003_parallel_OBJECTS)
+collectData2003_parallel_DEPENDENCIES =  \
+	$(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(LDADD)
+am_collectDataNStreams_OBJECTS = collectDataNStreams.$(OBJEXT)
+collectDataNStreams_OBJECTS = $(am_collectDataNStreams_OBJECTS)
+collectDataNStreams_LDADD = $(LDADD)
+collectDataNStreams_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am__objects_3 = collectDataNStreams.parallel.$(OBJEXT)
+nodist_collectDataNStreams_parallel_OBJECTS = $(am__objects_3)
+collectDataNStreams_parallel_OBJECTS =  \
+	$(nodist_collectDataNStreams_parallel_OBJECTS)
+collectDataNStreams_parallel_DEPENDENCIES =  \
+	$(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \
+	$(LDADD)
+am_compareResourcesArray_OBJECTS = compareResourcesArray.$(OBJEXT)
+compareResourcesArray_OBJECTS = $(am_compareResourcesArray_OBJECTS)
+compareResourcesArray_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \
+	$(am__DEPENDENCIES_1) $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/collectData.Po \
+	./$(DEPDIR)/collectData.parallel.Po \
+	./$(DEPDIR)/collectDataNStreams.Po \
+	./$(DEPDIR)/collectDataNStreams.parallel.Po \
+	./$(DEPDIR)/compareResourcesArray.Po
+am__mv = mv -f
+AM_V_PPFC = $(am__v_PPFC_@AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_@AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 =
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_@AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 =
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+SOURCES = $(collectData_SOURCES) \
+	$(nodist_collectData_parallel_SOURCES) \
+	$(collectData2003_SOURCES) \
+	$(nodist_collectData2003_parallel_SOURCES) \
+	$(collectDataNStreams_SOURCES) \
+	$(nodist_collectDataNStreams_parallel_SOURCES) \
+	$(compareResourcesArray_SOURCES)
+DIST_SOURCES = $(collectData_SOURCES) $(collectData2003_SOURCES) \
+	$(collectDataNStreams_SOURCES) \
+	$(compareResourcesArray_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_PROGRAMS = $(am__append_4)
+CLEANFILES = $(am__append_5)
+AM_CPPFLAGS = -I$(top_srcdir)/src $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE)
+AM_FCFLAGS = $(am__append_6) $(YAXT_FC_MOD) $(MPI_FC_MOD) -static
+AM_LDFLAGS = $(am__append_7)
+LDADD = $(top_builddir)/src/libcdi.la
+collectData_SOURCES = collectData.c
+nodist_collectData_parallel_SOURCES = $(collectData_SOURCES:.c=.parallel.c)
+collectData_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD)
+collectDataNStreams_SOURCES = collectDataNStreams.c
+nodist_collectDataNStreams_parallel_SOURCES = $(collectDataNStreams_SOURCES:.c=.parallel.c)
+collectDataNStreams_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD)
+compareResourcesArray_SOURCES = compareResourcesArray.c
+compareResourcesArray_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD)
+collectData2003_SOURCES = collectData2003.F90
+nodist_collectData2003_parallel_SOURCES = $(collectData2003_SOURCES:.F90=.parallel.F90)
+collectData2003_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_FC_LIB) $(MPI_FC_LIB) $(LDADD)
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+
+# Avoid compiling twice by running Libtool with '-static'
+#   This is safe because all Libtool libraries in this directory are
+#   static-only and contain PIC objects:
+AM_CFLAGS = -static
+AM_CXXFLAGS = -static
+
+# Generate source files for parallel versions of the programs. We do this to
+# avoid target-specific flags, which result into rules that do not use the
+# compilation commands above.
+SUFFIXES = .parallel.c .parallel.F90
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .parallel.c .parallel.F90 .F90 .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/pio/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign examples/pio/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+collectData$(EXEEXT): $(collectData_OBJECTS) $(collectData_DEPENDENCIES) $(EXTRA_collectData_DEPENDENCIES)
+	@rm -f collectData$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(collectData_OBJECTS) $(collectData_LDADD) $(LIBS)
+
+collectData.parallel$(EXEEXT): $(collectData_parallel_OBJECTS) $(collectData_parallel_DEPENDENCIES) $(EXTRA_collectData_parallel_DEPENDENCIES)
+	@rm -f collectData.parallel$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(collectData_parallel_OBJECTS) $(collectData_parallel_LDADD) $(LIBS)
+
+collectData2003$(EXEEXT): $(collectData2003_OBJECTS) $(collectData2003_DEPENDENCIES) $(EXTRA_collectData2003_DEPENDENCIES)
+	@rm -f collectData2003$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(collectData2003_OBJECTS) $(collectData2003_LDADD) $(LIBS)
+
+collectData2003.parallel$(EXEEXT): $(collectData2003_parallel_OBJECTS) $(collectData2003_parallel_DEPENDENCIES) $(EXTRA_collectData2003_parallel_DEPENDENCIES)
+	@rm -f collectData2003.parallel$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(collectData2003_parallel_OBJECTS) $(collectData2003_parallel_LDADD) $(LIBS)
+
+collectDataNStreams$(EXEEXT): $(collectDataNStreams_OBJECTS) $(collectDataNStreams_DEPENDENCIES) $(EXTRA_collectDataNStreams_DEPENDENCIES)
+	@rm -f collectDataNStreams$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(collectDataNStreams_OBJECTS) $(collectDataNStreams_LDADD) $(LIBS)
+
+collectDataNStreams.parallel$(EXEEXT): $(collectDataNStreams_parallel_OBJECTS) $(collectDataNStreams_parallel_DEPENDENCIES) $(EXTRA_collectDataNStreams_parallel_DEPENDENCIES)
+	@rm -f collectDataNStreams.parallel$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(collectDataNStreams_parallel_OBJECTS) $(collectDataNStreams_parallel_LDADD) $(LIBS)
+
+compareResourcesArray$(EXEEXT): $(compareResourcesArray_OBJECTS) $(compareResourcesArray_DEPENDENCIES) $(EXTRA_compareResourcesArray_DEPENDENCIES)
+	@rm -f compareResourcesArray$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(compareResourcesArray_OBJECTS) $(compareResourcesArray_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectData.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectData.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectDataNStreams.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectDataNStreams.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compareResourcesArray.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.F90.o:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ $<
+
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/collectData.Po
+	-rm -f ./$(DEPDIR)/collectData.parallel.Po
+	-rm -f ./$(DEPDIR)/collectDataNStreams.Po
+	-rm -f ./$(DEPDIR)/collectDataNStreams.parallel.Po
+	-rm -f ./$(DEPDIR)/compareResourcesArray.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+examples: examples-am
+
+examples-am: examples-local
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/collectData.Po
+	-rm -f ./$(DEPDIR)/collectData.parallel.Po
+	-rm -f ./$(DEPDIR)/collectDataNStreams.Po
+	-rm -f ./$(DEPDIR)/collectDataNStreams.parallel.Po
+	-rm -f ./$(DEPDIR)/compareResourcesArray.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-generic clean-libtool clean-local clean-noinstPROGRAMS \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am examples-am examples-local html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+examples-local: $(EXTRA_PROGRAMS)
+
+clean-local:
+	-rm -f *.parallel.c *.parallel.F90
+	-rm -f *.grb
+	-rm -rf *.dSYM
+
+.c.parallel.c:
+	$(AM_V_GEN):;{ \
+	  echo '#define USE_MPI 1'; \
+	  echo '#include "$<"'; \
+	  } >$@
+
+.F90.parallel.F90:
+	$(AM_V_GEN):;{ \
+	  echo '#define USE_MPI 1'; \
+	  echo '#include "$<"'; \
+	  } >$@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
new file mode 100644
index 000000000..93f83907f
--- /dev/null
+++ b/interfaces/Makefile.in
@@ -0,0 +1,1394 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@ENABLE_RUBY_INTERFACE_TRUE@am__append_1 = ruby-binding
+@ENABLE_RUBY_INTERFACE_TRUE@am__append_2 = ruby-install
+@ENABLE_RUBY_INTERFACE_TRUE@am__append_3 = ruby-uninstall
+# We call with distclean to remove the generated ruby/Makefile, which is
+# generated by this makefile, and should, therefore, be deleted with
+# 'make clean':
+@ENABLE_RUBY_INTERFACE_TRUE@am__append_4 = ruby-clean
+@ENABLE_PYTHON_INTERFACE_FALSE@@ENABLE_RUBY_INTERFACE_TRUE@@with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_1)
+@ENABLE_PYTHON_INTERFACE_TRUE@@with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_1)
+@ENABLE_PYTHON_INTERFACE_FALSE@@ENABLE_RUBY_INTERFACE_TRUE@@with_on_demand_check_programs_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
+@ENABLE_PYTHON_INTERFACE_TRUE@@with_on_demand_check_programs_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1)
+subdir = interfaces
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = test_cpp_nc.run test_python_grb.run \
+	test_python_nc.run test_ruby_grb.run test_ruby_nc.run
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = CdiInfo$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+libcdipp_la_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_libcdipp_la_OBJECTS = cdi.lo
+libcdipp_la_OBJECTS = $(am_libcdipp_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_CdiInfo_OBJECTS = CdiInfo.$(OBJEXT)
+CdiInfo_OBJECTS = $(am_CdiInfo_OBJECTS)
+CdiInfo_DEPENDENCIES = libcdipp.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/CdiInfo.Po ./$(DEPDIR)/cdi.Plo
+am__mv = mv -f
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 =
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+SOURCES = $(libcdipp_la_SOURCES) $(CdiInfo_SOURCES)
+DIST_SOURCES = $(libcdipp_la_SOURCES) $(CdiInfo_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	check recheck distdir distdir-am
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.run.log=.log)
+RUN_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
+RUN_LOG_COMPILE = $(RUN_LOG_COMPILER) $(AM_RUN_LOG_FLAGS) \
+	$(RUN_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/test_cpp_nc.run.in \
+	$(srcdir)/test_python_grb.run.in \
+	$(srcdir)/test_python_nc.run.in $(srcdir)/test_ruby_grb.run.in \
+	$(srcdir)/test_ruby_nc.run.in $(top_srcdir)/config/depcomp \
+	$(top_srcdir)/config/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_LTLIBRARIES = libcdipp.la
+libcdipp_la_SOURCES = cdi.cpp cdi.hpp
+libcdipp_la_LIBADD = $(top_builddir)/src/libcdi.la
+test_PROGRAMS_ = CdiInfo
+CdiInfo_SOURCES = CdiInfo.cpp
+CdiInfo_LDADD = libcdipp.la
+AM_CXXFLAGS = -static
+AM_CPPFLAGS = -I$(abs_top_srcdir)/src
+all_local = $(am__append_1)
+install_exec_local = $(am__append_2)
+uninstall_local = $(am__append_3)
+clean_local = $(am__append_4)
+SUBDIRS = python
+@ENABLE_RUBY_INTERFACE_TRUE@V_MAKERUBY = $(v_MAKERUBY_@AM_V@)
+@ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_ = $(v_MAKERUBY_@AM_DEFAULT_V@)
+@ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_0 = 0
+@ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_1 = 1
+AUTOMAKE_OPTIONS = subdir-objects
+AM_TESTSUITE_SUMMARY_HEADER = ' for Ruby and Python interfaces of $(PACKAGE_STRING)'
+TEST_EXTENSIONS = .run
+TESTS = \
+  test_cpp_nc.run \
+  test_python_grb.run \
+  test_python_nc.run \
+  test_ruby_grb.run \
+  test_ruby_nc.run
+
+MOSTLYCLEANFILES = $(EXTRA_LTLIBRARIES)
+MAINTAINERCLEANFILES = \
+  python/Cdi.py \
+  python/cdi_wrapper.cpp \
+  ruby/cdi_wrapper.cpp
+
+EXTRA_DIST = \
+  cdi.i \
+  f2003/bindGen.rb \
+  python/test.py \
+  ruby/cdi_wrapper.cpp \
+  ruby/setup.rb \
+  ruby/test.rb \
+  testdata/mulval.grb \
+  testdata/mulval.nc
+
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .log .o .obj .run .run$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+test_cpp_nc.run: $(top_builddir)/config.status $(srcdir)/test_cpp_nc.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_python_grb.run: $(top_builddir)/config.status $(srcdir)/test_python_grb.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_python_nc.run: $(top_builddir)/config.status $(srcdir)/test_python_nc.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_ruby_grb.run: $(top_builddir)/config.status $(srcdir)/test_ruby_grb.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_ruby_nc.run: $(top_builddir)/config.status $(srcdir)/test_ruby_nc.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+libcdipp.la: $(libcdipp_la_OBJECTS) $(libcdipp_la_DEPENDENCIES) $(EXTRA_libcdipp_la_DEPENDENCIES)
+	$(AM_V_CXXLD)$(CXXLINK)  $(libcdipp_la_OBJECTS) $(libcdipp_la_LIBADD) $(LIBS)
+
+CdiInfo$(EXEEXT): $(CdiInfo_OBJECTS) $(CdiInfo_DEPENDENCIES) $(EXTRA_CdiInfo_DEPENDENCIES)
+	@rm -f CdiInfo$(EXEEXT)
+	$(AM_V_CXXLD)$(CXXLINK) $(CdiInfo_OBJECTS) $(CdiInfo_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CdiInfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+.run.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.run$(EXEEXT).log:
+@am__EXEEXT_TRUE@	@p='$<'; \
+@am__EXEEXT_TRUE@	$(am__set_b); \
+@am__EXEEXT_TRUE@	$(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \
+@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile $(PROGRAMS) all-local
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-recursive
+		-rm -f ./$(DEPDIR)/CdiInfo.Po
+	-rm -f ./$(DEPDIR)/cdi.Plo
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+examples: examples-recursive
+
+examples-am: examples-local
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-exec-local
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+		-rm -f ./$(DEPDIR)/CdiInfo.Po
+	-rm -f ./$(DEPDIR)/cdi.Plo
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-local
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
+	am--depfiles check check-TESTS check-am clean \
+	clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am examples-am examples-local \
+	html html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-exec-local install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
+	uninstall uninstall-am uninstall-local
+
+.PRECIOUS: Makefile
+
+
+# For compatibility with older versions of Ruby, the recipes below redefine
+# the following additional variables of the generated Makefile (this is known
+# to be needed for Ruby 2.7.4 but not for Ruby 3.1.0):
+#   sitearchdir='$$(sitelibdir)/$$(sitearch)'
+#   sitedir='$$(rubylibprefix)/site_ruby'
+#   RM='$$(RM_RF)'
+
+@ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-binding
+@ENABLE_RUBY_INTERFACE_TRUE@ruby-binding: ruby/Cdi.la
+@ENABLE_RUBY_INTERFACE_TRUE@ruby/Cdi.la: ruby/cdi_wrapper.cpp ruby/Makefile libcdipp.la
+@ENABLE_RUBY_INTERFACE_TRUE@	$(AM_V_CXXLD)$(am__cd) ruby && \
+@ENABLE_RUBY_INTERFACE_TRUE@	  $(MAKE) $(AM_MAKEFLAGS) \
+@ENABLE_RUBY_INTERFACE_TRUE@	    prefix='$(prefix)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitearchdir='$$(sitelibdir)/$$(sitearch)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitedir='$$(rubylibprefix)/site_ruby' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    TIMESTAMP_DIR='.dirstamp' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CDI_INCFLAGS='-I$(abs_srcdir)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CDI_CPPFLAGS='$(AM_CPPFLAGS) $(CPPFLAGS)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CDI_CXXFLAGS='-shared $(CXXFLAGS)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CDI_LDFLAGS='$(AM_LDFLAGS) -module -avoid-version $(LDFLAGS) -rpath $$(RUBYARCHDIR)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CDI_LIBS='$(LIBS)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CCDLFLAGS= \
+@ENABLE_RUBY_INTERFACE_TRUE@	    CXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    LDSHAREDXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) $$(CDI_CXXFLAGS)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    DLLIB='$$(TARGET).la' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    V='$(V_MAKERUBY)'
+
+@ENABLE_RUBY_INTERFACE_TRUE@ruby/Makefile: $(abs_srcdir)/ruby/setup.rb Makefile
+@ENABLE_RUBY_INTERFACE_TRUE@	$(AM_V_GEN)$(MKDIR_P) $(@D) && $(am__cd) $(@D) && $(RUBY) $< && \
+@ENABLE_RUBY_INTERFACE_TRUE@	  $(SED) -i~ -e '/^\.cpp\.o:/s/^\.cpp\.o/.cpp.lo/;/^.SUFFIXES:/s/$$/ .lo/' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    -e '$$auninstall:; $$(UNINSTALL_PROG) $$(RUBYARCHDIR)/$$(DLLIB)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	  Makefile && rm -f Makefile~
+
+@ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-install
+@ENABLE_RUBY_INTERFACE_TRUE@ruby-install: ruby-binding
+@ENABLE_RUBY_INTERFACE_TRUE@	$(am__cd) ruby && \
+@ENABLE_RUBY_INTERFACE_TRUE@	  $(MAKE) $(AM_MAKEFLAGS) install \
+@ENABLE_RUBY_INTERFACE_TRUE@	    prefix='$(DESTDIR)$(prefix)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitearchdir='$$(sitelibdir)/$$(sitearch)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitedir='$$(rubylibprefix)/site_ruby' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    TIMESTAMP_DIR='.dirstamp$(DESTDIR)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    INSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    DLLIB='$$(TARGET).la'
+
+@ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-uninstall
+@ENABLE_RUBY_INTERFACE_TRUE@ruby-uninstall:
+@ENABLE_RUBY_INTERFACE_TRUE@	$(am__cd) ruby && \
+@ENABLE_RUBY_INTERFACE_TRUE@	  $(MAKE) $(AM_MAKEFLAGS) uninstall \
+@ENABLE_RUBY_INTERFACE_TRUE@	    prefix='$(DESTDIR)$(prefix)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitearchdir='$$(sitelibdir)/$$(sitearch)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    sitedir='$$(rubylibprefix)/site_ruby' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    UNINSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f' \
+@ENABLE_RUBY_INTERFACE_TRUE@	    DLLIB='$$(TARGET).la'
+
+@ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-clean
+@ENABLE_RUBY_INTERFACE_TRUE@ruby-clean:
+@ENABLE_RUBY_INTERFACE_TRUE@	if test -f ruby/Makefile; then \
+@ENABLE_RUBY_INTERFACE_TRUE@	  $(am__cd) ruby && \
+@ENABLE_RUBY_INTERFACE_TRUE@	    $(MAKE) $(AM_MAKEFLAGS) distclean \
+@ENABLE_RUBY_INTERFACE_TRUE@	      RM='$$(RM_RF)' \
+@ENABLE_RUBY_INTERFACE_TRUE@	      DLLIB='$$(TARGET).la' \
+@ENABLE_RUBY_INTERFACE_TRUE@	      CLEANOBJS='*.lo .libs .dirstamp'; \
+@ENABLE_RUBY_INTERFACE_TRUE@	fi
+
+@MAINTAINER_MODE_TRUE@ruby/cdi_wrapper.cpp: cdi.i cdi.hpp
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(MKDIR_P) $(@D) && $(SWIG) -ruby -c++ -globalmodule -o $@ $<
+
+@MAINTAINER_MODE_FALSE@ruby/cdi_wrapper.cpp python/Cdi.py python/cdi_wrapper.cpp:
+@MAINTAINER_MODE_FALSE@	@:;{ \
+@MAINTAINER_MODE_FALSE@	  echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \
+@MAINTAINER_MODE_FALSE@	  echo "       re-configure with the '--enable-maintainer-mode' option"; \
+@MAINTAINER_MODE_FALSE@	} >&2; exit 1
+
+all-local: $(all_local)
+install-exec-local: $(install_exec_local)
+uninstall-local: $(uninstall_local)
+clean-local: $(clean_local)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/python/Cdi.py b/interfaces/python/Cdi.py
new file mode 100644
index 000000000..b96ab677f
--- /dev/null
+++ b/interfaces/python/Cdi.py
@@ -0,0 +1,1379 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 4.0.2
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+from sys import version_info as _swig_python_version_info
+if _swig_python_version_info < (2, 7, 0):
+    raise RuntimeError("Python 2.7 or later required")
+
+# Import the low-level C/C++ module
+if __package__ or "." in __name__:
+    from . import _Cdi
+else:
+    import _Cdi
+
+try:
+    import builtins as __builtin__
+except ImportError:
+    import __builtin__
+
+def _swig_repr(self):
+    try:
+        strthis = "proxy of " + self.this.__repr__()
+    except __builtin__.Exception:
+        strthis = ""
+    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+
+def _swig_setattr_nondynamic_instance_variable(set):
+    def set_instance_attr(self, name, value):
+        if name == "thisown":
+            self.this.own(value)
+        elif name == "this":
+            set(self, name, value)
+        elif hasattr(self, name) and isinstance(getattr(type(self), name), property):
+            set(self, name, value)
+        else:
+            raise AttributeError("You cannot add instance attributes to %s" % self)
+    return set_instance_attr
+
+
+def _swig_setattr_nondynamic_class_variable(set):
+    def set_class_attr(cls, name, value):
+        if hasattr(cls, name) and not isinstance(getattr(cls, name), property):
+            set(cls, name, value)
+        else:
+            raise AttributeError("You cannot add class attributes to %s" % cls)
+    return set_class_attr
+
+
+def _swig_add_metaclass(metaclass):
+    """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass"""
+    def wrapper(cls):
+        return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy())
+    return wrapper
+
+
+class _SwigNonDynamicMeta(type):
+    """Meta class to enforce nondynamic attributes (no new attributes) for a class"""
+    __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__)
+
+
+class SwigPyIterator(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+
+    def __init__(self, *args, **kwargs):
+        raise AttributeError("No constructor defined - class is abstract")
+    __repr__ = _swig_repr
+    __swig_destroy__ = _Cdi.delete_SwigPyIterator
+
+    def value(self):
+        return _Cdi.SwigPyIterator_value(self)
+
+    def incr(self, n=1):
+        return _Cdi.SwigPyIterator_incr(self, n)
+
+    def decr(self, n=1):
+        return _Cdi.SwigPyIterator_decr(self, n)
+
+    def distance(self, x):
+        return _Cdi.SwigPyIterator_distance(self, x)
+
+    def equal(self, x):
+        return _Cdi.SwigPyIterator_equal(self, x)
+
+    def copy(self):
+        return _Cdi.SwigPyIterator_copy(self)
+
+    def next(self):
+        return _Cdi.SwigPyIterator_next(self)
+
+    def __next__(self):
+        return _Cdi.SwigPyIterator___next__(self)
+
+    def previous(self):
+        return _Cdi.SwigPyIterator_previous(self)
+
+    def advance(self, n):
+        return _Cdi.SwigPyIterator_advance(self, n)
+
+    def __eq__(self, x):
+        return _Cdi.SwigPyIterator___eq__(self, x)
+
+    def __ne__(self, x):
+        return _Cdi.SwigPyIterator___ne__(self, x)
+
+    def __iadd__(self, n):
+        return _Cdi.SwigPyIterator___iadd__(self, n)
+
+    def __isub__(self, n):
+        return _Cdi.SwigPyIterator___isub__(self, n)
+
+    def __add__(self, n):
+        return _Cdi.SwigPyIterator___add__(self, n)
+
+    def __sub__(self, *args):
+        return _Cdi.SwigPyIterator___sub__(self, *args)
+    def __iter__(self):
+        return self
+
+# Register SwigPyIterator in _Cdi:
+_Cdi.SwigPyIterator_swigregister(SwigPyIterator)
+
+class IntVector(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.IntVector_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.IntVector___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.IntVector___bool__(self)
+
+    def __len__(self):
+        return _Cdi.IntVector___len__(self)
+
+    def __getslice__(self, i, j):
+        return _Cdi.IntVector___getslice__(self, i, j)
+
+    def __setslice__(self, *args):
+        return _Cdi.IntVector___setslice__(self, *args)
+
+    def __delslice__(self, i, j):
+        return _Cdi.IntVector___delslice__(self, i, j)
+
+    def __delitem__(self, *args):
+        return _Cdi.IntVector___delitem__(self, *args)
+
+    def __getitem__(self, *args):
+        return _Cdi.IntVector___getitem__(self, *args)
+
+    def __setitem__(self, *args):
+        return _Cdi.IntVector___setitem__(self, *args)
+
+    def pop(self):
+        return _Cdi.IntVector_pop(self)
+
+    def append(self, x):
+        return _Cdi.IntVector_append(self, x)
+
+    def empty(self):
+        return _Cdi.IntVector_empty(self)
+
+    def size(self):
+        return _Cdi.IntVector_size(self)
+
+    def swap(self, v):
+        return _Cdi.IntVector_swap(self, v)
+
+    def begin(self):
+        return _Cdi.IntVector_begin(self)
+
+    def end(self):
+        return _Cdi.IntVector_end(self)
+
+    def rbegin(self):
+        return _Cdi.IntVector_rbegin(self)
+
+    def rend(self):
+        return _Cdi.IntVector_rend(self)
+
+    def clear(self):
+        return _Cdi.IntVector_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.IntVector_get_allocator(self)
+
+    def pop_back(self):
+        return _Cdi.IntVector_pop_back(self)
+
+    def erase(self, *args):
+        return _Cdi.IntVector_erase(self, *args)
+
+    def __init__(self, *args):
+        _Cdi.IntVector_swiginit(self, _Cdi.new_IntVector(*args))
+
+    def push_back(self, x):
+        return _Cdi.IntVector_push_back(self, x)
+
+    def front(self):
+        return _Cdi.IntVector_front(self)
+
+    def back(self):
+        return _Cdi.IntVector_back(self)
+
+    def assign(self, n, x):
+        return _Cdi.IntVector_assign(self, n, x)
+
+    def resize(self, *args):
+        return _Cdi.IntVector_resize(self, *args)
+
+    def insert(self, *args):
+        return _Cdi.IntVector_insert(self, *args)
+
+    def reserve(self, n):
+        return _Cdi.IntVector_reserve(self, n)
+
+    def capacity(self):
+        return _Cdi.IntVector_capacity(self)
+    __swig_destroy__ = _Cdi.delete_IntVector
+
+# Register IntVector in _Cdi:
+_Cdi.IntVector_swigregister(IntVector)
+
+class DoubleVector(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.DoubleVector_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.DoubleVector___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.DoubleVector___bool__(self)
+
+    def __len__(self):
+        return _Cdi.DoubleVector___len__(self)
+
+    def __getslice__(self, i, j):
+        return _Cdi.DoubleVector___getslice__(self, i, j)
+
+    def __setslice__(self, *args):
+        return _Cdi.DoubleVector___setslice__(self, *args)
+
+    def __delslice__(self, i, j):
+        return _Cdi.DoubleVector___delslice__(self, i, j)
+
+    def __delitem__(self, *args):
+        return _Cdi.DoubleVector___delitem__(self, *args)
+
+    def __getitem__(self, *args):
+        return _Cdi.DoubleVector___getitem__(self, *args)
+
+    def __setitem__(self, *args):
+        return _Cdi.DoubleVector___setitem__(self, *args)
+
+    def pop(self):
+        return _Cdi.DoubleVector_pop(self)
+
+    def append(self, x):
+        return _Cdi.DoubleVector_append(self, x)
+
+    def empty(self):
+        return _Cdi.DoubleVector_empty(self)
+
+    def size(self):
+        return _Cdi.DoubleVector_size(self)
+
+    def swap(self, v):
+        return _Cdi.DoubleVector_swap(self, v)
+
+    def begin(self):
+        return _Cdi.DoubleVector_begin(self)
+
+    def end(self):
+        return _Cdi.DoubleVector_end(self)
+
+    def rbegin(self):
+        return _Cdi.DoubleVector_rbegin(self)
+
+    def rend(self):
+        return _Cdi.DoubleVector_rend(self)
+
+    def clear(self):
+        return _Cdi.DoubleVector_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.DoubleVector_get_allocator(self)
+
+    def pop_back(self):
+        return _Cdi.DoubleVector_pop_back(self)
+
+    def erase(self, *args):
+        return _Cdi.DoubleVector_erase(self, *args)
+
+    def __init__(self, *args):
+        _Cdi.DoubleVector_swiginit(self, _Cdi.new_DoubleVector(*args))
+
+    def push_back(self, x):
+        return _Cdi.DoubleVector_push_back(self, x)
+
+    def front(self):
+        return _Cdi.DoubleVector_front(self)
+
+    def back(self):
+        return _Cdi.DoubleVector_back(self)
+
+    def assign(self, n, x):
+        return _Cdi.DoubleVector_assign(self, n, x)
+
+    def resize(self, *args):
+        return _Cdi.DoubleVector_resize(self, *args)
+
+    def insert(self, *args):
+        return _Cdi.DoubleVector_insert(self, *args)
+
+    def reserve(self, n):
+        return _Cdi.DoubleVector_reserve(self, n)
+
+    def capacity(self):
+        return _Cdi.DoubleVector_capacity(self)
+    __swig_destroy__ = _Cdi.delete_DoubleVector
+
+# Register DoubleVector in _Cdi:
+_Cdi.DoubleVector_swigregister(DoubleVector)
+
+class DoubleDoubleVector(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.DoubleDoubleVector_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.DoubleDoubleVector___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.DoubleDoubleVector___bool__(self)
+
+    def __len__(self):
+        return _Cdi.DoubleDoubleVector___len__(self)
+
+    def __getslice__(self, i, j):
+        return _Cdi.DoubleDoubleVector___getslice__(self, i, j)
+
+    def __setslice__(self, *args):
+        return _Cdi.DoubleDoubleVector___setslice__(self, *args)
+
+    def __delslice__(self, i, j):
+        return _Cdi.DoubleDoubleVector___delslice__(self, i, j)
+
+    def __delitem__(self, *args):
+        return _Cdi.DoubleDoubleVector___delitem__(self, *args)
+
+    def __getitem__(self, *args):
+        return _Cdi.DoubleDoubleVector___getitem__(self, *args)
+
+    def __setitem__(self, *args):
+        return _Cdi.DoubleDoubleVector___setitem__(self, *args)
+
+    def pop(self):
+        return _Cdi.DoubleDoubleVector_pop(self)
+
+    def append(self, x):
+        return _Cdi.DoubleDoubleVector_append(self, x)
+
+    def empty(self):
+        return _Cdi.DoubleDoubleVector_empty(self)
+
+    def size(self):
+        return _Cdi.DoubleDoubleVector_size(self)
+
+    def swap(self, v):
+        return _Cdi.DoubleDoubleVector_swap(self, v)
+
+    def begin(self):
+        return _Cdi.DoubleDoubleVector_begin(self)
+
+    def end(self):
+        return _Cdi.DoubleDoubleVector_end(self)
+
+    def rbegin(self):
+        return _Cdi.DoubleDoubleVector_rbegin(self)
+
+    def rend(self):
+        return _Cdi.DoubleDoubleVector_rend(self)
+
+    def clear(self):
+        return _Cdi.DoubleDoubleVector_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.DoubleDoubleVector_get_allocator(self)
+
+    def pop_back(self):
+        return _Cdi.DoubleDoubleVector_pop_back(self)
+
+    def erase(self, *args):
+        return _Cdi.DoubleDoubleVector_erase(self, *args)
+
+    def __init__(self, *args):
+        _Cdi.DoubleDoubleVector_swiginit(self, _Cdi.new_DoubleDoubleVector(*args))
+
+    def push_back(self, x):
+        return _Cdi.DoubleDoubleVector_push_back(self, x)
+
+    def front(self):
+        return _Cdi.DoubleDoubleVector_front(self)
+
+    def back(self):
+        return _Cdi.DoubleDoubleVector_back(self)
+
+    def assign(self, n, x):
+        return _Cdi.DoubleDoubleVector_assign(self, n, x)
+
+    def resize(self, *args):
+        return _Cdi.DoubleDoubleVector_resize(self, *args)
+
+    def insert(self, *args):
+        return _Cdi.DoubleDoubleVector_insert(self, *args)
+
+    def reserve(self, n):
+        return _Cdi.DoubleDoubleVector_reserve(self, n)
+
+    def capacity(self):
+        return _Cdi.DoubleDoubleVector_capacity(self)
+    __swig_destroy__ = _Cdi.delete_DoubleDoubleVector
+
+# Register DoubleDoubleVector in _Cdi:
+_Cdi.DoubleDoubleVector_swigregister(DoubleDoubleVector)
+
+class StringVector(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.StringVector_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.StringVector___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.StringVector___bool__(self)
+
+    def __len__(self):
+        return _Cdi.StringVector___len__(self)
+
+    def __getslice__(self, i, j):
+        return _Cdi.StringVector___getslice__(self, i, j)
+
+    def __setslice__(self, *args):
+        return _Cdi.StringVector___setslice__(self, *args)
+
+    def __delslice__(self, i, j):
+        return _Cdi.StringVector___delslice__(self, i, j)
+
+    def __delitem__(self, *args):
+        return _Cdi.StringVector___delitem__(self, *args)
+
+    def __getitem__(self, *args):
+        return _Cdi.StringVector___getitem__(self, *args)
+
+    def __setitem__(self, *args):
+        return _Cdi.StringVector___setitem__(self, *args)
+
+    def pop(self):
+        return _Cdi.StringVector_pop(self)
+
+    def append(self, x):
+        return _Cdi.StringVector_append(self, x)
+
+    def empty(self):
+        return _Cdi.StringVector_empty(self)
+
+    def size(self):
+        return _Cdi.StringVector_size(self)
+
+    def swap(self, v):
+        return _Cdi.StringVector_swap(self, v)
+
+    def begin(self):
+        return _Cdi.StringVector_begin(self)
+
+    def end(self):
+        return _Cdi.StringVector_end(self)
+
+    def rbegin(self):
+        return _Cdi.StringVector_rbegin(self)
+
+    def rend(self):
+        return _Cdi.StringVector_rend(self)
+
+    def clear(self):
+        return _Cdi.StringVector_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.StringVector_get_allocator(self)
+
+    def pop_back(self):
+        return _Cdi.StringVector_pop_back(self)
+
+    def erase(self, *args):
+        return _Cdi.StringVector_erase(self, *args)
+
+    def __init__(self, *args):
+        _Cdi.StringVector_swiginit(self, _Cdi.new_StringVector(*args))
+
+    def push_back(self, x):
+        return _Cdi.StringVector_push_back(self, x)
+
+    def front(self):
+        return _Cdi.StringVector_front(self)
+
+    def back(self):
+        return _Cdi.StringVector_back(self)
+
+    def assign(self, n, x):
+        return _Cdi.StringVector_assign(self, n, x)
+
+    def resize(self, *args):
+        return _Cdi.StringVector_resize(self, *args)
+
+    def insert(self, *args):
+        return _Cdi.StringVector_insert(self, *args)
+
+    def reserve(self, n):
+        return _Cdi.StringVector_reserve(self, n)
+
+    def capacity(self):
+        return _Cdi.StringVector_capacity(self)
+    __swig_destroy__ = _Cdi.delete_StringVector
+
+# Register StringVector in _Cdi:
+_Cdi.StringVector_swigregister(StringVector)
+
+class VarsVector(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.VarsVector_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.VarsVector___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.VarsVector___bool__(self)
+
+    def __len__(self):
+        return _Cdi.VarsVector___len__(self)
+
+    def __getslice__(self, i, j):
+        return _Cdi.VarsVector___getslice__(self, i, j)
+
+    def __setslice__(self, *args):
+        return _Cdi.VarsVector___setslice__(self, *args)
+
+    def __delslice__(self, i, j):
+        return _Cdi.VarsVector___delslice__(self, i, j)
+
+    def __delitem__(self, *args):
+        return _Cdi.VarsVector___delitem__(self, *args)
+
+    def __getitem__(self, *args):
+        return _Cdi.VarsVector___getitem__(self, *args)
+
+    def __setitem__(self, *args):
+        return _Cdi.VarsVector___setitem__(self, *args)
+
+    def pop(self):
+        return _Cdi.VarsVector_pop(self)
+
+    def append(self, x):
+        return _Cdi.VarsVector_append(self, x)
+
+    def empty(self):
+        return _Cdi.VarsVector_empty(self)
+
+    def size(self):
+        return _Cdi.VarsVector_size(self)
+
+    def swap(self, v):
+        return _Cdi.VarsVector_swap(self, v)
+
+    def begin(self):
+        return _Cdi.VarsVector_begin(self)
+
+    def end(self):
+        return _Cdi.VarsVector_end(self)
+
+    def rbegin(self):
+        return _Cdi.VarsVector_rbegin(self)
+
+    def rend(self):
+        return _Cdi.VarsVector_rend(self)
+
+    def clear(self):
+        return _Cdi.VarsVector_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.VarsVector_get_allocator(self)
+
+    def pop_back(self):
+        return _Cdi.VarsVector_pop_back(self)
+
+    def erase(self, *args):
+        return _Cdi.VarsVector_erase(self, *args)
+
+    def __init__(self, *args):
+        _Cdi.VarsVector_swiginit(self, _Cdi.new_VarsVector(*args))
+
+    def push_back(self, x):
+        return _Cdi.VarsVector_push_back(self, x)
+
+    def front(self):
+        return _Cdi.VarsVector_front(self)
+
+    def back(self):
+        return _Cdi.VarsVector_back(self)
+
+    def assign(self, n, x):
+        return _Cdi.VarsVector_assign(self, n, x)
+
+    def resize(self, *args):
+        return _Cdi.VarsVector_resize(self, *args)
+
+    def insert(self, *args):
+        return _Cdi.VarsVector_insert(self, *args)
+
+    def reserve(self, n):
+        return _Cdi.VarsVector_reserve(self, n)
+
+    def capacity(self):
+        return _Cdi.VarsVector_capacity(self)
+    __swig_destroy__ = _Cdi.delete_VarsVector
+
+# Register VarsVector in _Cdi:
+_Cdi.VarsVector_swigregister(VarsVector)
+
+class VarsMap(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.VarsMap_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.VarsMap___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.VarsMap___bool__(self)
+
+    def __len__(self):
+        return _Cdi.VarsMap___len__(self)
+    def __iter__(self):
+        return self.key_iterator()
+    def iterkeys(self):
+        return self.key_iterator()
+    def itervalues(self):
+        return self.value_iterator()
+    def iteritems(self):
+        return self.iterator()
+
+    def __getitem__(self, key):
+        return _Cdi.VarsMap___getitem__(self, key)
+
+    def __delitem__(self, key):
+        return _Cdi.VarsMap___delitem__(self, key)
+
+    def has_key(self, key):
+        return _Cdi.VarsMap_has_key(self, key)
+
+    def keys(self):
+        return _Cdi.VarsMap_keys(self)
+
+    def values(self):
+        return _Cdi.VarsMap_values(self)
+
+    def items(self):
+        return _Cdi.VarsMap_items(self)
+
+    def __contains__(self, key):
+        return _Cdi.VarsMap___contains__(self, key)
+
+    def key_iterator(self):
+        return _Cdi.VarsMap_key_iterator(self)
+
+    def value_iterator(self):
+        return _Cdi.VarsMap_value_iterator(self)
+
+    def __setitem__(self, *args):
+        return _Cdi.VarsMap___setitem__(self, *args)
+
+    def asdict(self):
+        return _Cdi.VarsMap_asdict(self)
+
+    def __init__(self, *args):
+        _Cdi.VarsMap_swiginit(self, _Cdi.new_VarsMap(*args))
+
+    def empty(self):
+        return _Cdi.VarsMap_empty(self)
+
+    def size(self):
+        return _Cdi.VarsMap_size(self)
+
+    def swap(self, v):
+        return _Cdi.VarsMap_swap(self, v)
+
+    def begin(self):
+        return _Cdi.VarsMap_begin(self)
+
+    def end(self):
+        return _Cdi.VarsMap_end(self)
+
+    def rbegin(self):
+        return _Cdi.VarsMap_rbegin(self)
+
+    def rend(self):
+        return _Cdi.VarsMap_rend(self)
+
+    def clear(self):
+        return _Cdi.VarsMap_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.VarsMap_get_allocator(self)
+
+    def count(self, x):
+        return _Cdi.VarsMap_count(self, x)
+
+    def erase(self, *args):
+        return _Cdi.VarsMap_erase(self, *args)
+
+    def find(self, x):
+        return _Cdi.VarsMap_find(self, x)
+
+    def lower_bound(self, x):
+        return _Cdi.VarsMap_lower_bound(self, x)
+
+    def upper_bound(self, x):
+        return _Cdi.VarsMap_upper_bound(self, x)
+    __swig_destroy__ = _Cdi.delete_VarsMap
+
+# Register VarsMap in _Cdi:
+_Cdi.VarsMap_swigregister(VarsMap)
+
+class VarsByCode(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.VarsByCode_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.VarsByCode___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.VarsByCode___bool__(self)
+
+    def __len__(self):
+        return _Cdi.VarsByCode___len__(self)
+    def __iter__(self):
+        return self.key_iterator()
+    def iterkeys(self):
+        return self.key_iterator()
+    def itervalues(self):
+        return self.value_iterator()
+    def iteritems(self):
+        return self.iterator()
+
+    def __getitem__(self, key):
+        return _Cdi.VarsByCode___getitem__(self, key)
+
+    def __delitem__(self, key):
+        return _Cdi.VarsByCode___delitem__(self, key)
+
+    def has_key(self, key):
+        return _Cdi.VarsByCode_has_key(self, key)
+
+    def keys(self):
+        return _Cdi.VarsByCode_keys(self)
+
+    def values(self):
+        return _Cdi.VarsByCode_values(self)
+
+    def items(self):
+        return _Cdi.VarsByCode_items(self)
+
+    def __contains__(self, key):
+        return _Cdi.VarsByCode___contains__(self, key)
+
+    def key_iterator(self):
+        return _Cdi.VarsByCode_key_iterator(self)
+
+    def value_iterator(self):
+        return _Cdi.VarsByCode_value_iterator(self)
+
+    def __setitem__(self, *args):
+        return _Cdi.VarsByCode___setitem__(self, *args)
+
+    def asdict(self):
+        return _Cdi.VarsByCode_asdict(self)
+
+    def __init__(self, *args):
+        _Cdi.VarsByCode_swiginit(self, _Cdi.new_VarsByCode(*args))
+
+    def empty(self):
+        return _Cdi.VarsByCode_empty(self)
+
+    def size(self):
+        return _Cdi.VarsByCode_size(self)
+
+    def swap(self, v):
+        return _Cdi.VarsByCode_swap(self, v)
+
+    def begin(self):
+        return _Cdi.VarsByCode_begin(self)
+
+    def end(self):
+        return _Cdi.VarsByCode_end(self)
+
+    def rbegin(self):
+        return _Cdi.VarsByCode_rbegin(self)
+
+    def rend(self):
+        return _Cdi.VarsByCode_rend(self)
+
+    def clear(self):
+        return _Cdi.VarsByCode_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.VarsByCode_get_allocator(self)
+
+    def count(self, x):
+        return _Cdi.VarsByCode_count(self, x)
+
+    def erase(self, *args):
+        return _Cdi.VarsByCode_erase(self, *args)
+
+    def find(self, x):
+        return _Cdi.VarsByCode_find(self, x)
+
+    def lower_bound(self, x):
+        return _Cdi.VarsByCode_lower_bound(self, x)
+
+    def upper_bound(self, x):
+        return _Cdi.VarsByCode_upper_bound(self, x)
+    __swig_destroy__ = _Cdi.delete_VarsByCode
+
+# Register VarsByCode in _Cdi:
+_Cdi.VarsByCode_swigregister(VarsByCode)
+
+class TaxesMap(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.TaxesMap_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.TaxesMap___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.TaxesMap___bool__(self)
+
+    def __len__(self):
+        return _Cdi.TaxesMap___len__(self)
+    def __iter__(self):
+        return self.key_iterator()
+    def iterkeys(self):
+        return self.key_iterator()
+    def itervalues(self):
+        return self.value_iterator()
+    def iteritems(self):
+        return self.iterator()
+
+    def __getitem__(self, key):
+        return _Cdi.TaxesMap___getitem__(self, key)
+
+    def __delitem__(self, key):
+        return _Cdi.TaxesMap___delitem__(self, key)
+
+    def has_key(self, key):
+        return _Cdi.TaxesMap_has_key(self, key)
+
+    def keys(self):
+        return _Cdi.TaxesMap_keys(self)
+
+    def values(self):
+        return _Cdi.TaxesMap_values(self)
+
+    def items(self):
+        return _Cdi.TaxesMap_items(self)
+
+    def __contains__(self, key):
+        return _Cdi.TaxesMap___contains__(self, key)
+
+    def key_iterator(self):
+        return _Cdi.TaxesMap_key_iterator(self)
+
+    def value_iterator(self):
+        return _Cdi.TaxesMap_value_iterator(self)
+
+    def __setitem__(self, *args):
+        return _Cdi.TaxesMap___setitem__(self, *args)
+
+    def asdict(self):
+        return _Cdi.TaxesMap_asdict(self)
+
+    def __init__(self, *args):
+        _Cdi.TaxesMap_swiginit(self, _Cdi.new_TaxesMap(*args))
+
+    def empty(self):
+        return _Cdi.TaxesMap_empty(self)
+
+    def size(self):
+        return _Cdi.TaxesMap_size(self)
+
+    def swap(self, v):
+        return _Cdi.TaxesMap_swap(self, v)
+
+    def begin(self):
+        return _Cdi.TaxesMap_begin(self)
+
+    def end(self):
+        return _Cdi.TaxesMap_end(self)
+
+    def rbegin(self):
+        return _Cdi.TaxesMap_rbegin(self)
+
+    def rend(self):
+        return _Cdi.TaxesMap_rend(self)
+
+    def clear(self):
+        return _Cdi.TaxesMap_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.TaxesMap_get_allocator(self)
+
+    def count(self, x):
+        return _Cdi.TaxesMap_count(self, x)
+
+    def erase(self, *args):
+        return _Cdi.TaxesMap_erase(self, *args)
+
+    def find(self, x):
+        return _Cdi.TaxesMap_find(self, x)
+
+    def lower_bound(self, x):
+        return _Cdi.TaxesMap_lower_bound(self, x)
+
+    def upper_bound(self, x):
+        return _Cdi.TaxesMap_upper_bound(self, x)
+    __swig_destroy__ = _Cdi.delete_TaxesMap
+
+# Register TaxesMap in _Cdi:
+_Cdi.TaxesMap_swigregister(TaxesMap)
+
+class ZaxesMap(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.ZaxesMap_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.ZaxesMap___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.ZaxesMap___bool__(self)
+
+    def __len__(self):
+        return _Cdi.ZaxesMap___len__(self)
+    def __iter__(self):
+        return self.key_iterator()
+    def iterkeys(self):
+        return self.key_iterator()
+    def itervalues(self):
+        return self.value_iterator()
+    def iteritems(self):
+        return self.iterator()
+
+    def __getitem__(self, key):
+        return _Cdi.ZaxesMap___getitem__(self, key)
+
+    def __delitem__(self, key):
+        return _Cdi.ZaxesMap___delitem__(self, key)
+
+    def has_key(self, key):
+        return _Cdi.ZaxesMap_has_key(self, key)
+
+    def keys(self):
+        return _Cdi.ZaxesMap_keys(self)
+
+    def values(self):
+        return _Cdi.ZaxesMap_values(self)
+
+    def items(self):
+        return _Cdi.ZaxesMap_items(self)
+
+    def __contains__(self, key):
+        return _Cdi.ZaxesMap___contains__(self, key)
+
+    def key_iterator(self):
+        return _Cdi.ZaxesMap_key_iterator(self)
+
+    def value_iterator(self):
+        return _Cdi.ZaxesMap_value_iterator(self)
+
+    def __setitem__(self, *args):
+        return _Cdi.ZaxesMap___setitem__(self, *args)
+
+    def asdict(self):
+        return _Cdi.ZaxesMap_asdict(self)
+
+    def __init__(self, *args):
+        _Cdi.ZaxesMap_swiginit(self, _Cdi.new_ZaxesMap(*args))
+
+    def empty(self):
+        return _Cdi.ZaxesMap_empty(self)
+
+    def size(self):
+        return _Cdi.ZaxesMap_size(self)
+
+    def swap(self, v):
+        return _Cdi.ZaxesMap_swap(self, v)
+
+    def begin(self):
+        return _Cdi.ZaxesMap_begin(self)
+
+    def end(self):
+        return _Cdi.ZaxesMap_end(self)
+
+    def rbegin(self):
+        return _Cdi.ZaxesMap_rbegin(self)
+
+    def rend(self):
+        return _Cdi.ZaxesMap_rend(self)
+
+    def clear(self):
+        return _Cdi.ZaxesMap_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.ZaxesMap_get_allocator(self)
+
+    def count(self, x):
+        return _Cdi.ZaxesMap_count(self, x)
+
+    def erase(self, *args):
+        return _Cdi.ZaxesMap_erase(self, *args)
+
+    def find(self, x):
+        return _Cdi.ZaxesMap_find(self, x)
+
+    def lower_bound(self, x):
+        return _Cdi.ZaxesMap_lower_bound(self, x)
+
+    def upper_bound(self, x):
+        return _Cdi.ZaxesMap_upper_bound(self, x)
+    __swig_destroy__ = _Cdi.delete_ZaxesMap
+
+# Register ZaxesMap in _Cdi:
+_Cdi.ZaxesMap_swigregister(ZaxesMap)
+
+class GridsMap(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def iterator(self):
+        return _Cdi.GridsMap_iterator(self)
+    def __iter__(self):
+        return self.iterator()
+
+    def __nonzero__(self):
+        return _Cdi.GridsMap___nonzero__(self)
+
+    def __bool__(self):
+        return _Cdi.GridsMap___bool__(self)
+
+    def __len__(self):
+        return _Cdi.GridsMap___len__(self)
+    def __iter__(self):
+        return self.key_iterator()
+    def iterkeys(self):
+        return self.key_iterator()
+    def itervalues(self):
+        return self.value_iterator()
+    def iteritems(self):
+        return self.iterator()
+
+    def __getitem__(self, key):
+        return _Cdi.GridsMap___getitem__(self, key)
+
+    def __delitem__(self, key):
+        return _Cdi.GridsMap___delitem__(self, key)
+
+    def has_key(self, key):
+        return _Cdi.GridsMap_has_key(self, key)
+
+    def keys(self):
+        return _Cdi.GridsMap_keys(self)
+
+    def values(self):
+        return _Cdi.GridsMap_values(self)
+
+    def items(self):
+        return _Cdi.GridsMap_items(self)
+
+    def __contains__(self, key):
+        return _Cdi.GridsMap___contains__(self, key)
+
+    def key_iterator(self):
+        return _Cdi.GridsMap_key_iterator(self)
+
+    def value_iterator(self):
+        return _Cdi.GridsMap_value_iterator(self)
+
+    def __setitem__(self, *args):
+        return _Cdi.GridsMap___setitem__(self, *args)
+
+    def asdict(self):
+        return _Cdi.GridsMap_asdict(self)
+
+    def __init__(self, *args):
+        _Cdi.GridsMap_swiginit(self, _Cdi.new_GridsMap(*args))
+
+    def empty(self):
+        return _Cdi.GridsMap_empty(self)
+
+    def size(self):
+        return _Cdi.GridsMap_size(self)
+
+    def swap(self, v):
+        return _Cdi.GridsMap_swap(self, v)
+
+    def begin(self):
+        return _Cdi.GridsMap_begin(self)
+
+    def end(self):
+        return _Cdi.GridsMap_end(self)
+
+    def rbegin(self):
+        return _Cdi.GridsMap_rbegin(self)
+
+    def rend(self):
+        return _Cdi.GridsMap_rend(self)
+
+    def clear(self):
+        return _Cdi.GridsMap_clear(self)
+
+    def get_allocator(self):
+        return _Cdi.GridsMap_get_allocator(self)
+
+    def count(self, x):
+        return _Cdi.GridsMap_count(self, x)
+
+    def erase(self, *args):
+        return _Cdi.GridsMap_erase(self, *args)
+
+    def find(self, x):
+        return _Cdi.GridsMap_find(self, x)
+
+    def lower_bound(self, x):
+        return _Cdi.GridsMap_lower_bound(self, x)
+
+    def upper_bound(self, x):
+        return _Cdi.GridsMap_upper_bound(self, x)
+    __swig_destroy__ = _Cdi.delete_GridsMap
+
+# Register GridsMap in _Cdi:
+_Cdi.GridsMap_swigregister(GridsMap)
+
+class CdiGrid(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        _Cdi.CdiGrid_swiginit(self, _Cdi.new_CdiGrid(*args))
+    __swig_destroy__ = _Cdi.delete_CdiGrid
+    gridID = property(_Cdi.CdiGrid_gridID_get, _Cdi.CdiGrid_gridID_set)
+    type = property(_Cdi.CdiGrid_type_get, _Cdi.CdiGrid_type_set)
+    size = property(_Cdi.CdiGrid_size_get, _Cdi.CdiGrid_size_set)
+    xsize = property(_Cdi.CdiGrid_xsize_get, _Cdi.CdiGrid_xsize_set)
+    ysize = property(_Cdi.CdiGrid_ysize_get, _Cdi.CdiGrid_ysize_set)
+    prec = property(_Cdi.CdiGrid_prec_get, _Cdi.CdiGrid_prec_set)
+    ncorner = property(_Cdi.CdiGrid_ncorner_get, _Cdi.CdiGrid_ncorner_set)
+    hasXValues = property(_Cdi.CdiGrid_hasXValues_get, _Cdi.CdiGrid_hasXValues_set)
+    hasYValues = property(_Cdi.CdiGrid_hasYValues_get, _Cdi.CdiGrid_hasYValues_set)
+    hasBounds = property(_Cdi.CdiGrid_hasBounds_get, _Cdi.CdiGrid_hasBounds_set)
+    xvalues = property(_Cdi.CdiGrid_xvalues_get, _Cdi.CdiGrid_xvalues_set)
+    yvalues = property(_Cdi.CdiGrid_yvalues_get, _Cdi.CdiGrid_yvalues_set)
+    xbounds = property(_Cdi.CdiGrid_xbounds_get, _Cdi.CdiGrid_xbounds_set)
+    ybounds = property(_Cdi.CdiGrid_ybounds_get, _Cdi.CdiGrid_ybounds_set)
+    xname = property(_Cdi.CdiGrid_xname_get, _Cdi.CdiGrid_xname_set)
+    xlongname = property(_Cdi.CdiGrid_xlongname_get, _Cdi.CdiGrid_xlongname_set)
+    xstdname = property(_Cdi.CdiGrid_xstdname_get, _Cdi.CdiGrid_xstdname_set)
+    xunits = property(_Cdi.CdiGrid_xunits_get, _Cdi.CdiGrid_xunits_set)
+    yname = property(_Cdi.CdiGrid_yname_get, _Cdi.CdiGrid_yname_set)
+    ylongname = property(_Cdi.CdiGrid_ylongname_get, _Cdi.CdiGrid_ylongname_set)
+    ystdname = property(_Cdi.CdiGrid_ystdname_get, _Cdi.CdiGrid_ystdname_set)
+    yunits = property(_Cdi.CdiGrid_yunits_get, _Cdi.CdiGrid_yunits_set)
+    name = property(_Cdi.CdiGrid_name_get, _Cdi.CdiGrid_name_set)
+
+    def getValues(self):
+        return _Cdi.CdiGrid_getValues(self)
+
+    def getBounds(self):
+        return _Cdi.CdiGrid_getBounds(self)
+
+    def getValuesAsPointer(self, xvals, yvals):
+        return _Cdi.CdiGrid_getValuesAsPointer(self, xvals, yvals)
+
+    def getBoundsAsPointer(self, xbnds, ybnds):
+        return _Cdi.CdiGrid_getBoundsAsPointer(self, xbnds, ybnds)
+
+    def getFloatVals(self, xvals, yvals):
+        return _Cdi.CdiGrid_getFloatVals(self, xvals, yvals)
+
+    def getFloatBounds(self, xbnds, ybnds):
+        return _Cdi.CdiGrid_getFloatBounds(self, xbnds, ybnds)
+
+# Register CdiGrid in _Cdi:
+_Cdi.CdiGrid_swigregister(CdiGrid)
+
+class CdiTaxis(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        _Cdi.CdiTaxis_swiginit(self, _Cdi.new_CdiTaxis(*args))
+    __swig_destroy__ = _Cdi.delete_CdiTaxis
+    taxisID = property(_Cdi.CdiTaxis_taxisID_get, _Cdi.CdiTaxis_taxisID_set)
+    ntsteps = property(_Cdi.CdiTaxis_ntsteps_get, _Cdi.CdiTaxis_ntsteps_set)
+    unit = property(_Cdi.CdiTaxis_unit_get, _Cdi.CdiTaxis_unit_set)
+    rdate = property(_Cdi.CdiTaxis_rdate_get, _Cdi.CdiTaxis_rdate_set)
+    rtime = property(_Cdi.CdiTaxis_rtime_get, _Cdi.CdiTaxis_rtime_set)
+    vdate = property(_Cdi.CdiTaxis_vdate_get, _Cdi.CdiTaxis_vdate_set)
+    vtime = property(_Cdi.CdiTaxis_vtime_get, _Cdi.CdiTaxis_vtime_set)
+    type = property(_Cdi.CdiTaxis_type_get, _Cdi.CdiTaxis_type_set)
+    calendar = property(_Cdi.CdiTaxis_calendar_get, _Cdi.CdiTaxis_calendar_set)
+    hasBounds = property(_Cdi.CdiTaxis_hasBounds_get, _Cdi.CdiTaxis_hasBounds_set)
+    name = property(_Cdi.CdiTaxis_name_get, _Cdi.CdiTaxis_name_set)
+    unitname = property(_Cdi.CdiTaxis_unitname_get, _Cdi.CdiTaxis_unitname_set)
+
+# Register CdiTaxis in _Cdi:
+_Cdi.CdiTaxis_swigregister(CdiTaxis)
+
+class CdiZaxis(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        _Cdi.CdiZaxis_swiginit(self, _Cdi.new_CdiZaxis(*args))
+    __swig_destroy__ = _Cdi.delete_CdiZaxis
+    zaxisID = property(_Cdi.CdiZaxis_zaxisID_get, _Cdi.CdiZaxis_zaxisID_set)
+    type = property(_Cdi.CdiZaxis_type_get, _Cdi.CdiZaxis_type_set)
+    ltype = property(_Cdi.CdiZaxis_ltype_get, _Cdi.CdiZaxis_ltype_set)
+    size = property(_Cdi.CdiZaxis_size_get, _Cdi.CdiZaxis_size_set)
+    prec = property(_Cdi.CdiZaxis_prec_get, _Cdi.CdiZaxis_prec_set)
+    plevels = property(_Cdi.CdiZaxis_plevels_get, _Cdi.CdiZaxis_plevels_set)
+    plbounds = property(_Cdi.CdiZaxis_plbounds_get, _Cdi.CdiZaxis_plbounds_set)
+    pubounds = property(_Cdi.CdiZaxis_pubounds_get, _Cdi.CdiZaxis_pubounds_set)
+    pweights = property(_Cdi.CdiZaxis_pweights_get, _Cdi.CdiZaxis_pweights_set)
+    levels = property(_Cdi.CdiZaxis_levels_get, _Cdi.CdiZaxis_levels_set)
+    lbounds = property(_Cdi.CdiZaxis_lbounds_get, _Cdi.CdiZaxis_lbounds_set)
+    ubounds = property(_Cdi.CdiZaxis_ubounds_get, _Cdi.CdiZaxis_ubounds_set)
+    weights = property(_Cdi.CdiZaxis_weights_get, _Cdi.CdiZaxis_weights_set)
+    name = property(_Cdi.CdiZaxis_name_get, _Cdi.CdiZaxis_name_set)
+    longname = property(_Cdi.CdiZaxis_longname_get, _Cdi.CdiZaxis_longname_set)
+    units = property(_Cdi.CdiZaxis_units_get, _Cdi.CdiZaxis_units_set)
+
+# Register CdiZaxis in _Cdi:
+_Cdi.CdiZaxis_swigregister(CdiZaxis)
+
+class CdiVariable(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, *args):
+        _Cdi.CdiVariable_swiginit(self, _Cdi.new_CdiVariable(*args))
+    __swig_destroy__ = _Cdi.delete_CdiVariable
+    varID = property(_Cdi.CdiVariable_varID_get, _Cdi.CdiVariable_varID_set)
+    zaxisID = property(_Cdi.CdiVariable_zaxisID_get, _Cdi.CdiVariable_zaxisID_set)
+    gridID = property(_Cdi.CdiVariable_gridID_get, _Cdi.CdiVariable_gridID_set)
+    taxisID = property(_Cdi.CdiVariable_taxisID_get, _Cdi.CdiVariable_taxisID_set)
+    timeID = property(_Cdi.CdiVariable_timeID_get, _Cdi.CdiVariable_timeID_set)
+    vlistID = property(_Cdi.CdiVariable_vlistID_get, _Cdi.CdiVariable_vlistID_set)
+    size = property(_Cdi.CdiVariable_size_get, _Cdi.CdiVariable_size_set)
+    code = property(_Cdi.CdiVariable_code_get, _Cdi.CdiVariable_code_set)
+    datatype = property(_Cdi.CdiVariable_datatype_get, _Cdi.CdiVariable_datatype_set)
+    streamID = property(_Cdi.CdiVariable_streamID_get, _Cdi.CdiVariable_streamID_set)
+    name = property(_Cdi.CdiVariable_name_get, _Cdi.CdiVariable_name_set)
+    longname = property(_Cdi.CdiVariable_longname_get, _Cdi.CdiVariable_longname_set)
+    units = property(_Cdi.CdiVariable_units_get, _Cdi.CdiVariable_units_set)
+    stdname = property(_Cdi.CdiVariable_stdname_get, _Cdi.CdiVariable_stdname_set)
+    missval = property(_Cdi.CdiVariable_missval_get, _Cdi.CdiVariable_missval_set)
+    values = property(_Cdi.CdiVariable_values_get, _Cdi.CdiVariable_values_set)
+    valuesWithLevel = property(_Cdi.CdiVariable_valuesWithLevel_get, _Cdi.CdiVariable_valuesWithLevel_set)
+    grid = property(_Cdi.CdiVariable_grid_get, _Cdi.CdiVariable_grid_set)
+    zaxis = property(_Cdi.CdiVariable_zaxis_get, _Cdi.CdiVariable_zaxis_set)
+    taxis = property(_Cdi.CdiVariable_taxis_get, _Cdi.CdiVariable_taxis_set)
+
+    def sinfo(self):
+        return _Cdi.CdiVariable_sinfo(self)
+
+    def getValues(self):
+        return _Cdi.CdiVariable_getValues(self)
+
+    def getValuesWithLevel(self, tsID=0):
+        return _Cdi.CdiVariable_getValuesWithLevel(self, tsID)
+
+    def getFValues(self):
+        return _Cdi.CdiVariable_getFValues(self)
+
+    def getFValuesWithLevel(self, tsID=0):
+        return _Cdi.CdiVariable_getFValuesWithLevel(self, tsID)
+
+    def getValuesAsPointer(self):
+        return _Cdi.CdiVariable_getValuesAsPointer(self)
+
+    def getValuesWithLevelAsPointer(self, tsID=0):
+        return _Cdi.CdiVariable_getValuesWithLevelAsPointer(self, tsID)
+
+# Register CdiVariable in _Cdi:
+_Cdi.CdiVariable_swigregister(CdiVariable)
+
+class Cdi(object):
+    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
+    __repr__ = _swig_repr
+
+    def __init__(self, path):
+        _Cdi.Cdi_swiginit(self, _Cdi.new_Cdi(path))
+    __swig_destroy__ = _Cdi.delete_Cdi
+    streamID = property(_Cdi.Cdi_streamID_get, _Cdi.Cdi_streamID_set)
+    vlistID = property(_Cdi.Cdi_vlistID_get, _Cdi.Cdi_vlistID_set)
+    nvars = property(_Cdi.Cdi_nvars_get, _Cdi.Cdi_nvars_set)
+    nzaxes = property(_Cdi.Cdi_nzaxes_get, _Cdi.Cdi_nzaxes_set)
+    ngrids = property(_Cdi.Cdi_ngrids_get, _Cdi.Cdi_ngrids_set)
+    ntaxes = property(_Cdi.Cdi_ntaxes_get, _Cdi.Cdi_ntaxes_set)
+    taxisID = property(_Cdi.Cdi_taxisID_get, _Cdi.Cdi_taxisID_set)
+    varnames = property(_Cdi.Cdi_varnames_get, _Cdi.Cdi_varnames_set)
+    codes = property(_Cdi.Cdi_codes_get, _Cdi.Cdi_codes_set)
+    variables = property(_Cdi.Cdi_variables_get, _Cdi.Cdi_variables_set)
+    var = property(_Cdi.Cdi_var_get, _Cdi.Cdi_var_set)
+    varByCode = property(_Cdi.Cdi_varByCode_get, _Cdi.Cdi_varByCode_set)
+    taxes = property(_Cdi.Cdi_taxes_get, _Cdi.Cdi_taxes_set)
+    zaxes = property(_Cdi.Cdi_zaxes_get, _Cdi.Cdi_zaxes_set)
+    grids = property(_Cdi.Cdi_grids_get, _Cdi.Cdi_grids_set)
+
+    def griddes(self):
+        return _Cdi.Cdi_griddes(self)
+
+# Register Cdi in _Cdi:
+_Cdi.Cdi_swigregister(Cdi)
+
+
+
diff --git a/interfaces/python/Makefile.in b/interfaces/python/Makefile.in
new file mode 100644
index 000000000..9d3108196
--- /dev/null
+++ b/interfaces/python/Makefile.in
@@ -0,0 +1,861 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = interfaces/python
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__python_PYTHON_DIST) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)"
+LTLIBRARIES = $(pyexec_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+@ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_DEPENDENCIES = ../libcdipp.la \
+@ENABLE_PYTHON_INTERFACE_TRUE@	$(am__DEPENDENCIES_1)
+am___Cdi_la_SOURCES_DIST = cdi_wrapper.cpp
+@ENABLE_PYTHON_INTERFACE_TRUE@am__Cdi_la_OBJECTS =  \
+@ENABLE_PYTHON_INTERFACE_TRUE@	_Cdi_la-cdi_wrapper.lo
+_Cdi_la_OBJECTS = $(am__Cdi_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+@ENABLE_PYTHON_INTERFACE_TRUE@am__Cdi_la_rpath = -rpath $(pyexecdir)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/_Cdi_la-cdi_wrapper.Plo
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo "  CXX     " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo "  CXXLD   " $@;
+am__v_CXXLD_1 =
+SOURCES = $(_Cdi_la_SOURCES)
+DIST_SOURCES = $(am___Cdi_la_SOURCES_DIST)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__python_PYTHON_DIST = Cdi.py
+am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile)
+am__pep3147_tweak = \
+  sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.py|'
+py_compile = $(top_srcdir)/config/py-compile
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \
+	$(top_srcdir)/config/py-compile
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+@ENABLE_PYTHON_INTERFACE_TRUE@python_PYTHON = Cdi.py
+@ENABLE_PYTHON_INTERFACE_TRUE@pyexec_LTLIBRARIES = _Cdi.la
+@ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_SOURCES = cdi_wrapper.cpp
+@ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_CPPFLAGS)
+@ENABLE_PYTHON_INTERFACE_TRUE@AM_CXXFLAGS = -shared
+@ENABLE_PYTHON_INTERFACE_TRUE@AM_LDFLAGS = -module -avoid-version
+@ENABLE_PYTHON_INTERFACE_TRUE@AM_CPPFLAGS = -I$(srcdir)/.. -I$(top_srcdir)/src
+@ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_LIBADD = ../libcdipp.la $(PYTHON_LIBS)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/python/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign interfaces/python/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-pyexecLTLIBRARIES: $(pyexec_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pyexecdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pyexecdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pyexecdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pyexecdir)"; \
+	}
+
+uninstall-pyexecLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pyexecdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pyexecdir)/$$f"; \
+	done
+
+clean-pyexecLTLIBRARIES:
+	-test -z "$(pyexec_LTLIBRARIES)" || rm -f $(pyexec_LTLIBRARIES)
+	@list='$(pyexec_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+_Cdi.la: $(_Cdi_la_OBJECTS) $(_Cdi_la_DEPENDENCIES) $(EXTRA__Cdi_la_DEPENDENCIES)
+	$(AM_V_CXXLD)$(CXXLINK) $(am__Cdi_la_rpath) $(_Cdi_la_OBJECTS) $(_Cdi_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/_Cdi_la-cdi_wrapper.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cpp.lo:
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
+
+_Cdi_la-cdi_wrapper.lo: cdi_wrapper.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(_Cdi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT _Cdi_la-cdi_wrapper.lo -MD -MP -MF $(DEPDIR)/_Cdi_la-cdi_wrapper.Tpo -c -o _Cdi_la-cdi_wrapper.lo `test -f 'cdi_wrapper.cpp' || echo '$(srcdir)/'`cdi_wrapper.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/_Cdi_la-cdi_wrapper.Tpo $(DEPDIR)/_Cdi_la-cdi_wrapper.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='cdi_wrapper.cpp' object='_Cdi_la-cdi_wrapper.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(_Cdi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o _Cdi_la-cdi_wrapper.lo `test -f 'cdi_wrapper.cpp' || echo '$(srcdir)/'`cdi_wrapper.cpp
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-pythonPYTHON: $(python_PYTHON)
+	@$(NORMAL_INSTALL)
+	@list='$(python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \
+	  if test -f $$b$$p; then \
+	    $(am__strip_dir) \
+	    dlist="$$dlist $$f"; \
+	    list2="$$list2 $$b$$p"; \
+	  else :; fi; \
+	done; \
+	for file in $$list2; do echo $$file; done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \
+	done || exit $$?; \
+	if test -n "$$dlist"; then \
+	  $(am__py_compile) --destdir "$(DESTDIR)" \
+	                    --basedir "$(pythondir)" $$dlist; \
+	else :; fi
+
+uninstall-pythonPYTHON:
+	@$(NORMAL_UNINSTALL)
+	@list='$(python_PYTHON)'; test -n "$(pythondir)" || list=; \
+	py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	test -n "$$py_files" || exit 0; \
+	dir='$(DESTDIR)$(pythondir)'; \
+	pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \
+	pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \
+	py_files_pep3147=`echo "$$py_files" | $(am__pep3147_tweak)`; \
+	echo "$$py_files_pep3147";\
+	pyc_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|c|'`; \
+	pyo_files_pep3147=`echo "$$py_files_pep3147" | sed 's|$$|o|'`; \
+	st=0; \
+	for files in \
+	  "$$py_files" \
+	  "$$pyc_files" \
+	  "$$pyo_files" \
+	  "$$pyc_files_pep3147" \
+	  "$$pyo_files_pep3147" \
+	; do \
+	  $(am__uninstall_files_from_dir) || st=$$?; \
+	done; \
+	exit $$st
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES)
+installdirs:
+	for dir in "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-pyexecLTLIBRARIES \
+	mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/_Cdi_la-cdi_wrapper.Plo
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+examples: examples-am
+
+examples-am: examples-local
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-pythonPYTHON
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pyexecLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/_Cdi_la-cdi_wrapper.Plo
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-pyexecLTLIBRARIES uninstall-pythonPYTHON
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-generic clean-libtool clean-pyexecLTLIBRARIES \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am examples-am examples-local html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-pyexecLTLIBRARIES install-pythonPYTHON install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am \
+	uninstall-pyexecLTLIBRARIES uninstall-pythonPYTHON
+
+.PRECIOUS: Makefile
+
+
+@ENABLE_PYTHON_INTERFACE_TRUE@../libcdipp.la:
+@ENABLE_PYTHON_INTERFACE_TRUE@	$(am__cd) .. && $(MAKE) libcdipp.la
+
+@MAINTAINER_MODE_TRUE@Cdi.py: ../cdi.i ../cdi.hpp
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(SWIG) -python -c++ -o cdi_wrapper.cpp $<
+
+@MAINTAINER_MODE_TRUE@cdi_wrapper.cpp: Cdi.py
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || rm -f $<
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/interfaces/python/cdi_wrapper.cpp b/interfaces/python/cdi_wrapper.cpp
new file mode 100644
index 000000000..06e0159f1
--- /dev/null
+++ b/interfaces/python/cdi_wrapper.cpp
@@ -0,0 +1,29389 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 4.0.2
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+
+#ifndef SWIGPYTHON
+#define SWIGPYTHON
+#endif
+
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__))
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__))
+# else
+#   define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if defined(__GNUC__)
+#  if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#    ifndef GCC_HASCLASSVISIBILITY
+#      define GCC_HASCLASSVISIBILITY
+#    endif
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+
+#if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND)
+/* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */
+# include <math.h>
+#endif
+
+#if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG)
+/* Use debug wrappers with the Python release dll */
+# undef _DEBUG
+# include <Python.h>
+# define _DEBUG 1
+#else
+# include <Python.h>
+#endif
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+#define SWIG_POINTER_NO_NULL       0x4
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/*
+   Flags/methods for returning states.
+
+   The SWIG conversion methods, as ConvertPtr, return an integer
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+
+   Use the following macros/flags to set or process the returning
+   states.
+
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {
+        if (<obj is ok>) {
+          if (<need new object>) {
+            *ptr = <ptr to new allocated object>;
+            return SWIG_NEWOBJ;
+          } else {
+            *ptr = <ptr to old object>;
+            return SWIG_OLDOBJ;
+          }
+        } else {
+          return SWIG_BADOBJ;
+        }
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0)
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast(r) (r)
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/*
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCmp(const char *nb, const char *tb) {
+  int equiv = 1;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (equiv != 0 && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = SWIG_TypeNameComp(nb, ne, tb, te);
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
+}
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/*
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/*
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+                            swig_module_info *end,
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      size_t l = 0;
+      size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	size_t i = (l + r) >> 1;
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  int compare = strcmp(name, iname);
+	  if (compare == 0) {
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start,
+                     swig_module_info *end,
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+
+  /* neither found a match */
+  return 0;
+}
+
+/*
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  const unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/*
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    char d = *(c++);
+    unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = (unsigned char)((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = (unsigned char)((d - ('a'-10)) << 4);
+    else
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (unsigned char)(d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (unsigned char)(d - ('a'-10));
+    else
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/*
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1
+#define  SWIG_IOError        	   -2
+#define  SWIG_RuntimeError   	   -3
+#define  SWIG_IndexError     	   -4
+#define  SWIG_TypeError      	   -5
+#define  SWIG_DivisionByZero 	   -6
+#define  SWIG_OverflowError  	   -7
+#define  SWIG_SyntaxError    	   -8
+#define  SWIG_ValueError     	   -9
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12
+#define  SWIG_NullReferenceError   -13
+
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyInt_FromSize_t(x) PyLong_FromSize_t(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)	
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x)
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+#ifndef Py_TYPE
+#  define Py_TYPE(op) ((op)->ob_type)
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+#  define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Warning: This function will allocate a new string in Python 3,
+ * so please call SWIG_Python_str_DelForPy3(x) to free the space.
+ */
+SWIGINTERN char*
+SWIG_Python_str_AsChar(PyObject *str)
+{
+#if PY_VERSION_HEX >= 0x03030000
+  return (char *)PyUnicode_AsUTF8(str);
+#elif PY_VERSION_HEX >= 0x03000000
+  char *newstr = 0;
+  str = PyUnicode_AsUTF8String(str);
+  if (str) {
+    char *cstr;
+    Py_ssize_t len;
+    if (PyBytes_AsStringAndSize(str, &cstr, &len) != -1) {
+      newstr = (char *) malloc(len+1);
+      if (newstr)
+        memcpy(newstr, cstr, len+1);
+    }
+    Py_XDECREF(str);
+  }
+  return newstr;
+#else
+  return PyString_AsString(str);
+#endif
+}
+
+#if PY_VERSION_HEX >= 0x03030000 || PY_VERSION_HEX < 0x03000000
+#  define SWIG_Python_str_DelForPy3(x)
+#else
+#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
+#endif
+
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  return PyUnicode_FromString(c); 
+#else
+  return PyString_FromString(c);
+#endif
+}
+
+#ifndef PyObject_DEL
+# define PyObject_DEL PyObject_Del
+#endif
+
+// SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user
+// interface files check for it.
+# define SWIGPY_USE_CAPSULE
+# define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME)
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#define Py_hash_t long
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+  PyObject* type = 0;
+  switch(code) {
+  case SWIG_MemoryError:
+    type = PyExc_MemoryError;
+    break;
+  case SWIG_IOError:
+    type = PyExc_IOError;
+    break;
+  case SWIG_RuntimeError:
+    type = PyExc_RuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = PyExc_IndexError;
+    break;
+  case SWIG_TypeError:
+    type = PyExc_TypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = PyExc_ZeroDivisionError;
+    break;
+  case SWIG_OverflowError:
+    type = PyExc_OverflowError;
+    break;
+  case SWIG_SyntaxError:
+    type = PyExc_SyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = PyExc_ValueError;
+    break;
+  case SWIG_SystemError:
+    type = PyExc_SystemError;
+    break;
+  case SWIG_AttributeError:
+    type = PyExc_AttributeError;
+    break;
+  default:
+    type = PyExc_RuntimeError;
+  }
+  return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+  PyObject *type = 0;
+  PyObject *value = 0;
+  PyObject *traceback = 0;
+
+  if (PyErr_Occurred())
+    PyErr_Fetch(&type, &value, &traceback);
+  if (value) {
+    PyObject *old_str = PyObject_Str(value);
+    const char *tmp = SWIG_Python_str_AsChar(old_str);
+    PyErr_Clear();
+    Py_XINCREF(type);
+    if (tmp)
+      PyErr_Format(type, "%s %s", tmp, mesg);
+    else
+      PyErr_Format(type, "%s", mesg);
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(old_str);
+    Py_DECREF(value);
+  } else {
+    PyErr_SetString(PyExc_RuntimeError, mesg);
+  }
+}
+
+SWIGRUNTIME int
+SWIG_Python_TypeErrorOccurred(PyObject *obj)
+{
+  PyObject *error;
+  if (obj)
+    return 0;
+  error = PyErr_Occurred();
+  return error && PyErr_GivenExceptionMatches(error, PyExc_TypeError);
+}
+
+SWIGRUNTIME void
+SWIG_Python_RaiseOrModifyTypeError(const char *message)
+{
+  if (SWIG_Python_TypeErrorOccurred(NULL)) {
+    /* Use existing TypeError to preserve stacktrace and enhance with given message */
+    PyObject *newvalue;
+    PyObject *type = NULL, *value = NULL, *traceback = NULL;
+    PyErr_Fetch(&type, &value, &traceback);
+#if PY_VERSION_HEX >= 0x03000000
+    newvalue = PyUnicode_FromFormat("%S\nAdditional information:\n%s", value, message);
+#else
+    newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message);
+#endif
+    Py_XDECREF(value);
+    PyErr_Restore(type, newvalue, traceback);
+  } else {
+    /* Raise TypeError using given message */
+    PyErr_SetString(PyExc_TypeError, message);
+  }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+#  if defined(SWIG_PYTHON_THREADS)
+#    undef SWIG_PYTHON_THREADS
+#  endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+#    define SWIG_PYTHON_USE_GIL
+#  endif
+#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
+#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
+#    endif
+#    ifdef __cplusplus /* C++ code */
+       class SWIG_Python_Thread_Block {
+         bool status;
+         PyGILState_STATE state;
+       public:
+         void end() { if (status) { PyGILState_Release(state); status = false;} }
+         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+         ~SWIG_Python_Thread_Block() { end(); }
+       };
+       class SWIG_Python_Thread_Allow {
+         bool status;
+         PyThreadState *save;
+       public:
+         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
+         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+         ~SWIG_Python_Thread_Allow() { end(); }
+       };
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
+#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
+#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
+#    else /* C code */
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
+#    endif
+#  else /* Old thread way, not implemented, user must provide it */
+#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+#      define SWIG_PYTHON_INITIALIZE_THREADS
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+#      define SWIG_PYTHON_THREAD_END_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+#      define SWIG_PYTHON_THREAD_END_ALLOW
+#    endif
+#  endif
+#else /* No thread support */
+#  define SWIG_PYTHON_INITIALIZE_THREADS
+#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#  define SWIG_PYTHON_THREAD_END_BLOCK
+#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#  define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+  int type;
+  const char *name;
+  long lvalue;
+  double dvalue;
+  void   *pvalue;
+  swig_type_info **ptype;
+} swig_const_info;
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+#if PY_VERSION_HEX < 0x02070000 /* 2.7.0 */
+# error "This version of SWIG only supports Python >= 2.7"
+#endif
+
+#if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03020000
+# error "This version of SWIG only supports Python 3 >= 3.2"
+#endif
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags)	SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
+#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype                                    int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule(clientdata)
+#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
+#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
+#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
+#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
+#define SWIG_fail                        		goto fail					   
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void 
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
+  PyErr_SetObject(errtype, obj);
+  Py_DECREF(obj);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void 
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+  PyErr_SetString(errtype, msg);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+  PyObject *s = PyString_InternFromString(key);
+  PyList_Append(seq, s);
+  Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, name, obj);
+  Py_DECREF(obj);
+  if (public_interface)
+    SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, name, obj);
+  Py_DECREF(obj);                            
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyList_Check(result)) {
+      PyObject *o2 = result;
+      result = PyList_New(1);
+      PyList_SetItem(result, 0, o2);
+    }
+    PyList_Append(result,obj);
+    Py_DECREF(obj);
+  }
+  return result;
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN Py_ssize_t
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+  if (!args) {
+    if (!min && !max) {
+      return 1;
+    } else {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
+		   name, (min == max ? "" : "at least "), (int)min);
+      return 0;
+    }
+  }  
+  if (!PyTuple_Check(args)) {
+    if (min <= 1 && max >= 1) {
+      Py_ssize_t i;
+      objs[0] = args;
+      for (i = 1; i < max; ++i) {
+	objs[i] = 0;
+      }
+      return 2;
+    }
+    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+    return 0;
+  } else {
+    Py_ssize_t l = PyTuple_GET_SIZE(args);
+    if (l < min) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at least "), (int)min, (int)l);
+      return 0;
+    } else if (l > max) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at most "), (int)max, (int)l);
+      return 0;
+    } else {
+      Py_ssize_t i;
+      for (i = 0; i < l; ++i) {
+	objs[i] = PyTuple_GET_ITEM(args, i);
+      }
+      for (; l < max; ++l) {
+	objs[l] = 0;
+      }
+      return i + 1;
+    }    
+  }
+}
+
+SWIGINTERN int
+SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) {
+  int no_kwargs = 1;
+  if (kwargs) {
+    assert(PyDict_Check(kwargs));
+    if (PyDict_Size(kwargs) > 0) {
+      PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name);
+      no_kwargs = 0;
+    }
+  }
+  return no_kwargs;
+}
+
+/* A functor is a function object with one single object argument */
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
+
+/*
+  Helper for static pointer initialization for both C and C++ code, for example
+  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var)  var
+#else
+#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
+#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)
+
+#define SWIG_BUILTIN_TP_INIT	    (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT	    (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject * 
+SWIG_Py_Void(void)
+{
+  PyObject *none = Py_None;
+  Py_INCREF(none);
+  return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+  PyObject *klass;
+  PyObject *newraw;
+  PyObject *newargs;
+  PyObject *destroy;
+  int delargs;
+  int implicitconv;
+  PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int 
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+  int fail = data ? data->implicitconv : 0;
+  if (fail)
+    PyErr_SetString(PyExc_TypeError, "Implicit conversion is prohibited for explicit constructors.");
+  return fail;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+  PyObject *klass = data ? data->klass : 0;
+  return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData * 
+SwigPyClientData_New(PyObject* obj)
+{
+  if (!obj) {
+    return 0;
+  } else {
+    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+    /* the klass element */
+    data->klass = obj;
+    Py_INCREF(data->klass);
+    /* the newraw method and newargs arguments used to create a new raw instance */
+    if (PyClass_Check(obj)) {
+      data->newraw = 0;
+      data->newargs = obj;
+      Py_INCREF(obj);
+    } else {
+      data->newraw = PyObject_GetAttrString(data->klass, "__new__");
+      if (data->newraw) {
+	Py_INCREF(data->newraw);
+	data->newargs = PyTuple_New(1);
+	PyTuple_SetItem(data->newargs, 0, obj);
+      } else {
+	data->newargs = obj;
+      }
+      Py_INCREF(data->newargs);
+    }
+    /* the destroy method, aka as the C++ delete method */
+    data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__");
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      data->destroy = 0;
+    }
+    if (data->destroy) {
+      int flags;
+      Py_INCREF(data->destroy);
+      flags = PyCFunction_GET_FLAGS(data->destroy);
+      data->delargs = !(flags & (METH_O));
+    } else {
+      data->delargs = 0;
+    }
+    data->implicitconv = 0;
+    data->pytype = 0;
+    return data;
+  }
+}
+
+SWIGRUNTIME void 
+SwigPyClientData_Del(SwigPyClientData *data) {
+  Py_XDECREF(data->newraw);
+  Py_XDECREF(data->newargs);
+  Py_XDECREF(data->destroy);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+  PyObject_HEAD
+  void *ptr;
+  swig_type_info *ty;
+  int own;
+  PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+  PyObject *dict;
+#endif
+} SwigPyObject;
+
+
+#ifdef SWIGPYTHON_BUILTIN
+
+SWIGRUNTIME PyObject *
+SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+
+  if (!sobj->dict)
+    sobj->dict = PyDict_New();
+
+  Py_INCREF(sobj->dict);
+  return sobj->dict;
+}
+
+#endif
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+  return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+  PyObject *res = NULL;
+  PyObject *args = PyTuple_New(1);
+  if (args) {
+    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
+      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
+      if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+	res = PyUnicode_Format(ofmt,args);
+#else
+	res = PyString_Format(ofmt,args);
+#endif
+	Py_DECREF(ofmt);
+      }
+      Py_DECREF(args);
+    }
+  }
+  return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+  return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+  return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_repr(SwigPyObject *v)
+{
+  const char *name = SWIG_TypePrettyName(v->ty);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", (name ? name : "unknown"), (void *)v);
+  if (v->next) {
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+# if PY_VERSION_HEX >= 0x03000000
+    PyObject *joined = PyUnicode_Concat(repr, nrep);
+    Py_DecRef(repr);
+    Py_DecRef(nrep);
+    repr = joined;
+# else
+    PyString_ConcatAndDel(&repr,nrep);
+# endif
+  }
+  return repr;  
+}
+
+/* We need a version taking two PyObject* parameters so it's a valid
+ * PyCFunction to use in swigobject_methods[]. */
+SWIGRUNTIME PyObject *
+SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args))
+{
+  return SwigPyObject_repr((SwigPyObject*)v);
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+  void *i = v->ptr;
+  void *j = w->ptr;
+  return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+  PyObject* res;
+  if( op != Py_EQ && op != Py_NE ) {
+    Py_INCREF(Py_NotImplemented);
+    return Py_NotImplemented;
+  }
+  res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+  return res;  
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+    SwigPyClientData *cd;
+    assert(SwigPyObject_stype);
+    cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+    assert(cd);
+    assert(cd->pytype);
+    return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+  return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+#ifdef SWIGPYTHON_BUILTIN
+  PyTypeObject *target_tp = SwigPyObject_type();
+  if (PyType_IsSubtype(op->ob_type, target_tp))
+    return 1;
+  return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
+#else
+  return (Py_TYPE(op) == SwigPyObject_type())
+    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  PyObject *next = sobj->next;
+  if (sobj->own == SWIG_POINTER_OWN) {
+    swig_type_info *ty = sobj->ty;
+    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+    PyObject *destroy = data ? data->destroy : 0;
+    if (destroy) {
+      /* destroy is always a VARARGS method */
+      PyObject *res;
+
+      /* PyObject_CallFunction() has the potential to silently drop
+         the active exception.  In cases of unnamed temporary
+         variable or where we just finished iterating over a generator
+         StopIteration will be active right now, and this needs to
+         remain true upon return from SwigPyObject_dealloc.  So save
+         and restore. */
+      
+      PyObject *type = NULL, *value = NULL, *traceback = NULL;
+      PyErr_Fetch(&type, &value, &traceback);
+
+      if (data->delargs) {
+        /* we need to create a temporary object to carry the destroy operation */
+        PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+        res = SWIG_Python_CallFunctor(destroy, tmp);
+        Py_DECREF(tmp);
+      } else {
+        PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+        PyObject *mself = PyCFunction_GET_SELF(destroy);
+        res = ((*meth)(mself, v));
+      }
+      if (!res)
+        PyErr_WriteUnraisable(destroy);
+
+      PyErr_Restore(type, value, traceback);
+
+      Py_XDECREF(res);
+    } 
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+    else {
+      const char *name = SWIG_TypePrettyName(ty);
+      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+    }
+#endif
+  } 
+  Py_XDECREF(next);
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (!SwigPyObject_Check(next)) {
+    PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject");
+    return NULL;
+  }
+  sobj->next = next;
+  Py_INCREF(next);
+  return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (sobj->next) {    
+    Py_INCREF(sobj->next);
+    return sobj->next;
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = 0;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = SWIG_POINTER_OWN;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+  PyObject *val = 0;
+  if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) {
+    return NULL;
+  } else {
+    SwigPyObject *sobj = (SwigPyObject *)v;
+    PyObject *obj = PyBool_FromLong(sobj->own);
+    if (val) {
+      if (PyObject_IsTrue(val)) {
+        SwigPyObject_acquire(v,args);
+      } else {
+        SwigPyObject_disown(v,args);
+      }
+    } 
+    return obj;
+  }
+}
+
+static PyMethodDef
+swigobject_methods[] = {
+  {"disown",  SwigPyObject_disown,  METH_NOARGS,  "releases ownership of the pointer"},
+  {"acquire", SwigPyObject_acquire, METH_NOARGS,  "acquires ownership of the pointer"},
+  {"own",     SwigPyObject_own,     METH_VARARGS, "returns/sets ownership of the pointer"},
+  {"append",  SwigPyObject_append,  METH_O,       "appends another 'this' object"},
+  {"next",    SwigPyObject_next,    METH_NOARGS,  "returns the next 'this' object"},
+  {"__repr__",SwigPyObject_repr2,   METH_NOARGS,  "returns object representation"},
+  {0, 0, 0, 0}  
+};
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+
+  static PyNumberMethods SwigPyObject_as_number = {
+    (binaryfunc)0, /*nb_add*/
+    (binaryfunc)0, /*nb_subtract*/
+    (binaryfunc)0, /*nb_multiply*/
+    /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc)0, /*nb_divide*/
+#endif
+    (binaryfunc)0, /*nb_remainder*/
+    (binaryfunc)0, /*nb_divmod*/
+    (ternaryfunc)0,/*nb_power*/
+    (unaryfunc)0,  /*nb_negative*/
+    (unaryfunc)0,  /*nb_positive*/
+    (unaryfunc)0,  /*nb_absolute*/
+    (inquiry)0,    /*nb_nonzero*/
+    0,		   /*nb_invert*/
+    0,		   /*nb_lshift*/
+    0,		   /*nb_rshift*/
+    0,		   /*nb_and*/
+    0,		   /*nb_xor*/
+    0,		   /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+    0,   /*nb_coerce*/
+#endif
+    (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+    0, /*nb_reserved*/
+#endif
+    (unaryfunc)0,                 /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
+    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03050000 /* 3.5 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */
+#elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#else
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#endif
+  };
+
+  static PyTypeObject swigpyobject_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      "SwigPyObject",                       /* tp_name */
+      sizeof(SwigPyObject),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
+      0,                                    /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+      0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+      (cmpfunc)SwigPyObject_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyObject_repr,          /* tp_repr */
+      &SwigPyObject_as_number,              /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      0,                                    /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigobject_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      swigobject_methods,                   /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+      0,                                    /* tp_del */
+      0,                                    /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+      0,                                    /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+      0,                                    /* tp_print */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+      0,                                    /* tp_prev */
+      0                                     /* tp_next */
+#endif
+    };
+    swigpyobject_type = tmp;
+    type_init = 1;
+    if (PyType_Ready(&swigpyobject_type) < 0)
+      return NULL;
+  }
+  return &swigpyobject_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
+  if (sobj) {
+    sobj->ptr  = ptr;
+    sobj->ty   = ty;
+    sobj->own  = own;
+    sobj->next = 0;
+  }
+  return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+  PyObject_HEAD
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
+  }  
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromChar(v->ty->name);
+  }  
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+  size_t i = v->size;
+  size_t j = w->size;
+  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+  return s ? s : strncmp((const char *)v->pack, (const char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+  return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+  return ((op)->ob_type == SwigPyPacked_TypeOnce()) 
+    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+  if (SwigPyPacked_Check(v)) {
+    SwigPyPacked *sobj = (SwigPyPacked *) v;
+    free(sobj->pack);
+  }
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+  static PyTypeObject swigpypacked_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+#if PY_VERSION_HEX>=0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      "SwigPyPacked",                       /* tp_name */
+      sizeof(SwigPyPacked),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyPacked_dealloc,     /* tp_dealloc */
+      0,                                    /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+      0, /* tp_reserved in 3.0.1 */
+#else
+      (cmpfunc)SwigPyPacked_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyPacked_repr,          /* tp_repr */
+      0,                                    /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyPacked_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigpacked_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      0,                                    /* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      0,                                    /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+      0,                                    /* tp_del */
+      0,                                    /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+      0,                                    /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+      0,                                    /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+      0,                                    /* tp_print */
+#endif
+#ifdef COUNT_ALLOCS
+      0,                                    /* tp_allocs */
+      0,                                    /* tp_frees */
+      0,                                    /* tp_maxalloc */
+      0,                                    /* tp_prev */
+      0                                     /* tp_next */
+#endif
+    };
+    swigpypacked_type = tmp;
+    type_init = 1;
+    if (PyType_Ready(&swigpypacked_type) < 0)
+      return NULL;
+  }
+  return &swigpypacked_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
+  if (sobj) {
+    void *pack = malloc(size);
+    if (pack) {
+      memcpy(pack, ptr, size);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = size;
+    } else {
+      PyObject_DEL((PyObject *) sobj);
+      sobj = 0;
+    }
+  }
+  return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+  if (SwigPyPacked_Check(obj)) {
+    SwigPyPacked *sobj = (SwigPyPacked *)obj;
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+  } else {
+    return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+static PyObject *Swig_This_global = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+  if (Swig_This_global == NULL)
+    Swig_This_global = SWIG_Python_str_FromChar("this");
+  return Swig_This_global;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS 
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj) 
+{
+  PyObject *obj;
+
+  if (SwigPyObject_Check(pyobj))
+    return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+  (void)obj;
+# ifdef PyWeakref_CheckProxy
+  if (PyWeakref_CheckProxy(pyobj)) {
+    pyobj = PyWeakref_GET_OBJECT(pyobj);
+    if (pyobj && SwigPyObject_Check(pyobj))
+      return (SwigPyObject*) pyobj;
+  }
+# endif
+  return NULL;
+#else
+
+  obj = 0;
+
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+  if (PyInstance_Check(pyobj)) {
+    obj = _PyInstance_Lookup(pyobj, SWIG_This());      
+  } else {
+    PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+    if (dictptr != NULL) {
+      PyObject *dict = *dictptr;
+      obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+    } else {
+#ifdef PyWeakref_CheckProxy
+      if (PyWeakref_CheckProxy(pyobj)) {
+	PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+	return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+      }
+#endif
+      obj = PyObject_GetAttr(pyobj,SWIG_This());
+      if (obj) {
+	Py_DECREF(obj);
+      } else {
+	if (PyErr_Occurred()) PyErr_Clear();
+	return 0;
+      }
+    }
+  }
+#else
+  obj = PyObject_GetAttr(pyobj,SWIG_This());
+  if (obj) {
+    Py_DECREF(obj);
+  } else {
+    if (PyErr_Occurred()) PyErr_Clear();
+    return 0;
+  }
+#endif
+  if (obj && !SwigPyObject_Check(obj)) {
+    /* a PyObject is called 'this', try to get the 'real this'
+       SwigPyObject from it */ 
+    return SWIG_Python_GetSwigThis(obj);
+  }
+  return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+  if (own == SWIG_POINTER_OWN) {
+    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+    if (sobj) {
+      int oldown = sobj->own;
+      sobj->own = own;
+      return oldown;
+    }
+  }
+  return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+  int res;
+  SwigPyObject *sobj;
+  int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0;
+
+  if (!obj)
+    return SWIG_ERROR;
+  if (obj == Py_None && !implicit_conv) {
+    if (ptr)
+      *ptr = 0;
+    return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
+  }
+
+  res = SWIG_ERROR;
+
+  sobj = SWIG_Python_GetSwigThis(obj);
+  if (own)
+    *own = 0;
+  while (sobj) {
+    void *vptr = sobj->ptr;
+    if (ty) {
+      swig_type_info *to = sobj->ty;
+      if (to == ty) {
+        /* no type cast needed */
+        if (ptr) *ptr = vptr;
+        break;
+      } else {
+        swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+        if (!tc) {
+          sobj = (SwigPyObject *)sobj->next;
+        } else {
+          if (ptr) {
+            int newmemory = 0;
+            *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+            if (newmemory == SWIG_CAST_NEW_MEMORY) {
+              assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+              if (own)
+                *own = *own | SWIG_CAST_NEW_MEMORY;
+            }
+          }
+          break;
+        }
+      }
+    } else {
+      if (ptr) *ptr = vptr;
+      break;
+    }
+  }
+  if (sobj) {
+    if (own)
+      *own = *own | sobj->own;
+    if (flags & SWIG_POINTER_DISOWN) {
+      sobj->own = 0;
+    }
+    res = SWIG_OK;
+  } else {
+    if (implicit_conv) {
+      SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+      if (data && !data->implicitconv) {
+        PyObject *klass = data->klass;
+        if (klass) {
+          PyObject *impconv;
+          data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+          impconv = SWIG_Python_CallFunctor(klass, obj);
+          data->implicitconv = 0;
+          if (PyErr_Occurred()) {
+            PyErr_Clear();
+            impconv = 0;
+          }
+          if (impconv) {
+            SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+            if (iobj) {
+              void *vptr;
+              res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+              if (SWIG_IsOK(res)) {
+                if (ptr) {
+                  *ptr = vptr;
+                  /* transfer the ownership to 'ptr' */
+                  iobj->own = 0;
+                  res = SWIG_AddCast(res);
+                  res = SWIG_AddNewMask(res);
+                } else {
+                  res = SWIG_AddCast(res);		    
+                }
+              }
+            }
+            Py_DECREF(impconv);
+          }
+        }
+      }
+      if (!SWIG_IsOK(res) && obj == Py_None) {
+        if (ptr)
+          *ptr = 0;
+        if (PyErr_Occurred())
+          PyErr_Clear();
+        res = SWIG_OK;
+      }
+    }
+  }
+  return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+  if (!PyCFunction_Check(obj)) {
+    return SWIG_ConvertPtr(obj, ptr, ty, 0);
+  } else {
+    void *vptr = 0;
+    swig_cast_info *tc;
+
+    /* here we get the method pointer for callbacks */
+    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+    if (desc)
+      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+    if (!desc)
+      return SWIG_ERROR;
+    tc = SWIG_TypeCheck(desc,ty);
+    if (tc) {
+      int newmemory = 0;
+      *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+      assert(!newmemory); /* newmemory handling not yet implemented */
+    } else {
+      return SWIG_ERROR;
+    }
+    return SWIG_OK;
+  }
+}
+
+/* Convert a packed pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Create a new instance object, without calling __init__, and set the
+  'this' attribute.
+*/
+
+SWIGRUNTIME PyObject* 
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+  PyObject *inst = 0;
+  PyObject *newraw = data->newraw;
+  if (newraw) {
+    inst = PyObject_Call(newraw, data->newargs, NULL);
+    if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+      PyObject **dictptr = _PyObject_GetDictPtr(inst);
+      if (dictptr != NULL) {
+	PyObject *dict = *dictptr;
+	if (dict == NULL) {
+	  dict = PyDict_New();
+	  *dictptr = dict;
+	  PyDict_SetItem(dict, SWIG_This(), swig_this);
+	}
+      }
+#else
+      if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) {
+        Py_DECREF(inst);
+        inst = 0;
+      }
+#endif
+    }
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *empty_args = PyTuple_New(0);
+    if (empty_args) {
+      PyObject *empty_kwargs = PyDict_New();
+      if (empty_kwargs) {
+        inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs);
+        Py_DECREF(empty_kwargs);
+        if (inst) {
+          if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) {
+            Py_DECREF(inst);
+            inst = 0;
+          } else {
+            Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+          }
+        }
+      }
+      Py_DECREF(empty_args);
+    }
+#else
+    PyObject *dict = PyDict_New();
+    if (dict) {
+      PyDict_SetItem(dict, SWIG_This(), swig_this);
+      inst = PyInstance_NewRaw(data->newargs, dict);
+      Py_DECREF(dict);
+    }
+#endif
+  }
+  return inst;
+}
+
+SWIGRUNTIME int
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+  PyObject **dictptr = _PyObject_GetDictPtr(inst);
+  if (dictptr != NULL) {
+    PyObject *dict = *dictptr;
+    if (dict == NULL) {
+      dict = PyDict_New();
+      *dictptr = dict;
+    }
+    return PyDict_SetItem(dict, SWIG_This(), swig_this);
+  }
+#endif
+  return PyObject_SetAttr(inst, SWIG_This(), swig_this);
+} 
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+  PyObject *obj[2];
+  if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) {
+    return NULL;
+  } else {
+    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+    if (sthis) {
+      SwigPyObject_append((PyObject*) sthis, obj[1]);
+    } else {
+      if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0)
+        return NULL;
+    }
+    return SWIG_Py_Void();
+  }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+  SwigPyClientData *clientdata;
+  PyObject * robj;
+  int own;
+
+  if (!ptr)
+    return SWIG_Py_Void();
+
+  clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+  own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+  if (clientdata && clientdata->pytype) {
+    SwigPyObject *newobj;
+    if (flags & SWIG_BUILTIN_TP_INIT) {
+      newobj = (SwigPyObject*) self;
+      if (newobj->ptr) {
+        PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0);
+        while (newobj->next)
+	  newobj = (SwigPyObject *) newobj->next;
+        newobj->next = next_self;
+        newobj = (SwigPyObject *)next_self;
+#ifdef SWIGPYTHON_BUILTIN
+        newobj->dict = 0;
+#endif
+      }
+    } else {
+      newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
+    }
+    if (newobj) {
+      newobj->ptr = ptr;
+      newobj->ty = type;
+      newobj->own = own;
+      newobj->next = 0;
+      return (PyObject*) newobj;
+    }
+    return SWIG_Py_Void();
+  }
+
+  assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+  robj = SwigPyObject_New(ptr, type, own);
+  if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+    PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+    Py_DECREF(robj);
+    robj = inst;
+  }
+  return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ *  Get type list 
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) {
+  static void *type_pointer = (void *)0;
+  /* first check if module already created */
+  if (!type_pointer) {
+#ifdef SWIG_LINK_RUNTIME
+    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+#else
+    type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      type_pointer = (void *)0;
+    }
+#endif
+  }
+  return (swig_module_info *) type_pointer;
+}
+
+SWIGRUNTIME void
+SWIG_Python_DestroyModule(PyObject *obj)
+{
+  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+  swig_type_info **types = swig_module->types;
+  size_t i;
+  for (i =0; i < swig_module->size; ++i) {
+    swig_type_info *ty = types[i];
+    if (ty->owndata) {
+      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+      if (data) SwigPyClientData_Del(data);
+    }
+  }
+  Py_DECREF(SWIG_This());
+  Swig_This_global = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+  PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+  PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+  PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, "type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+}
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
+  return cache;
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+  PyObject *cache = SWIG_Python_TypeCache();
+  PyObject *key = SWIG_Python_str_FromChar(type); 
+  PyObject *obj = PyDict_GetItem(cache, key);
+  swig_type_info *descriptor;
+  if (obj) {
+    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+  } else {
+    swig_module_info *swig_module = SWIG_GetModule(0);
+    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+    if (descriptor) {
+      obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+      PyDict_SetItem(cache, key, obj);
+      Py_DECREF(obj);
+    }
+  }
+  Py_DECREF(key);
+  return descriptor;
+}
+
+/* 
+   For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION  0
+#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{  
+  if (PyErr_Occurred()) {
+    PyObject *type = 0;
+    PyObject *value = 0;
+    PyObject *traceback = 0;
+    PyErr_Fetch(&type, &value, &traceback);
+    if (value) {
+      PyObject *old_str = PyObject_Str(value);
+      const char *tmp = SWIG_Python_str_AsChar(old_str);
+      const char *errmesg = tmp ? tmp : "Invalid error message";
+      Py_XINCREF(type);
+      PyErr_Clear();
+      if (infront) {
+	PyErr_Format(type, "%s %s", mesg, errmesg);
+      } else {
+	PyErr_Format(type, "%s %s", errmesg, mesg);
+      }
+      SWIG_Python_str_DelForPy3(tmp);
+      Py_DECREF(old_str);
+    }
+    return 1;
+  } else {
+    return 0;
+  }
+}
+  
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+  if (PyErr_Occurred()) {
+    /* add information about failing argument */
+    char mesg[256];
+    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+    return SWIG_Python_AddErrMesg(mesg, 1);
+  } else {
+    return 0;
+  }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+  SwigPyObject *v = (SwigPyObject *)self;
+  swig_type_info *ty = v ? v->ty : 0;
+  return ty ? ty->str : "";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+  if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+    if (obj && SwigPyObject_Check(obj)) {
+      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+      if (otype) {
+	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+		     type, otype);
+	return;
+      }
+    } else 
+#endif      
+    {
+      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
+      if (otype) {
+	PyObject *str = PyObject_Str(obj);
+	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
+	if (cstr) {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+		       type, otype, cstr);
+          SWIG_Python_str_DelForPy3(cstr);
+	} else {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+		       type, otype);
+	}
+	Py_XDECREF(str);
+	return;
+      }
+    }   
+    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+  } else {
+    PyErr_Format(PyExc_TypeError, "unexpected type is received");
+  }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+  void *result;
+  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+    PyErr_Clear();
+#if SWIG_POINTER_EXCEPTION
+    if (flags) {
+      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
+      SWIG_Python_ArgFail(argnum);
+    }
+#endif
+  }
+  return result;
+}
+
+#ifdef SWIGPYTHON_BUILTIN
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+  PyTypeObject *tp = obj->ob_type;
+  PyObject *descr;
+  PyObject *encoded_name;
+  descrsetfunc f;
+  int res = -1;
+
+# ifdef Py_USING_UNICODE
+  if (PyString_Check(name)) {
+    name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+    if (!name)
+      return -1;
+  } else if (!PyUnicode_Check(name))
+# else
+  if (!PyString_Check(name))
+# endif
+  {
+    PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+    return -1;
+  } else {
+    Py_INCREF(name);
+  }
+
+  if (!tp->tp_dict) {
+    if (PyType_Ready(tp) < 0)
+      goto done;
+  }
+
+  descr = _PyType_Lookup(tp, name);
+  f = NULL;
+  if (descr != NULL)
+    f = descr->ob_type->tp_descr_set;
+  if (!f) {
+    if (PyString_Check(name)) {
+      encoded_name = name;
+      Py_INCREF(name);
+    } else {
+      encoded_name = PyUnicode_AsUTF8String(name);
+      if (!encoded_name)
+        return -1;
+    }
+    PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+    Py_DECREF(encoded_name);
+  } else {
+    res = f(descr, obj, value);
+  }
+  
+  done:
+  Py_DECREF(name);
+  return res;
+}
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Method creation and docstring support functions */
+
+SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name);
+SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func);
+SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+  #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) 
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_Cdi swig_types[0]
+#define SWIGTYPE_p_CdiGrid swig_types[1]
+#define SWIGTYPE_p_CdiTaxis swig_types[2]
+#define SWIGTYPE_p_CdiVariable swig_types[3]
+#define SWIGTYPE_p_CdiZaxis swig_types[4]
+#define SWIGTYPE_p_allocator_type swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_difference_type swig_types[7]
+#define SWIGTYPE_p_double swig_types[8]
+#define SWIGTYPE_p_float swig_types[9]
+#define SWIGTYPE_p_key_type swig_types[10]
+#define SWIGTYPE_p_mapped_type swig_types[11]
+#define SWIGTYPE_p_p_PyObject swig_types[12]
+#define SWIGTYPE_p_p_double swig_types[13]
+#define SWIGTYPE_p_size_type swig_types[14]
+#define SWIGTYPE_p_std__allocatorT_CdiVariable_t swig_types[15]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[16]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[17]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t swig_types[18]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t swig_types[19]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t swig_types[20]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t swig_types[21]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t swig_types[22]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[23]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[24]
+#define SWIGTYPE_p_std__invalid_argument swig_types[25]
+#define SWIGTYPE_p_std__lessT_int_t swig_types[26]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[27]
+#define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t swig_types[28]
+#define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t swig_types[29]
+#define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t swig_types[30]
+#define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t swig_types[31]
+#define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t swig_types[32]
+#define SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t swig_types[33]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[34]
+#define SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t swig_types[35]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[36]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[37]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[38]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t swig_types[39]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[40]
+#define SWIGTYPE_p_value_type swig_types[41]
+static swig_type_info *swig_types[43];
+static swig_module_info swig_module = {swig_types, 42, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#ifdef SWIG_TypeQuery
+# undef SWIG_TypeQuery
+#endif
+#define SWIG_TypeQuery SWIG_Python_TypeQuery
+
+/*-----------------------------------------------
+              @(target):= _Cdi.so
+  ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_init    PyInit__Cdi
+
+#else
+#  define SWIG_init    init_Cdi
+
+#endif
+#define SWIG_name    "_Cdi"
+
+#define SWIGVERSION 0x040002 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigPtr_PyObject {
+  protected:
+    PyObject *_obj;
+
+  public:
+    SwigPtr_PyObject() :_obj(0)
+    {
+    }
+
+    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(_obj);      
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+    {
+      if (initial_ref) {
+        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+        Py_XINCREF(_obj);
+        SWIG_PYTHON_THREAD_END_BLOCK;
+      }
+    }
+    
+    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XINCREF(item._obj);
+      Py_XDECREF(_obj);
+      _obj = item._obj;
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return *this;      
+    }
+    
+    ~SwigPtr_PyObject() 
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      Py_XDECREF(_obj);
+      SWIG_PYTHON_THREAD_END_BLOCK;
+    }
+    
+    operator PyObject *() const
+    {
+      return _obj;
+    }
+
+    PyObject *operator->() const
+    {
+      return _obj;
+    }
+  };
+}
+
+
+namespace swig {
+  struct SwigVar_PyObject : SwigPtr_PyObject {
+    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+    
+    SwigVar_PyObject & operator = (PyObject* obj)
+    {
+      Py_XDECREF(_obj);
+      _obj = obj;
+      return *this;      
+    }
+  };
+}
+
+
+#define SWIG_FILE_WITH_INIT
+#include "cdi.hpp"
+
+
+#include <typeinfo>
+#include <stdexcept>
+
+
+#if defined(__GNUC__)
+#  if __GNUC__ == 2 && __GNUC_MINOR <= 96
+#     define SWIG_STD_NOMODERN_STL
+#  endif
+#endif
+
+
+#include <string>
+
+
+#include <stddef.h>
+
+
+#include <iostream>
+
+#if PY_VERSION_HEX >= 0x03020000
+# define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj))
+#else
+# define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj))
+#endif
+
+
+namespace swig {
+  struct stop_iteration {
+  };
+
+  struct SwigPyIterator {
+  private:
+    SwigPtr_PyObject _seq;
+
+  protected:
+    SwigPyIterator(PyObject *seq) : _seq(seq)
+    {
+    }
+      
+  public:
+    virtual ~SwigPyIterator() {}
+
+    // Access iterator method, required by Python
+    virtual PyObject *value() const = 0;
+
+    // Forward iterator method, required by Python
+    virtual SwigPyIterator *incr(size_t n = 1) = 0;
+    
+    // Backward iterator method, very common in C++, but not required in Python
+    virtual SwigPyIterator *decr(size_t /*n*/ = 1)
+    {
+      throw stop_iteration();
+    }
+
+    // Random access iterator methods, but not required in Python
+    virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+
+    virtual bool equal (const SwigPyIterator &/*x*/) const
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+    
+    // C++ common/needed methods
+    virtual SwigPyIterator *copy() const = 0;
+
+    PyObject *next()     
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      PyObject *obj = value();
+      incr();       
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads
+      return obj;     
+    }
+
+    /* Make an alias for Python 3.x */
+    PyObject *__next__()
+    {
+      return next();
+    }
+
+    PyObject *previous()
+    {
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads       
+      decr();
+      PyObject *obj = value();
+      SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads       
+      return obj;
+    }
+
+    SwigPyIterator *advance(ptrdiff_t n)
+    {
+      return  (n > 0) ?  incr(n) : decr(-n);
+    }
+      
+    bool operator == (const SwigPyIterator& x)  const
+    {
+      return equal(x);
+    }
+      
+    bool operator != (const SwigPyIterator& x) const
+    {
+      return ! operator==(x);
+    }
+      
+    SwigPyIterator& operator += (ptrdiff_t n)
+    {
+      return *advance(n);
+    }
+
+    SwigPyIterator& operator -= (ptrdiff_t n)
+    {
+      return *advance(-n);
+    }
+      
+    SwigPyIterator* operator + (ptrdiff_t n) const
+    {
+      return copy()->advance(n);
+    }
+
+    SwigPyIterator* operator - (ptrdiff_t n) const
+    {
+      return copy()->advance(-n);
+    }
+      
+    ptrdiff_t operator - (const SwigPyIterator& x) const
+    {
+      return x.distance(*this);
+    }
+      
+    static swig_type_info* descriptor() {
+      static int init = 0;
+      static swig_type_info* desc = 0;
+      if (!init) {
+	desc = SWIG_TypeQuery("swig::SwigPyIterator *");
+	init = 1;
+      }	
+      return desc;
+    }    
+  };
+
+#if defined(SWIGPYTHON_BUILTIN)
+  inline PyObject* make_output_iterator_builtin (PyObject *pyself)
+  {
+    Py_INCREF(pyself);
+    return pyself;
+  }
+#endif
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+  int res = SWIG_TypeError;
+  if (PyFloat_Check(obj)) {
+    if (val) *val = PyFloat_AsDouble(obj);
+    return SWIG_OK;
+#if PY_VERSION_HEX < 0x03000000
+  } else if (PyInt_Check(obj)) {
+    if (val) *val = (double) PyInt_AsLong(obj);
+    return SWIG_OK;
+#endif
+  } else if (PyLong_Check(obj)) {
+    double v = PyLong_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    double d = PyFloat_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = d;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      long v = PyLong_AsLong(obj);
+      if (!PyErr_Occurred()) {
+	if (val) *val = v;
+	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+      } else {
+	PyErr_Clear();
+      }
+    }
+  }
+#endif
+  return res;
+}
+
+
+#include <float.h>
+
+
+#include <math.h>
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+  double x = *d;
+  if ((min <= x && x <= max)) {
+   double fx = floor(x);
+   double cx = ceil(x);
+   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+   if ((errno == EDOM) || (errno == ERANGE)) {
+     errno = 0;
+   } else {
+     double summ, reps, diff;
+     if (rd < x) {
+       diff = x - rd;
+     } else if (rd > x) {
+       diff = rd - x;
+     } else {
+       return 1;
+     }
+     summ = rd + x;
+     reps = diff/summ;
+     if (reps < 8*DBL_EPSILON) {
+       *d = rd;
+       return 1;
+     }
+   }
+  }
+  return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) 
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    long v = PyInt_AsLong(obj);
+    if (v >= 0) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      return SWIG_OverflowError;
+    }
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    unsigned long v = PyLong_AsUnsignedLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) {
+	if (val) *val = (unsigned long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+#if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE)
+#  define SWIG_LONG_LONG_AVAILABLE
+#endif
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    unsigned long long v = PyLong_AsUnsignedLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max))
+      return SWIG_OverflowError;
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
+      if (val) *val = (unsigned long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_size_t (PyObject * obj, size_t *val)
+{
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(size_t) <= sizeof(unsigned long long)) {
+    unsigned long long v;
+    res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  }
+#endif
+  return res;
+}
+
+
+  #define SWIG_From_long   PyInt_FromLong 
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE PyObject* 
+SWIG_From_long_SS_long  (long long value)
+{
+  return ((value < LONG_MIN) || (value > LONG_MAX)) ?
+    PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+#endif
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_ptrdiff_t  (ptrdiff_t value)
+{    
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    return SWIG_From_long  (static_cast< long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(ptrdiff_t) <= sizeof(long long) */
+    return SWIG_From_long_SS_long  (static_cast< long long >(value));
+  }
+#endif
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_bool  (bool value)
+{
+  return PyBool_FromLong(value ? 1 : 0);
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+#if PY_VERSION_HEX < 0x03000000
+  if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else
+#endif
+  if (PyLong_Check(obj)) {
+    long v = PyLong_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      return SWIG_OverflowError;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    long v = PyInt_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
+	if (val) *val = (long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_long_SS_long (PyObject *obj, long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    long long v = PyLong_AsLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    long v;
+    res = SWIG_AsVal_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    const double mant_min = -mant_max;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max))
+      return SWIG_OverflowError;
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
+      if (val) *val = (long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
+{
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    long v;
+    res = SWIG_AsVal_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(ptrdiff_t) <= sizeof(long long)) {
+    long long v;
+    res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  }
+#endif
+  return res;
+}
+
+
+#include <algorithm>
+
+
+#include <vector>
+
+
+#include <utility>
+
+
+#include <map>
+
+
+#include <algorithm>
+
+
+namespace swig {
+  template <class Type>
+  struct noconst_traits {
+    typedef Type noconst_type;
+  };
+
+  template <class Type>
+  struct noconst_traits<const Type> {
+    typedef Type noconst_type;
+  };
+
+  /*
+    type categories
+  */
+  struct pointer_category { };
+  struct value_category { };
+
+  /*
+    General traits that provides type_name and type_info
+  */
+  template <class Type> struct traits { };
+
+  template <class Type>
+  inline const char* type_name() {
+    return traits<typename noconst_traits<Type >::noconst_type >::type_name();
+  }
+
+  template <class Type> struct traits_info {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  /*
+    Partial specialization for pointers (traits_info)
+  */
+  template <class Type> struct traits_info<Type *> {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  template <class Type>
+  inline swig_type_info *type_info() {
+    return traits_info<Type>::type_info();
+  }
+
+  /*
+    Partial specialization for pointers (traits)
+  */
+  template <class Type> struct traits <Type *> {
+    typedef pointer_category category;
+    static std::string make_ptr_name(const char* name) {
+      std::string ptrname = name;
+      ptrname += " *";
+      return ptrname;
+    }
+    static const char* type_name() {
+      static std::string name = make_ptr_name(swig::type_name<Type>());
+      return name.c_str();
+    }
+  };
+
+  template <class Type, class Category>
+  struct traits_as { };
+
+  template <class Type, class Category>
+  struct traits_check { };
+
+}
+
+
+namespace swig {  
+  /*
+    Traits that provides the from method
+  */
+  template <class Type> struct traits_from_ptr {
+    static PyObject *from(Type *val, int owner = 0) {
+      return SWIG_InternalNewPointerObj(val, type_info<Type>(), owner);
+    }
+  };
+
+  template <class Type> struct traits_from {
+    static PyObject *from(const Type& val) {
+      return traits_from_ptr<Type>::from(new Type(val), 1);
+    }
+  };
+
+  template <class Type> struct traits_from<Type *> {
+    static PyObject *from(Type* val) {
+      return traits_from_ptr<Type>::from(val, 0);
+    }
+  };
+
+  template <class Type> struct traits_from<const Type *> {
+    static PyObject *from(const Type* val) {
+      return traits_from_ptr<Type>::from(const_cast<Type*>(val), 0);
+    }
+  };
+
+
+  template <class Type>
+  inline PyObject *from(const Type& val) {
+    return traits_from<Type>::from(val);
+  }
+
+  template <class Type>
+  inline PyObject *from_ptr(Type* val, int owner) {
+    return traits_from_ptr<Type>::from(val, owner);
+  }
+
+  /*
+    Traits that provides the asval/as/check method
+  */
+  template <class Type>
+  struct traits_asptr {   
+    static int asptr(PyObject *obj, Type **val) {
+      int res = SWIG_ERROR;
+      swig_type_info *descriptor = type_info<Type>();
+      if (val) {
+        Type *p = 0;
+        int newmem = 0;
+        res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR;
+        if (SWIG_IsOK(res)) {
+          if (newmem & SWIG_CAST_NEW_MEMORY) {
+            res |= SWIG_NEWOBJMASK;
+          }
+          *val = p;
+        }
+      } else {
+        res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR;
+      }
+      return res;
+    }
+  }; 
+
+  template <class Type>
+  inline int asptr(PyObject *obj, Type **vptr) {
+    return traits_asptr<Type>::asptr(obj, vptr);
+  }
+
+  template <class Type> 
+  struct traits_asval {
+    static int asval(PyObject *obj, Type *val) {
+      if (val) {
+	Type *p = 0;
+	int res = traits_asptr<Type>::asptr(obj, &p);
+	if (!SWIG_IsOK(res)) return res;	
+	if (p) {
+	  typedef typename noconst_traits<Type>::noconst_type noconst_type;
+	  *(const_cast<noconst_type*>(val)) = *p;
+	  if (SWIG_IsNewObj(res)){
+	    delete p;
+	    res = SWIG_DelNewMask(res);
+	  }
+	  return res;
+	} else {
+	  return SWIG_ERROR;
+	}
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+
+  template <class Type> struct traits_asval<Type*> {
+    static int asval(PyObject *obj, Type **val) {
+      if (val) {
+        typedef typename noconst_traits<Type>::noconst_type noconst_type;
+        noconst_type *p = 0;
+        int res = traits_asptr<noconst_type>::asptr(obj,  &p);
+        if (SWIG_IsOK(res)) {
+          *(const_cast<noconst_type**>(val)) = p;
+	}
+	return res;
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+  
+  template <class Type>
+  inline int asval(PyObject *obj, Type *val) {
+    return traits_asval<Type>::asval(obj, val);
+  }
+
+  template <class Type> 
+  struct traits_as<Type, value_category> {
+    static Type as(PyObject *obj) {
+      Type v;
+      int res = asval(obj, &v);
+      if (!obj || !SWIG_IsOK(res)) {
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	throw std::invalid_argument("bad type");
+      }
+      return v;
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type, pointer_category> {
+    static Type as(PyObject *obj) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res) && v) {
+	if (SWIG_IsNewObj(res)) {
+	  Type r(*v);
+	  delete v;
+	  return r;
+	} else {
+	  return *v;
+	}
+      } else {
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	throw std::invalid_argument("bad type");
+      }
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type*, pointer_category> {
+    static Type* as(PyObject *obj) {
+      Type *v = 0;      
+      int res = (obj ? traits_asptr<Type>::asptr(obj, &v) : SWIG_ERROR);
+      if (SWIG_IsOK(res)) {
+	return v;
+      } else {
+	if (!PyErr_Occurred()) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+	throw std::invalid_argument("bad type");
+      }
+    }
+  };
+    
+  template <class Type>
+  inline Type as(PyObject *obj) {
+    return traits_as<Type, typename traits<Type>::category>::as(obj);
+  }
+
+  template <class Type> 
+  struct traits_check<Type, value_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type> 
+  struct traits_check<Type, pointer_category> {
+    static bool check(PyObject *obj) {
+      int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR;
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type>
+  inline bool check(PyObject *obj) {
+    return traits_check<Type, typename traits<Type>::category>::check(obj);
+  }
+}
+
+
+#include <functional>
+
+namespace std {
+  template <>
+  struct less <PyObject *>
+  {
+    bool
+    operator()(PyObject * v, PyObject *w) const
+    { 
+      bool res;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false;
+      /* This may fall into a case of inconsistent
+               eg. ObjA > ObjX > ObjB
+               but ObjA < ObjB
+      */
+      if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) )
+      {
+        /* Objects can't be compared, this mostly occurred in Python 3.0 */
+        /* Compare their ptr directly for a workaround */
+        res = (v < w);
+        PyErr_Clear();
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return res;
+    }
+  };
+
+  template <>
+  struct less <swig::SwigPtr_PyObject>
+  {
+    bool
+    operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+  template <>
+  struct less <swig::SwigVar_PyObject>
+  {
+    bool
+    operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const
+    {
+      return std::less<PyObject *>()(v, w);
+    }
+  };
+
+}
+
+namespace swig {
+  template <> struct traits<PyObject *> {
+    typedef value_category category;
+    static const char* type_name() { return "PyObject *"; }
+  };  
+
+  template <>  struct traits_asval<PyObject * > {   
+    typedef PyObject * value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      if (val) *val = obj;
+      return SWIG_OK;
+    }
+  };
+
+  template <> 
+  struct traits_check<PyObject *, value_category> {
+    static bool check(PyObject *) {
+      return true;
+    }
+  };
+
+  template <>  struct traits_from<PyObject *> {
+    typedef PyObject * value_type;
+    static PyObject *from(const value_type& val) {
+      Py_XINCREF(val);
+      return val;
+    }
+  };
+  
+}
+
+namespace swig {
+  template <class Difference>
+  inline size_t
+  check_index(Difference i, size_t size, bool insert = false) {
+    if ( i < 0 ) {
+      if ((size_t) (-i) <= size)
+	return (size_t) (i + size);
+    } else if ( (size_t) i < size ) {
+      return (size_t) i;
+    } else if (insert && ((size_t) i == size)) {
+      return size;
+    }
+    throw std::out_of_range("index out of range");
+  }
+
+  template <class Difference>
+  void
+  slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) {
+    if (step == 0) {
+      throw std::invalid_argument("slice step cannot be zero");
+    } else if (step > 0) {
+      // Required range: 0 <= i < size, 0 <= j < size, i <= j
+      if (i < 0) {
+        ii = 0;
+      } else if (i < (Difference)size) {
+        ii = i;
+      } else if (insert && (i >= (Difference)size)) {
+        ii = (Difference)size;
+      }
+      if (j < 0) {
+        jj = 0;
+      } else {
+        jj = (j < (Difference)size) ? j : (Difference)size;
+      }
+      if (jj < ii)
+        jj = ii;
+    } else {
+      // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j
+      if (i < -1) {
+        ii = -1;
+      } else if (i < (Difference) size) {
+        ii = i;
+      } else if (i >= (Difference)(size-1)) {
+        ii = (Difference)(size-1);
+      }
+      if (j < -1) {
+        jj = -1;
+      } else {
+        jj = (j < (Difference)size ) ? j : (Difference)(size-1);
+      }
+      if (ii < jj)
+        ii = jj;
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::iterator
+  getpos(Sequence* self, Difference i)  {
+    typename Sequence::iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::const_iterator
+  cgetpos(const Sequence* self, Difference i)  {
+    typename Sequence::const_iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence>
+  inline void
+  erase(Sequence* seq, const typename Sequence::iterator& position) {
+    seq->erase(position);
+  }
+
+  template <class Sequence>
+  struct traits_reserve {
+    static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) {
+      // This should be specialized for types that support reserve
+    }
+  };
+
+  template <class Sequence, class Difference>
+  inline Sequence*
+  getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj);
+
+    if (step > 0) {
+      typename Sequence::const_iterator sb = self->begin();
+      typename Sequence::const_iterator se = self->begin();
+      std::advance(sb,ii);
+      std::advance(se,jj);
+      if (step == 1) {
+        return new Sequence(sb, se);
+      } else {
+        Sequence *sequence = new Sequence();
+        swig::traits_reserve<Sequence>::reserve(*sequence, (jj - ii + step - 1) / step);
+        typename Sequence::const_iterator it = sb;
+        while (it!=se) {
+          sequence->push_back(*it);
+          for (Py_ssize_t c=0; c<step && it!=se; ++c)
+            it++;
+        }
+        return sequence;
+      } 
+    } else {
+      Sequence *sequence = new Sequence();
+      swig::traits_reserve<Sequence>::reserve(*sequence, (ii - jj - step - 1) / -step);
+      typename Sequence::const_reverse_iterator sb = self->rbegin();
+      typename Sequence::const_reverse_iterator se = self->rbegin();
+      std::advance(sb,size-ii-1);
+      std::advance(se,size-jj-1);
+      typename Sequence::const_reverse_iterator it = sb;
+      while (it!=se) {
+        sequence->push_back(*it);
+        for (Py_ssize_t c=0; c<-step && it!=se; ++c)
+          it++;
+      }
+      return sequence;
+    }
+  }
+
+  template <class Sequence, class Difference, class InputSeq>
+  inline void
+  setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      if (step == 1) {
+        size_t ssize = jj - ii;
+        if (ssize <= is.size()) {
+          // expanding/staying the same size
+          swig::traits_reserve<Sequence>::reserve(*self, self->size() - ssize + is.size());
+          typename Sequence::iterator sb = self->begin();
+          typename InputSeq::const_iterator isit = is.begin();
+          std::advance(sb,ii);
+          std::advance(isit, jj - ii);
+          self->insert(std::copy(is.begin(), isit, sb), isit, is.end());
+        } else {
+          // shrinking
+          typename Sequence::iterator sb = self->begin();
+          typename Sequence::iterator se = self->begin();
+          std::advance(sb,ii);
+          std::advance(se,jj);
+          self->erase(sb,se);
+          sb = self->begin();
+          std::advance(sb,ii);
+          self->insert(sb, is.begin(), is.end());
+        }
+      } else {
+        size_t replacecount = (jj - ii + step - 1) / step;
+        if (is.size() != replacecount) {
+          char msg[1024];
+          sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+          throw std::invalid_argument(msg);
+        }
+        typename Sequence::const_iterator isit = is.begin();
+        typename Sequence::iterator it = self->begin();
+        std::advance(it,ii);
+        for (size_t rc=0; rc<replacecount && it != self->end(); ++rc) {
+          *it++ = *isit++;
+          for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+            it++;
+        }
+      }
+    } else {
+      size_t replacecount = (ii - jj - step - 1) / -step;
+      if (is.size() != replacecount) {
+        char msg[1024];
+        sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
+        throw std::invalid_argument(msg);
+      }
+      typename Sequence::const_iterator isit = is.begin();
+      typename Sequence::reverse_iterator it = self->rbegin();
+      std::advance(it,size-ii-1);
+      for (size_t rc=0; rc<replacecount && it != self->rend(); ++rc) {
+        *it++ = *isit++;
+        for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it++;
+      }
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline void
+  delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) {
+    typename Sequence::size_type size = self->size();
+    Difference ii = 0;
+    Difference jj = 0;
+    swig::slice_adjust(i, j, step, size, ii, jj, true);
+    if (step > 0) {
+      typename Sequence::iterator sb = self->begin();
+      std::advance(sb,ii);
+      if (step == 1) {
+        typename Sequence::iterator se = self->begin();
+        std::advance(se,jj);
+        self->erase(sb,se);
+      } else {
+        typename Sequence::iterator it = sb;
+        size_t delcount = (jj - ii + step - 1) / step;
+        while (delcount) {
+          it = self->erase(it);
+          for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
+            it++;
+          delcount--;
+        }
+      }
+    } else {
+      typename Sequence::reverse_iterator sb = self->rbegin();
+      std::advance(sb,size-ii-1);
+      typename Sequence::reverse_iterator it = sb;
+      size_t delcount = (ii - jj - step - 1) / -step;
+      while (delcount) {
+        it = typename Sequence::reverse_iterator(self->erase((++it).base()));
+        for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it++;
+        delcount--;
+      }
+    }
+  }
+}
+
+
+#if defined(__SUNPRO_CC) && defined(_RWSTD_VER)
+#  if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL)
+#    define SWIG_STD_NOITERATOR_TRAITS_STL
+#  endif
+#endif
+
+#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL)
+#include <iterator>
+#else
+namespace std {
+  template <class Iterator>
+  struct iterator_traits {
+    typedef ptrdiff_t difference_type;
+    typedef typename Iterator::value_type value_type;
+  };
+
+  template <class Iterator, class Category,class T, class Reference, class Pointer, class Distance>
+  struct iterator_traits<__reverse_bi_iterator<Iterator,Category,T,Reference,Pointer,Distance> > {
+    typedef Distance difference_type;
+    typedef T value_type;
+  };
+
+  template <class T>
+  struct iterator_traits<T*> {
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+  };
+
+  template<typename _InputIterator>
+  inline typename iterator_traits<_InputIterator>::difference_type
+  distance(_InputIterator __first, _InputIterator __last)
+  {
+    typename iterator_traits<_InputIterator>::difference_type __n = 0;
+    while (__first != __last) {
+      ++__first; ++__n;
+    }
+    return __n;
+  }
+}
+#endif
+
+
+namespace swig {
+  template<typename OutIterator>
+  class SwigPyIterator_T :  public SwigPyIterator
+  {
+  public:
+    typedef OutIterator out_iterator;
+    typedef typename std::iterator_traits<out_iterator>::value_type value_type;    
+    typedef SwigPyIterator_T<out_iterator> self_type;
+
+    SwigPyIterator_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator(seq), current(curr)
+    {
+    }
+
+    const out_iterator& get_current() const
+    {
+      return current;
+    }
+
+    
+    bool equal (const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return (current == iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+    
+    ptrdiff_t distance(const SwigPyIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return std::distance(current, iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }    
+    
+  protected:
+    out_iterator current;
+  };
+  
+  template <class ValueType>
+  struct from_oper 
+  {
+    typedef const ValueType& argument_type;
+    typedef PyObject *result_type;
+    result_type operator()(argument_type v) const
+    {
+      return swig::from(v);
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyForwardIteratorOpen_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;
+    typedef SwigPyForwardIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyForwardIteratorOpen_T(out_iterator curr, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq)
+    {
+    }
+    
+    PyObject *value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	++base::current;
+      }
+      return this;
+    }
+
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorOpen_T :  public SwigPyForwardIteratorOpen_T<OutIterator, ValueType, FromOper>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;
+    typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq)
+      : SwigPyForwardIteratorOpen_T<OutIterator>(curr, seq)
+    {
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	--base::current;
+      }
+      return this;
+    }
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyForwardIteratorClosed_T :  public SwigPyIterator_T<OutIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;    
+    typedef SwigPyForwardIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
+      : SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+    
+    PyObject *value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+    
+    SwigPyIterator *copy() const
+    {
+      return new self_type(*this);
+    }
+
+    SwigPyIterator *incr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == end) {
+	  throw stop_iteration();
+	} else {
+	  ++base::current;
+	}
+      }
+      return this;
+    }
+
+  protected:
+    out_iterator begin;
+    out_iterator end;
+  };
+
+  template<typename OutIterator, 
+	   typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class SwigPyIteratorClosed_T :  public SwigPyForwardIteratorClosed_T<OutIterator,ValueType,FromOper>
+  {
+  public:
+    FromOper from;
+    typedef OutIterator out_iterator;
+    typedef ValueType value_type;
+    typedef SwigPyIterator_T<out_iterator>  base;
+    typedef SwigPyForwardIteratorClosed_T<OutIterator, ValueType, FromOper> base0;
+    typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
+    
+    SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
+      : SwigPyForwardIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
+    {
+    }
+
+    SwigPyIterator *decr(size_t n = 1)
+    {
+      while (n--) {
+	if (base::current == base0::begin) {
+	  throw stop_iteration();
+	} else {
+	  --base::current;
+	}
+      }
+      return this;
+    }
+  };
+
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
+  {
+    return new SwigPyForwardIteratorClosed_T<OutIter>(current, begin, end, seq);
+  }
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq);
+  }
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_forward_iterator(const OutIter& current, PyObject *seq = 0)
+  {
+    return new SwigPyForwardIteratorOpen_T<OutIter>(current, seq);
+  }
+
+  template<typename OutIter>
+  inline SwigPyIterator*
+  make_output_iterator(const OutIter& current, PyObject *seq = 0)
+  {
+    return new SwigPyIteratorOpen_T<OutIter>(current, seq);
+  }
+
+}
+
+
+namespace swig
+{
+  template <class T>
+  struct SwigPySequence_Ref
+  {
+    SwigPySequence_Ref(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+    
+    operator T () const
+    {
+      swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index);
+      try {
+	return swig::as<T>(item);
+      } catch (const std::invalid_argument& e) {
+	char msg[1024];
+	sprintf(msg, "in sequence element %d ", (int)_index);
+	if (!PyErr_Occurred()) {
+	  ::SWIG_Error(SWIG_TypeError,  swig::type_name<T>());
+	}
+	SWIG_Python_AddErrorMsg(msg);
+	SWIG_Python_AddErrorMsg(e.what());
+	throw;
+      }
+    }
+
+    SwigPySequence_Ref& operator=(const T& v)
+    {
+      PySequence_SetItem(_seq, _index, swig::from<T>(v));
+      return *this;
+    }
+
+  private:
+    PyObject* _seq;
+    Py_ssize_t _index;
+  };
+
+  template <class T>
+  struct SwigPySequence_ArrowProxy
+  {
+    SwigPySequence_ArrowProxy(const T& x): m_value(x) {}
+    const T* operator->() const { return &m_value; }
+    operator const T*() const { return &m_value; }
+    T m_value;
+  };
+
+  template <class T, class Reference >
+  struct SwigPySequence_InputIterator
+  {
+    typedef SwigPySequence_InputIterator<T, Reference > self;
+
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Reference reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+
+    SwigPySequence_InputIterator()
+    {
+    }
+
+    SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index)
+      : _seq(seq), _index(index)
+    {
+    }
+
+    reference operator*() const
+    {
+      return reference(_seq, _index);
+    }
+
+    SwigPySequence_ArrowProxy<T>
+    operator->() const {
+      return SwigPySequence_ArrowProxy<T>(operator*());
+    }
+
+    bool operator==(const self& ri) const
+    {
+      return (_index == ri._index) && (_seq == ri._seq);
+    }
+
+    bool operator!=(const self& ri) const
+    {
+      return !(operator==(ri));
+    }
+
+    self& operator ++ ()
+    {
+      ++_index;
+      return *this;
+    }
+
+    self& operator -- ()
+    {
+      --_index;
+      return *this;
+    }
+
+    self& operator += (difference_type n)
+    {
+      _index += n;
+      return *this;
+    }
+
+    self operator +(difference_type n) const
+    {
+      return self(_seq, _index + n);
+    }
+
+    self& operator -= (difference_type n)
+    {
+      _index -= n;
+      return *this;
+    }
+
+    self operator -(difference_type n) const
+    {
+      return self(_seq, _index - n);
+    }
+
+    difference_type operator - (const self& ri) const
+    {
+      return _index - ri._index;
+    }
+
+    bool operator < (const self& ri) const
+    {
+      return _index < ri._index;
+    }
+
+    reference
+    operator[](difference_type n) const
+    {
+      return reference(_seq, _index + n);
+    }
+
+  private:
+    PyObject* _seq;
+    difference_type _index;
+  };
+
+  // STL container wrapper around a Python sequence
+  template <class T>
+  struct SwigPySequence_Cont
+  {
+    typedef SwigPySequence_Ref<T> reference;
+    typedef const SwigPySequence_Ref<T> const_reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef Py_ssize_t difference_type;
+    typedef size_t size_type;
+    typedef const pointer const_pointer;
+    typedef SwigPySequence_InputIterator<T, reference> iterator;
+    typedef SwigPySequence_InputIterator<T, const_reference> const_iterator;
+
+    SwigPySequence_Cont(PyObject* seq) : _seq(0)
+    {
+      if (!PySequence_Check(seq)) {
+	throw std::invalid_argument("a sequence is expected");
+      }
+      _seq = seq;
+      Py_INCREF(_seq);
+    }
+
+    ~SwigPySequence_Cont()
+    {
+      Py_XDECREF(_seq);
+    }
+
+    size_type size() const
+    {
+      return static_cast<size_type>(PySequence_Size(_seq));
+    }
+
+    bool empty() const
+    {
+      return size() == 0;
+    }
+
+    iterator begin()
+    {
+      return iterator(_seq, 0);
+    }
+
+    const_iterator begin() const
+    {
+      return const_iterator(_seq, 0);
+    }
+
+    iterator end()
+    {
+      return iterator(_seq, size());
+    }
+
+    const_iterator end() const
+    {
+      return const_iterator(_seq, size());
+    }
+
+    reference operator[](difference_type n)
+    {
+      return reference(_seq, n);
+    }
+
+    const_reference operator[](difference_type n)  const
+    {
+      return const_reference(_seq, n);
+    }
+
+    bool check() const
+    {
+      Py_ssize_t s = size();
+      for (Py_ssize_t i = 0; i < s; ++i) {
+	swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i);
+	if (!swig::check<value_type>(item))
+	  return false;
+      }
+      return true;
+    }
+
+  private:
+    PyObject* _seq;
+  };
+
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_int (PyObject * obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_int  (int value)
+{
+  return PyInt_FromLong((long) value);
+}
+
+
+namespace swig {
+  template <> struct traits< int > {
+    typedef value_category category;
+    static const char* type_name() { return"int"; }
+  };
+  template <>  struct traits_asval< int > {
+    typedef int value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_int (obj, val);
+    }
+  };
+  template <>  struct traits_from< int > {
+    typedef int value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_int  (val);
+    }
+  };
+}
+
+
+namespace swig {
+  template <class SwigPySeq, class Seq>
+  inline void
+  assign(const SwigPySeq& swigpyseq, Seq* seq) {
+    // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented
+    typedef typename SwigPySeq::value_type value_type;
+    typename SwigPySeq::const_iterator it = swigpyseq.begin();
+    for (;it != swigpyseq.end(); ++it) {
+      seq->insert(seq->end(),(value_type)(*it));
+    }
+  }
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_asptr_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+
+    static int asptr(PyObject *obj, sequence **seq) {
+      if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) {
+	sequence *p;
+	swig_type_info *descriptor = swig::type_info<sequence>();
+	if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) {
+	  if (seq) *seq = p;
+	  return SWIG_OLDOBJ;
+	}
+      } else if (PySequence_Check(obj)) {
+	try {
+	  SwigPySequence_Cont<value_type> swigpyseq(obj);
+	  if (seq) {
+	    sequence *pseq = new sequence();
+	    assign(swigpyseq, pseq);
+	    *seq = pseq;
+	    return SWIG_NEWOBJ;
+	  } else {
+	    return swigpyseq.check() ? SWIG_OK : SWIG_ERROR;
+	  }
+	} catch (std::exception& e) {
+	  if (seq) {
+	    if (!PyErr_Occurred()) {
+	      PyErr_SetString(PyExc_TypeError, e.what());
+	    }
+	  }
+	  return SWIG_ERROR;
+	}
+      }
+      return SWIG_ERROR;
+    }
+  };
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_from_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+    typedef typename Seq::size_type size_type;
+    typedef typename sequence::const_iterator const_iterator;
+
+    static PyObject *from(const sequence& seq) {
+#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS
+      swig_type_info *desc = swig::type_info<sequence>();
+      if (desc && desc->clientdata) {
+	return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
+      }
+#endif
+      size_type size = seq.size();
+      if (size <= (size_type)INT_MAX) {
+	PyObject *obj = PyTuple_New((Py_ssize_t)size);
+	Py_ssize_t i = 0;
+	for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) {
+	  PyTuple_SetItem(obj,i,swig::from<value_type>(*it));
+	}
+	return obj;
+      } else {
+	PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python");
+	return NULL;
+      }
+    }
+  };
+}
+
+
+  namespace swig {
+    template <class T>
+    struct traits_reserve<std::vector<T> > {
+      static void reserve(std::vector<T> &seq, typename std::vector<T>::size_type n) {
+        seq.reserve(n);
+      }
+    };
+
+    template <class T>
+    struct traits_asptr<std::vector<T> >  {
+      static int asptr(PyObject *obj, std::vector<T> **vec) {
+	return traits_asptr_stdseq<std::vector<T> >::asptr(obj, vec);
+      }
+    };
+    
+    template <class T>
+    struct traits_from<std::vector<T> > {
+      static PyObject *from(const std::vector<T>& vec) {
+	return traits_from_stdseq<std::vector<T> >::from(vec);
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< int, std::allocator< int > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "int" "," "std::allocator< int >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_int_Sg__iterator(std::vector< int > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____nonzero__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_int_Sg____bool__(std::vector< int > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< int >::size_type std_vector_Sl_int_Sg____len__(std::vector< int > const *self){
+      return self->size();
+    }
+
+SWIGINTERNINLINE PyObject* 
+SWIG_From_unsigned_SS_long  (unsigned long value)
+{
+  return (value > LONG_MAX) ?
+    PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE PyObject* 
+SWIG_From_unsigned_SS_long_SS_long  (unsigned long long value)
+{
+  return (value > LONG_MAX) ?
+    PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+#endif
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_size_t  (size_t value)
+{    
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(size_t) <= sizeof(unsigned long long) */
+    return SWIG_From_unsigned_SS_long_SS_long  (static_cast< unsigned long long >(value));
+  }
+#endif
+}
+
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< int,std::allocator< int > >());
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j,std::vector< int,std::allocator< int > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,PySliceObject *slice,std::vector< int,std::allocator< int > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_1(std::vector< int > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< int,std::allocator< int > >::difference_type id = i;
+      std::vector< int,std::allocator< int > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< int >::value_type const &std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+
+namespace swig {
+  static PyObject* container_owner_attribute() {
+    static PyObject* attr = SWIG_Python_str_FromChar("__swig_container");
+    return attr;
+  }
+
+  template <typename T>
+  struct container_owner {
+    // By default, do not add the back-reference (for value types)
+    // Specialization below will check the reference for pointer types.
+    static bool back_reference(PyObject* /*child*/, PyObject* /*owner*/) {
+      return false;
+    }
+  };
+
+  template <>
+  struct container_owner<swig::pointer_category> {  
+    /*
+     * Call to add a back-reference to the owning object when returning a 
+     * reference from a container.  Will only set the reference if child
+     * is a SWIG wrapper object that does not own the pointer.
+     *
+     * returns whether the reference was set or not
+     */
+    static bool back_reference(PyObject* child, PyObject* owner) {
+      SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child);
+      if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) {
+        return PyObject_SetAttr(child, container_owner_attribute(), owner) != -1;
+      }
+      return false;
+    }
+  };
+}
+
+SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_2(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< int >::value_type std_vector_Sl_int_Sg__pop(std::vector< int > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< int,std::allocator< int > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_int_Sg__append(std::vector< int > *self,std::vector< int >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); }
+
+  #define SWIG_From_double   PyFloat_FromDouble 
+
+
+namespace swig {
+  template <> struct traits< double > {
+    typedef value_category category;
+    static const char* type_name() { return"double"; }
+  };
+  template <>  struct traits_asval< double > {
+    typedef double value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_double (obj, val);
+    }
+  };
+  template <>  struct traits_from< double > {
+    typedef double value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_double  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< double, std::allocator< double > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "double" "," "std::allocator< double >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_double_Sg__iterator(std::vector< double > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____nonzero__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_double_Sg____bool__(std::vector< double > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< double >::size_type std_vector_Sl_double_Sg____len__(std::vector< double > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< double,std::allocator< double > >());
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j,std::vector< double,std::allocator< double > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,PySliceObject *slice,std::vector< double,std::allocator< double > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_1(std::vector< double > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< double,std::allocator< double > >::difference_type id = i;
+      std::vector< double,std::allocator< double > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< double >::value_type const &std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_2(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< double >::value_type std_vector_Sl_double_Sg__pop(std::vector< double > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< double,std::allocator< double > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_double_Sg__append(std::vector< double > *self,std::vector< double >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); }
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::vector< double,std::allocator< double > >, std::allocator< std::vector< double,std::allocator< double > > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(std::vector< std::vector< double > > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__(std::vector< std::vector< double > > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::vector< double > >::size_type std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__(std::vector< std::vector< double > > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >());
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,PySliceObject *slice,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::vector< double > > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type const &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+{
+#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+  if (PyBytes_Check(obj))
+#else
+  if (PyUnicode_Check(obj))
+#endif
+#else  
+  if (PyString_Check(obj))
+#endif
+  {
+    char *cstr; Py_ssize_t len;
+    int ret = SWIG_OK;
+#if PY_VERSION_HEX>=0x03000000
+#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+    if (!alloc && cptr) {
+        /* We can't allow converting without allocation, since the internal
+           representation of string in Python 3 is UCS-2/UCS-4 but we require
+           a UTF-8 representation.
+           TODO(bhy) More detailed explanation */
+        return SWIG_RuntimeError;
+    }
+    obj = PyUnicode_AsUTF8String(obj);
+    if (!obj)
+      return SWIG_TypeError;
+    if (alloc)
+      *alloc = SWIG_NEWOBJ;
+#endif
+    if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1)
+      return SWIG_TypeError;
+#else
+    if (PyString_AsStringAndSize(obj, &cstr, &len) == -1)
+      return SWIG_TypeError;
+#endif
+    if (cptr) {
+      if (alloc) {
+	if (*alloc == SWIG_NEWOBJ) {
+	  *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1)));
+	  *alloc = SWIG_NEWOBJ;
+	} else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      } else {
+#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+	*cptr = PyBytes_AsString(obj);
+#else
+	assert(0); /* Should never reach here with Unicode strings in Python 3 */
+#endif
+#else
+	*cptr = SWIG_Python_str_AsChar(obj);
+        if (!*cptr)
+          ret = SWIG_TypeError;
+#endif
+      }
+    }
+    if (psize) *psize = len + 1;
+#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+    Py_XDECREF(obj);
+#endif
+    return ret;
+  } else {
+#if defined(SWIG_PYTHON_2_UNICODE)
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once"
+#endif
+#if PY_VERSION_HEX<0x03000000
+    if (PyUnicode_Check(obj)) {
+      char *cstr; Py_ssize_t len;
+      if (!alloc && cptr) {
+        return SWIG_RuntimeError;
+      }
+      obj = PyUnicode_AsUTF8String(obj);
+      if (!obj)
+        return SWIG_TypeError;
+      if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
+        if (cptr) {
+          if (alloc) *alloc = SWIG_NEWOBJ;
+          *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1)));
+        }
+        if (psize) *psize = len + 1;
+
+        Py_XDECREF(obj);
+        return SWIG_OK;
+      } else {
+        Py_XDECREF(obj);
+      }
+    }
+#endif
+#endif
+
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *) vptr;
+	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN int
+SWIG_AsPtr_std_string (PyObject * obj, std::string **val) 
+{
+  char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ;
+  if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
+    if (buf) {
+      if (val) *val = new std::string(buf, size - 1);
+      if (alloc == SWIG_NEWOBJ) delete[] buf;
+      return SWIG_NEWOBJ;
+    } else {
+      if (val) *val = 0;
+      return SWIG_OLDOBJ;
+    }
+  } else {
+    static int init = 0;
+    static swig_type_info* descriptor = 0;
+    if (!init) {
+      descriptor = SWIG_TypeQuery("std::string" " *");
+      init = 1;
+    }
+    if (descriptor) {
+      std::string *vptr;
+      int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0);
+      if (SWIG_IsOK(res) && val) *val = vptr;
+      return res;
+    }
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_std_string (PyObject * obj, std::string *val)
+{
+  std::string* v = (std::string *) 0;
+  int res = SWIG_AsPtr_std_string (obj, &v);
+  if (!SWIG_IsOK(res)) return res;
+  if (v) {
+    if (val) *val = *v;
+    if (SWIG_IsNewObj(res)) {
+      delete v;
+      res = SWIG_DelNewMask(res);
+    }
+    return res;
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > INT_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+    } else {
+#if PY_VERSION_HEX >= 0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+      return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#else
+      return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape");
+#endif
+#else
+      return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#endif
+    }
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_std_string  (const std::string& s)
+{
+  return SWIG_FromCharPtrAndSize(s.data(), s.size());
+}
+
+
+namespace swig {
+  template <> struct traits< std::string > {
+    typedef value_category category;
+    static const char* type_name() { return"std::string"; }
+  };
+  template <>  struct traits_asval< std::string > {
+    typedef std::string value_type;
+    static int asval(PyObject *obj, value_type *val) {
+      return SWIG_AsVal_std_string (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::string > {
+    typedef std::string value_type;
+    static PyObject *from(const value_type& val) {
+      return SWIG_From_std_string  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::string, std::allocator< std::string > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::string" "," "std::allocator< std::string >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_string_Sg__iterator(std::vector< std::string > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____nonzero__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_std_string_Sg____bool__(std::vector< std::string > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< std::string >::size_type std_vector_Sl_std_string_Sg____len__(std::vector< std::string > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< std::string,std::allocator< std::string > >());
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j,std::vector< std::string,std::allocator< std::string > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,PySliceObject *slice,std::vector< std::string,std::allocator< std::string > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_1(std::vector< std::string > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< std::string,std::allocator< std::string > >::difference_type id = i;
+      std::vector< std::string,std::allocator< std::string > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< std::string >::value_type const &std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_2(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< std::string >::value_type std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< std::string,std::allocator< std::string > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_std_string_Sg__append(std::vector< std::string > *self,std::vector< std::string >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); }
+
+  namespace swig {
+    template <>  struct traits< CdiVariable > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiVariable"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< CdiVariable, std::allocator< CdiVariable > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "CdiVariable" "," "std::allocator< CdiVariable >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_vector_Sl_CdiVariable_Sg__iterator(std::vector< CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_vector_Sl_CdiVariable_Sg____nonzero__(std::vector< CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_vector_Sl_CdiVariable_Sg____bool__(std::vector< CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::vector< CdiVariable >::size_type std_vector_Sl_CdiVariable_Sg____len__(std::vector< CdiVariable > const *self){
+      return self->size();
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg____getslice__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){
+      return swig::getslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setslice____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){
+      swig::setslice(self, i, j, 1, std::vector< CdiVariable,std::allocator< CdiVariable > >());
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setslice____SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){
+      swig::setslice(self, i, j, 1, v);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delslice__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){
+      swig::delslice(self, i, j, 1);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delitem____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i){
+      swig::erase(self, swig::getpos(self, i));
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(std::vector< CdiVariable > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return NULL;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j;
+      return swig::getslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(std::vector< CdiVariable > *self,PySliceObject *slice,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j;
+      swig::setslice(self, id, jd, step, v);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(std::vector< CdiVariable > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delitem____SWIG_1(std::vector< CdiVariable > *self,PySliceObject *slice){
+      Py_ssize_t i, j, step;
+      if( !PySlice_Check(slice) ) {
+        SWIG_Error(SWIG_TypeError, "Slice object expected.");
+        return;
+      }
+      PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j;
+      swig::delslice(self, id, jd, step);
+    }
+SWIGINTERN std::vector< CdiVariable >::value_type const &std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){
+      return *(swig::cgetpos(self, i));
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_2(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::value_type const &x){
+      *(swig::getpos(self,i)) = x;
+    }
+SWIGINTERN std::vector< CdiVariable >::value_type std_vector_Sl_CdiVariable_Sg__pop(std::vector< CdiVariable > *self){
+      if (self->size() == 0)
+	throw std::out_of_range("pop from empty container");
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->back();
+      self->pop_back();
+      return x;
+    }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg__append(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &x){
+      self->push_back(x);
+    }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator first,std::vector< CdiVariable >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::size_type n,std::vector< CdiVariable >::value_type const &x){ self->insert(pos, n, x); }
+
+  namespace swig {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    template <class T, class U >
+    struct traits_asptr<std::pair<T,U> >  {
+      typedef std::pair<T,U> value_type;
+
+      static int get_pair(PyObject* first, PyObject* second,
+			  std::pair<T,U> **val) 
+      {
+	if (val) {
+	  value_type *vp = (new std::pair<T,U>());
+	  T *pfirst = &(vp->first);
+	  int res1 = swig::asval((PyObject*)first, pfirst);
+	  if (!SWIG_IsOK(res1)) {
+	    delete vp;
+	    return res1;
+	  }
+	  U *psecond = &(vp->second);
+	  int res2 = swig::asval((PyObject*)second, psecond);
+	  if (!SWIG_IsOK(res2)) {
+	    delete vp;
+	    return res2;
+	  }
+	  *val = vp;
+	  return SWIG_AddNewMask(res1 > res2 ? res1 : res2);
+	} else {
+	  T *pfirst = 0;
+	  int res1 = swig::asval((PyObject*)first, pfirst);
+	  if (!SWIG_IsOK(res1)) return res1;
+	  U *psecond = 0;
+	  int res2 = swig::asval((PyObject*)second, psecond);
+	  if (!SWIG_IsOK(res2)) return res2;
+	  return res1 > res2 ? res1 : res2;
+	}
+      }
+
+      static int asptr(PyObject *obj, std::pair<T,U> **val) {
+	int res = SWIG_ERROR;
+	if (PyTuple_Check(obj)) {
+	  if (PyTuple_GET_SIZE(obj) == 2) {
+	    res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val);
+	  }
+	} else if (PySequence_Check(obj)) {
+	  if (PySequence_Size(obj) == 2) {
+	    swig::SwigVar_PyObject first = PySequence_GetItem(obj,0);
+	    swig::SwigVar_PyObject second = PySequence_GetItem(obj,1);
+	    res = get_pair(first, second, val);
+	  }
+	} else {
+	  value_type *p = 0;
+	  swig_type_info *descriptor = swig::type_info<value_type>();
+	  res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+	  if (SWIG_IsOK(res) && val)  *val = p;
+	}
+	return res;
+      }
+    };
+
+
+    template <class T, class U >
+    struct traits_from<std::pair<T,U> >   {
+      static PyObject *from(const std::pair<T,U>& val) {
+	PyObject* obj = PyTuple_New(2);
+	PyTuple_SetItem(obj,0,swig::from(val.first));
+	PyTuple_SetItem(obj,1,swig::from(val.second));
+	return obj;
+      }
+    };
+  }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< std::string, CdiVariable > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "std::string" "," "CdiVariable" " >";
+	  }
+	};
+      }
+    
+
+  namespace swig {
+    template <class ValueType>
+    struct from_key_oper 
+    {
+      typedef const ValueType& argument_type;
+      typedef  PyObject *result_type;
+      result_type operator()(argument_type v) const
+      {
+	return swig::from(v.first);
+      }
+    };
+
+    template <class ValueType>
+    struct from_value_oper 
+    {
+      typedef const ValueType& argument_type;
+      typedef  PyObject *result_type;
+      result_type operator()(argument_type v) const
+      {
+	return swig::from(v.second);
+      }
+    };
+
+    template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type>
+    struct SwigPyMapIterator_T : SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper>
+    {
+      SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+	: SwigPyIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+
+
+    template<class OutIterator,
+	     class FromOper = from_key_oper<typename OutIterator::value_type> >
+    struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T<OutIterator, FromOper>
+    {
+      SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+	: SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+
+    template<typename OutIter>
+    inline SwigPyIterator*
+    make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
+    {
+      return new SwigPyMapKeyIterator_T<OutIter>(current, begin, end, seq);
+    }
+
+    template<class OutIterator,
+	     class FromOper = from_value_oper<typename OutIterator::value_type> >
+    struct SwigPyMapValueIterator_T : SwigPyMapIterator_T<OutIterator, FromOper>
+    {
+      SwigPyMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
+	: SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+    
+
+    template<typename OutIter>
+    inline SwigPyIterator*
+    make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
+    {
+      return new SwigPyMapValueIterator_T<OutIter>(current, begin, end, seq);
+    }
+  }
+
+
+  namespace swig {
+    template <class SwigPySeq, class K, class T, class Compare, class Alloc >
+    inline void
+    assign(const SwigPySeq& swigpyseq, std::map<K,T,Compare,Alloc > *map) {
+      typedef typename std::map<K,T,Compare,Alloc >::value_type value_type;
+      typename SwigPySeq::const_iterator it = swigpyseq.begin();
+      for (;it != swigpyseq.end(); ++it) {
+	map->insert(value_type(it->first, it->second));
+      }
+    }
+
+    template <class K, class T, class Compare, class Alloc>
+    struct traits_asptr<std::map<K,T,Compare,Alloc > >  {
+      typedef std::map<K,T,Compare,Alloc > map_type;
+      static int asptr(PyObject *obj, map_type **val) {
+	int res = SWIG_ERROR;
+	SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+	if (PyDict_Check(obj)) {
+	  SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL);
+#if PY_VERSION_HEX >= 0x03000000
+          /* In Python 3.x the ".items()" method returns a dict_items object */
+          items = PySequence_Fast(items, ".items() didn't return a sequence!");
+#endif
+	  res = traits_asptr_stdseq<map_type, std::pair<K, T> >::asptr(items, val);
+	} else {
+	  map_type *p = 0;
+	  swig_type_info *descriptor = swig::type_info<map_type>();
+	  res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+	  if (SWIG_IsOK(res) && val)  *val = p;
+	}
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return res;
+      }      
+    };
+      
+    template <class K, class T, class Compare, class Alloc >
+    struct traits_from<std::map<K,T,Compare,Alloc > >  {
+      typedef std::map<K,T,Compare,Alloc > map_type;
+      typedef typename map_type::const_iterator const_iterator;
+      typedef typename map_type::size_type size_type;
+
+      static PyObject *asdict(const map_type& map) {
+	SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+	size_type size = map.size();
+	Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+	if (pysize < 0) {
+	  PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	  SWIG_PYTHON_THREAD_END_BLOCK;
+	  return NULL;
+	}
+	PyObject *obj = PyDict_New();
+	for (const_iterator i= map.begin(); i!= map.end(); ++i) {
+	  swig::SwigVar_PyObject key = swig::from(i->first);
+	  swig::SwigVar_PyObject val = swig::from(i->second);
+	  PyDict_SetItem(obj, key, val);
+	}
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return obj;
+      }
+                
+      static PyObject *from(const map_type& map) {
+	swig_type_info *desc = swig::type_info<map_type>();
+	if (desc && desc->clientdata) {
+	  return SWIG_InternalNewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
+	} else {
+	  return asdict(map);
+	}
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::map< std::string, CdiVariable, std::less< std::string >, std::allocator< std::pair< std::string const,CdiVariable > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "std::string" "," "CdiVariable" "," "std::less< std::string >" "," "std::allocator< std::pair< std::string const,CdiVariable > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____nonzero__(std::map< std::string,CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____bool__(std::map< std::string,CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::map< std::string,CdiVariable >::size_type std_map_Sl_std_string_Sc_CdiVariable_Sg____len__(std::map< std::string,CdiVariable > const *self){
+      return self->size();
+    }
+SWIGINTERN std::map< std::string,CdiVariable >::mapped_type const &std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key);
+      if (i != self->end())
+	return i->second;
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____delitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->find(key);
+      if (i != self->end())
+	self->erase(i);
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* keyList = PyList_New(pysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(keyList, j, swig::from(i->first));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return keyList;
+    }
+SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__values(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* valList = PyList_New(pysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(valList, j, swig::from(i->second));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return valList;
+    }
+SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__items(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }    
+      PyObject* itemList = PyList_New(pysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(itemList, j, swig::from(*i));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return itemList;
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_0(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      self->erase(key);
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key,std::map< std::string,CdiVariable >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__asdict(std::map< std::string,CdiVariable > *self){
+      return swig::traits_from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >::asdict(*self);
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator first,std::map< std::string,CdiVariable >::iterator last){ self->erase(first, last); }
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiVariable > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiVariable" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiVariable, std::less< int >, std::allocator< std::pair< int const,CdiVariable > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiVariable" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiVariable > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____nonzero__(std::map< int,CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____bool__(std::map< int,CdiVariable > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::map< int,CdiVariable >::size_type std_map_Sl_int_Sc_CdiVariable_Sg____len__(std::map< int,CdiVariable > const *self){
+      return self->size();
+    }
+SWIGINTERN std::map< int,CdiVariable >::mapped_type const &std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key);
+      if (i != self->end())
+	return i->second;
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____delitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->find(key);
+      if (i != self->end())
+	self->erase(i);
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg__has_key(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__keys(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* keyList = PyList_New(pysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(keyList, j, swig::from(i->first));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return keyList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__values(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* valList = PyList_New(pysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(valList, j, swig::from(i->second));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return valList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__items(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }    
+      PyObject* itemList = PyList_New(pysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(itemList, j, swig::from(*i));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return itemList;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____contains__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_0(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      self->erase(key);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key,std::map< int,CdiVariable >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__asdict(std::map< int,CdiVariable > *self){
+      return swig::traits_from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >::asdict(*self);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator first,std::map< int,CdiVariable >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiTaxis > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiTaxis"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiTaxis > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiTaxis" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiTaxis, std::less< int >, std::allocator< std::pair< int const,CdiTaxis > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiTaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiTaxis > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____nonzero__(std::map< int,CdiTaxis > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____bool__(std::map< int,CdiTaxis > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::map< int,CdiTaxis >::size_type std_map_Sl_int_Sc_CdiTaxis_Sg____len__(std::map< int,CdiTaxis > const *self){
+      return self->size();
+    }
+SWIGINTERN std::map< int,CdiTaxis >::mapped_type const &std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key);
+      if (i != self->end())
+	return i->second;
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____delitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->find(key);
+      if (i != self->end())
+	self->erase(i);
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg__has_key(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__keys(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* keyList = PyList_New(pysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(keyList, j, swig::from(i->first));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return keyList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__values(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* valList = PyList_New(pysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(valList, j, swig::from(i->second));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return valList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__items(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }    
+      PyObject* itemList = PyList_New(pysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(itemList, j, swig::from(*i));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return itemList;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_0(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      self->erase(key);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key,std::map< int,CdiTaxis >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__asdict(std::map< int,CdiTaxis > *self){
+      return swig::traits_from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >::asdict(*self);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator first,std::map< int,CdiTaxis >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiZaxis > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiZaxis"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiZaxis > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiZaxis" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiZaxis, std::less< int >, std::allocator< std::pair< int const,CdiZaxis > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiZaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiZaxis > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____nonzero__(std::map< int,CdiZaxis > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____bool__(std::map< int,CdiZaxis > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::map< int,CdiZaxis >::size_type std_map_Sl_int_Sc_CdiZaxis_Sg____len__(std::map< int,CdiZaxis > const *self){
+      return self->size();
+    }
+SWIGINTERN std::map< int,CdiZaxis >::mapped_type const &std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key);
+      if (i != self->end())
+	return i->second;
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____delitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->find(key);
+      if (i != self->end())
+	self->erase(i);
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg__has_key(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__keys(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* keyList = PyList_New(pysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(keyList, j, swig::from(i->first));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return keyList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__values(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* valList = PyList_New(pysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(valList, j, swig::from(i->second));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return valList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__items(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }    
+      PyObject* itemList = PyList_New(pysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(itemList, j, swig::from(*i));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return itemList;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_0(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      self->erase(key);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key,std::map< int,CdiZaxis >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__asdict(std::map< int,CdiZaxis > *self){
+      return swig::traits_from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >::asdict(*self);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator first,std::map< int,CdiZaxis >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiGrid > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiGrid"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiGrid > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiGrid" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiGrid, std::less< int >, std::allocator< std::pair< int const,CdiGrid > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiGrid" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiGrid > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____nonzero__(std::map< int,CdiGrid > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____bool__(std::map< int,CdiGrid > const *self){
+      return !(self->empty());
+    }
+SWIGINTERN std::map< int,CdiGrid >::size_type std_map_Sl_int_Sc_CdiGrid_Sg____len__(std::map< int,CdiGrid > const *self){
+      return self->size();
+    }
+SWIGINTERN std::map< int,CdiGrid >::mapped_type const &std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key);
+      if (i != self->end())
+	return i->second;
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____delitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->find(key);
+      if (i != self->end())
+	self->erase(i);
+      else
+	throw std::out_of_range("key not found");
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg__has_key(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__keys(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* keyList = PyList_New(pysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(keyList, j, swig::from(i->first));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return keyList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__values(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }
+      PyObject* valList = PyList_New(pysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(valList, j, swig::from(i->second));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return valList;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__items(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
+      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+      if (pysize < 0) {
+	PyErr_SetString(PyExc_OverflowError, "map size not valid in python");
+	SWIG_PYTHON_THREAD_END_BLOCK;
+	return NULL;
+      }    
+      PyObject* itemList = PyList_New(pysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
+	PyList_SET_ITEM(itemList, j, swig::from(*i));
+      }
+      SWIG_PYTHON_THREAD_END_BLOCK;
+      return itemList;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____contains__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_0(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      self->erase(key);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key,std::map< int,CdiGrid >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__asdict(std::map< int,CdiGrid > *self){
+      return swig::traits_from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >::asdict(*self);
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator first,std::map< int,CdiGrid >::iterator last){ self->erase(first, last); }
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r;
+  if (!PyBool_Check(obj))
+    return SWIG_ERROR;
+  r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharArray(PyObject * obj, char *val, size_t size)
+{ 
+  char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ;
+  int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc);
+  if (SWIG_IsOK(res)) {
+    /* special case of single char conversion when we don't need space for NUL */
+    if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize;
+    if (csize <= size) {
+      if (val) {
+	if (csize) memcpy(val, cptr, csize*sizeof(char));
+	if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char));
+      }
+      if (alloc == SWIG_NEWOBJ) {
+	delete[] cptr;
+	res = SWIG_DelNewMask(res);
+      }      
+      return res;
+    }
+    if (alloc == SWIG_NEWOBJ) delete[] cptr;
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN size_t
+SWIG_strnlen(const char* s, size_t maxlen)
+{
+  const char *p;
+  for (p = s; maxlen-- && *p; p++)
+    ;
+  return p - s;
+}
+
+
+
+
+
+SWIGINTERNINLINE PyObject * 
+SWIG_FromCharPtr(const char *cptr)
+{ 
+  return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_value" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_incr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->incr();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_incr", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_incr__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_incr__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SwigPyIterator_incr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::incr(size_t)\n"
+    "    swig::SwigPyIterator::incr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_decr" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->decr();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_decr", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_SwigPyIterator_decr__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator_decr__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SwigPyIterator_decr'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    swig::SwigPyIterator::decr(size_t)\n"
+    "    swig::SwigPyIterator::decr()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  ptrdiff_t result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_distance", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_distance" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_equal", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_equal" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  try {
+    result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail;
+  }
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_copy" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_next" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->next();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___next__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->__next__();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_previous" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  try {
+    result = (PyObject *)(arg1)->previous();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_advance", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_advance" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_advance" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)(arg1)->advance(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___eq__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___eq__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  PyErr_Clear();
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___ne__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___ne__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  PyErr_Clear();
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___iadd__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___iadd__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___iadd__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___isub__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___isub__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___isub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___add__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___add__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___add__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  PyErr_Clear();
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "ptrdiff_t""'");
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void());
+      SWIG_fail;
+    }
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  PyErr_Clear();
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ;
+  swig::SwigPyIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  ptrdiff_t result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); 
+  }
+  arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); 
+  }
+  arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2);
+  result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2);
+  resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return resultobj;
+fail:
+  PyErr_Clear();
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator___sub__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_SwigPyIterator___sub____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  Py_INCREF(Py_NotImplemented);
+  return Py_NotImplemented;
+}
+
+
+SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_swig__SwigPyIterator, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_IntVector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_iterator" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_int_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___nonzero__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____nonzero__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___bool__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)std_vector_Sl_int_Sg____bool__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___len__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = std_vector_Sl_int_Sg____len__((std::vector< int > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector___getslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___getslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___getslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  std::vector< int,std::allocator< int > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IntVector___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< int,std::allocator< int > > const &)*arg4);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___setslice__", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector___setslice____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_IntVector___setslice____SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type,std::vector< int,std::allocator< int > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector___delslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___delslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___delslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    std_vector_Sl_int_Sg____delslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___delitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< int,std::allocator< int > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< int,std::allocator< int > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_int_Sg____delitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___delitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_IntVector___delitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntVector___delitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__delitem__(std::vector< int >::difference_type)\n"
+    "    std::vector< int >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getitem__" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___getitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  try {
+    result = (std::vector< int >::value_type *) &std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< int >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___getitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_IntVector___getitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntVector___getitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__getitem__(PySliceObject *)\n"
+    "    std::vector< int >::__getitem__(std::vector< int >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_int_Sg____setitem____SWIG_2(arg1,arg2,(int const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_IntVector___setitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< int,std::allocator< int > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_IntVector___setitem____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector___setitem____SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::__setitem__(PySliceObject *,std::vector< int,std::allocator< int > > const &)\n"
+    "    std::vector< int >::__setitem__(PySliceObject *)\n"
+    "    std::vector< int >::__setitem__(std::vector< int >::difference_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::value_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_pop" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  try {
+    result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__pop(arg1);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector_append", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_append" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_append" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_int_Sg__append(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::vector< int > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::vector< int > *)new std::vector< int >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< int > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_empty" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)((std::vector< int > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_size" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_swap" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntVector_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< int > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_begin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_end" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_rbegin" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_rend" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_clear" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< int > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_get_allocator" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< int >::allocator_type(static_cast< const std::vector< int >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  result = (std::vector< int > *)new std::vector< int >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_pop_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::iterator result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< int >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_IntVector_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_IntVector_erase__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator)\n"
+    "    std::vector< int >::erase(std::vector< int >::iterator,std::vector< int >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int >::size_type arg1 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntVector" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_IntVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_IntVector", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_IntVector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_IntVector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_IntVector__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IntVector__SWIG_3(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IntVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::vector()\n"
+    "    std::vector< int >::vector(std::vector< int > const &)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type)\n"
+    "    std::vector< int >::vector(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector_push_back", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_push_back" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_push_back" "', argument " "2"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< int >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_front" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< int >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_back" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back();
+  resultobj = SWIG_From_int(static_cast< int >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< int >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector_assign", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_assign" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_assign" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_assign" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_resize" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_resize", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntVector_resize__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector_resize__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type)\n"
+    "    std::vector< int >::resize(std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_insert" "', argument " "3"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_int_Sg__insert__SWIG_0(arg1,arg2,(int const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::size_type arg3 ;
+  std::vector< int >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::value_type temp4 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_insert" "', argument " "3"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< int >::size_type >(val3);
+  ecode4 = SWIG_AsVal_int(swig_obj[3], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IntVector_insert" "', argument " "4"" of type '" "std::vector< int >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< int >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_int_Sg__insert__SWIG_1(arg1,arg2,arg3,(int const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_insert", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector_insert__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_IntVector_insert__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::value_type const &)\n"
+    "    std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::size_type,std::vector< int >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "IntVector_reserve", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_reserve" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_reserve" "', argument " "2"" of type '" "std::vector< int >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_IntVector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_capacity" "', argument " "1"" of type '" "std::vector< int > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_IntVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntVector" "', argument " "1"" of type '" "std::vector< int > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *IntVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *IntVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_DoubleVector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_iterator" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_double_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___nonzero__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____nonzero__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___bool__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)std_vector_Sl_double_Sg____bool__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___len__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = std_vector_Sl_double_Sg____len__((std::vector< double > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector___getslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___getslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___getslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  std::vector< double,std::allocator< double > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___setslice__", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector___setslice____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleVector___setslice____SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type,std::vector< double,std::allocator< double > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector___delslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___delslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___delslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    std_vector_Sl_double_Sg____delslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___delitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< double,std::allocator< double > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_double_Sg____delitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___delitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___delitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___delitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__delitem__(std::vector< double >::difference_type)\n"
+    "    std::vector< double >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___getitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  try {
+    result = (std::vector< double >::value_type *) &std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< double >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___getitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___getitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___getitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__getitem__(PySliceObject *)\n"
+    "    std::vector< double >::__getitem__(std::vector< double >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    std_vector_Sl_double_Sg____setitem____SWIG_2(arg1,arg2,(double const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___setitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleVector___setitem____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector___setitem____SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::__setitem__(PySliceObject *,std::vector< double,std::allocator< double > > const &)\n"
+    "    std::vector< double >::__setitem__(PySliceObject *)\n"
+    "    std::vector< double >::__setitem__(std::vector< double >::difference_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::value_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_pop" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  try {
+    result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__pop(arg1);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector_append", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_append" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_append" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  std_vector_Sl_double_Sg__append(arg1,(double const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::vector< double > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::vector< double > *)new std::vector< double >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< double > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_empty" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)((std::vector< double > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_size" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_swap" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleVector_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_begin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_end" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_rbegin" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_rend" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_clear" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< double > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_get_allocator" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< double >::allocator_type(static_cast< const std::vector< double >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  result = (std::vector< double > *)new std::vector< double >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_pop_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::iterator result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< double >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_DoubleVector_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_DoubleVector_erase__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator)\n"
+    "    std::vector< double >::erase(std::vector< double >::iterator,std::vector< double >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double >::size_type arg1 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DoubleVector" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_DoubleVector", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_DoubleVector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_DoubleVector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_DoubleVector__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DoubleVector__SWIG_3(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DoubleVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::vector()\n"
+    "    std::vector< double >::vector(std::vector< double > const &)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type)\n"
+    "    std::vector< double >::vector(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector_push_back", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_push_back" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_push_back" "', argument " "2"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  (arg1)->push_back((std::vector< double >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_front" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< double >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_back" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back();
+  resultobj = SWIG_From_double(static_cast< double >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< double >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector_assign", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_assign" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_assign" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_assign" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_resize" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_resize", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleVector_resize__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector_resize__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type)\n"
+    "    std::vector< double >::resize(std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_insert" "', argument " "3"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_double_Sg__insert__SWIG_0(arg1,arg2,(double const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::size_type arg3 ;
+  std::vector< double >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::value_type temp4 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_insert" "', argument " "3"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< double >::size_type >(val3);
+  ecode4 = SWIG_AsVal_double(swig_obj[3], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "DoubleVector_insert" "', argument " "4"" of type '" "std::vector< double >::value_type""'");
+  } 
+  temp4 = static_cast< std::vector< double >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_double_Sg__insert__SWIG_1(arg1,arg2,arg3,(double const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_insert", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector_insert__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_DoubleVector_insert__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::value_type const &)\n"
+    "    std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::size_type,std::vector< double >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleVector_reserve", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_reserve" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_reserve" "', argument " "2"" of type '" "std::vector< double >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleVector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_capacity" "', argument " "1"" of type '" "std::vector< double > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DoubleVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DoubleVector" "', argument " "1"" of type '" "std::vector< double > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DoubleVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *DoubleVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_iterator" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___nonzero__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___bool__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___len__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__((std::vector< std::vector< double > > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___getslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___getslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___getslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleDoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___setslice__", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleDoubleVector___setslice____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleDoubleVector___setslice____SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___delslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___delslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___delslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___delitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___delitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___delitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___delitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__delitem__(std::vector< std::vector< double > >::difference_type)\n"
+    "    std::vector< std::vector< double > >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___getitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  try {
+    result = (std::vector< std::vector< double > >::value_type *) &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::vector< double > >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___getitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___getitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___getitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__getitem__(std::vector< std::vector< double > >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___setitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector___setitem____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector___setitem____SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n"
+    "    std::vector< std::vector< double > >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::vector< double > >::__setitem__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::value_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_pop" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  try {
+    result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_append", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_append" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_empty" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_size" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_swap" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_begin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_end" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_rbegin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_rend" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_clear" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_get_allocator" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(static_cast< const std::vector< std::vector< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_pop_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_DoubleDoubleVector_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_DoubleDoubleVector_erase__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator)\n"
+    "    std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > >::size_type arg1 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DoubleDoubleVector" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleDoubleVector" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_DoubleDoubleVector", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_DoubleDoubleVector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_DoubleDoubleVector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_DoubleDoubleVector__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_DoubleDoubleVector__SWIG_3(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DoubleDoubleVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::vector()\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double,std::allocator< double > > > const &)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_push_back", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_push_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::vector< double > >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_front" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::vector< double > >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back();
+  resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::vector< double > >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_assign", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_assign" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_assign" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_resize", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector_resize__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector_resize__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type)\n"
+    "    std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::size_type arg3 ;
+  std::vector< std::vector< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleDoubleVector_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_insert", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector_insert__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleDoubleVector_insert__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::value_type const &)\n"
+    "    std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_reserve", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_reserve" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_reserve" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_DoubleDoubleVector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double > >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_capacity" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_DoubleDoubleVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *DoubleDoubleVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *DoubleDoubleVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_StringVector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_iterator" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_std_string_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___nonzero__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____nonzero__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___bool__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)std_vector_Sl_std_string_Sg____bool__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___len__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = std_vector_Sl_std_string_Sg____len__((std::vector< std::string > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector___getslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___getslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___getslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "StringVector___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< std::string,std::allocator< std::string > > const &)*arg4);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___setslice__", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_StringVector___setslice____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_StringVector___setslice____SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type,std::vector< std::string,std::allocator< std::string > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector___delslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___delslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___delslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    std_vector_Sl_std_string_Sg____delslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___delitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::string,std::allocator< std::string > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_std_string_Sg____delitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___delitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_StringVector___delitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_StringVector___delitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__delitem__(std::vector< std::string >::difference_type)\n"
+    "    std::vector< std::string >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getitem__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___getitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  try {
+    result = (std::vector< std::string >::value_type *) &std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::string >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___getitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_StringVector___getitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_StringVector___getitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__getitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__getitem__(std::vector< std::string >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_std_string_Sg____setitem____SWIG_2(arg1,arg2,(std::string const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_StringVector___setitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< std::string,std::allocator< std::string > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector___setitem____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector___setitem____SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *,std::vector< std::string,std::allocator< std::string > > const &)\n"
+    "    std::vector< std::string >::__setitem__(PySliceObject *)\n"
+    "    std::vector< std::string >::__setitem__(std::vector< std::string >::difference_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::value_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_pop" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  try {
+    result = std_vector_Sl_std_string_Sg__pop(arg1);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector_append", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_append" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__append(arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::vector< std::string > *)new std::vector< std::string >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_empty" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)((std::vector< std::string > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_size" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_swap" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_begin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_end" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_rbegin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_rend" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_clear" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::string > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_get_allocator" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(static_cast< const std::vector< std::string >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_pop_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::string >::iterator result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< std::string >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_StringVector_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_StringVector_erase__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator)\n"
+    "    std::vector< std::string >::erase(std::vector< std::string >::iterator,std::vector< std::string >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string >::size_type arg1 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_StringVector" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_StringVector" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_StringVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_StringVector", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_StringVector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_StringVector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_StringVector__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_StringVector__SWIG_3(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_StringVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::vector()\n"
+    "    std::vector< std::string >::vector(std::vector< std::string > const &)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::vector(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector_push_back", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_push_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  (arg1)->push_back((std::vector< std::string >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_front" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::string >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_back" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  (void)swig::container_owner<swig::traits<std::vector< std::string >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector_assign", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_assign" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_assign" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_resize", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_StringVector_resize__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector_resize__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type)\n"
+    "    std::vector< std::string >::resize(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  std::vector< std::string >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,arg2,(std::string const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::size_type arg3 ;
+  std::vector< std::string >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< std::string >::size_type >(val3);
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "StringVector_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,arg2,arg3,(std::string const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_insert", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector_insert__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_StringVector_insert__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::value_type const &)\n"
+    "    std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "StringVector_reserve", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_reserve" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_reserve" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_StringVector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_capacity" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_StringVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_StringVector" "', argument " "1"" of type '" "std::vector< std::string > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *StringVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *StringVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_VarsVector_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_iterator" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_vector_Sl_CdiVariable_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___nonzero__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (bool)std_vector_Sl_CdiVariable_Sg____nonzero__((std::vector< CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___bool__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (bool)std_vector_Sl_CdiVariable_Sg____bool__((std::vector< CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___len__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = std_vector_Sl_CdiVariable_Sg____len__((std::vector< CdiVariable > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___getslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector___getslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___getslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___getslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  try {
+    result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg____getslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setslice____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___setslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  try {
+    std_vector_Sl_CdiVariable_Sg____setslice____SWIG_0(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setslice____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___setslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  {
+    std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0;
+    res4 = swig::asptr(swig_obj[3], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "VarsVector___setslice__" "', argument " "4"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setslice__" "', argument " "4"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    std_vector_Sl_CdiVariable_Sg____setslice____SWIG_1(arg1,arg2,arg3,(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg4);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setslice__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___setslice__", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_VarsVector___setslice____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_VarsVector___setslice____SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___setslice__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::__setslice__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::difference_type)\n"
+    "    std::vector< CdiVariable >::__setslice__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::difference_type,std::vector< CdiVariable,std::allocator< CdiVariable > > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___delslice__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector___delslice__", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___delslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___delslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  try {
+    std_vector_Sl_CdiVariable_Sg____delslice__(arg1,arg2,arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___delitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___delitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  try {
+    std_vector_Sl_CdiVariable_Sg____delitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___getitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___getitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  {
+    std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0;
+    res3 = swig::asptr(swig_obj[2], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___delitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  PySliceObject *arg2 = (PySliceObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  {
+    if (!PySlice_Check(swig_obj[1])) {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___delitem__" "', argument " "2"" of type '" "PySliceObject *""'");
+    }
+    arg2 = (PySliceObject *) swig_obj[1];
+  }
+  try {
+    std_vector_Sl_CdiVariable_Sg____delitem____SWIG_1(arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___delitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___delitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_VarsVector___delitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsVector___delitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___delitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::__delitem__(std::vector< CdiVariable >::difference_type)\n"
+    "    std::vector< CdiVariable >::__delitem__(PySliceObject *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___getitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< CdiVariable >::value_type *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___getitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  try {
+    result = (std::vector< CdiVariable >::value_type *) &std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1((std::vector< CdiVariable > const *)arg1,arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  (void)swig::container_owner<swig::traits<std::vector< CdiVariable >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___getitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___getitem__", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_VarsVector___getitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsVector___getitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___getitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::__getitem__(PySliceObject *)\n"
+    "    std::vector< CdiVariable >::__getitem__(std::vector< CdiVariable >::difference_type) const\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  try {
+    std_vector_Sl_CdiVariable_Sg____setitem____SWIG_2(arg1,arg2,(CdiVariable const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        return _wrap_VarsVector___setitem____SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        _v = PySlice_Check(argv[1]);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector___setitem____SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector___setitem____SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::__setitem__(PySliceObject *,std::vector< CdiVariable,std::allocator< CdiVariable > > const &)\n"
+    "    std::vector< CdiVariable >::__setitem__(PySliceObject *)\n"
+    "    std::vector< CdiVariable >::__setitem__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_pop(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::value_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_pop" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  try {
+    result = std_vector_Sl_CdiVariable_Sg__pop(arg1);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj((new std::vector< CdiVariable >::value_type(static_cast< const std::vector< CdiVariable >::value_type& >(result))), SWIGTYPE_p_CdiVariable, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_append(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector_append", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_append" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_append" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_append" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  std_vector_Sl_CdiVariable_Sg__append(arg1,(CdiVariable const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >((std::vector< CdiVariable > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_empty" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (bool)((std::vector< CdiVariable > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_size" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_swap" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_swap" "', argument " "2"" of type '" "std::vector< CdiVariable > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_swap" "', argument " "2"" of type '" "std::vector< CdiVariable > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_begin" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_end" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_rbegin" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_rend" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_clear" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< CdiVariable > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_get_allocator" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::vector< CdiVariable >::allocator_type(static_cast< const std::vector< CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_CdiVariable_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1);
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_pop_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_pop_back" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  (arg1)->pop_back();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_resize__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_resize" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_resize" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  (arg1)->resize(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< CdiVariable >::iterator result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_erase" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< CdiVariable >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_erase" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "3"" of type '" "std::vector< CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "3"" of type '" "std::vector< CdiVariable >::iterator""'");
+    }
+  }
+  result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_VarsVector_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_VarsVector_erase__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::erase(std::vector< CdiVariable >::iterator)\n"
+    "    std::vector< CdiVariable >::erase(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_3(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable >::size_type arg1 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_VarsVector" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsVector" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1,(std::vector< CdiVariable >::value_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsVector(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsVector", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_VarsVector__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_VarsVector__SWIG_2(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsVector__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_VarsVector__SWIG_3(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsVector'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::vector()\n"
+    "    std::vector< CdiVariable >::vector(std::vector< CdiVariable > const &)\n"
+    "    std::vector< CdiVariable >::vector(std::vector< CdiVariable >::size_type)\n"
+    "    std::vector< CdiVariable >::vector(std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_push_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector_push_back", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_push_back" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_push_back" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_push_back" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  (arg1)->push_back((std::vector< CdiVariable >::value_type const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_front(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_front" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->front();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  (void)swig::container_owner<swig::traits<std::vector< CdiVariable >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_back(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::value_type *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_back" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->back();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  (void)swig::container_owner<swig::traits<std::vector< CdiVariable >::value_type>::category>::back_reference(resultobj, swig_obj[0]);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_assign(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector_assign", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_assign" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_assign" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_assign" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_assign" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  (arg1)->assign(arg2,(std::vector< CdiVariable >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_resize__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_resize" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_resize" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_resize" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_resize" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  (arg1)->resize(arg2,(std::vector< CdiVariable >::value_type const &)*arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_resize(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_resize", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsVector_resize__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector_resize__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_resize'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::resize(std::vector< CdiVariable >::size_type)\n"
+    "    std::vector< CdiVariable >::resize(std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_insert__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  std::vector< CdiVariable >::iterator result;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_insert" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  result = std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(arg1,arg2,(CdiVariable const &)*arg3);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_insert__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::size_type arg3 ;
+  std::vector< CdiVariable >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 = 0 ;
+  int res4 = 0 ;
+  
+  if ((nobjs < 4) || (nobjs > 4)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_insert" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'");
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "VarsVector_insert" "', argument " "4"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_insert" "', argument " "4"" of type '" "std::vector< CdiVariable >::value_type const &""'"); 
+  }
+  arg4 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp4);
+  std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(arg1,arg2,arg3,(CdiVariable const &)*arg4);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_insert(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[5] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_insert", 0, 4, argv))) SWIG_fail;
+  --argc;
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector_insert__SWIG_0(self, argc, argv);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_VarsVector_insert__SWIG_1(self, argc, argv);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_insert'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::vector< CdiVariable >::insert(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::value_type const &)\n"
+    "    std::vector< CdiVariable >::insert(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_reserve(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsVector_reserve", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_reserve" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_reserve" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'");
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsVector_capacity(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_capacity" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->capacity();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_VarsVector(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *VarsVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *VarsVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::less< std::string > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_std__string_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::less< std::string > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::less< std::string > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::less< std::string > * >(argp1);
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::less< std::string > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___nonzero__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____nonzero__((std::map< std::string,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___bool__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____bool__((std::map< std::string,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___len__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = std_map_Sl_std_string_Sc_CdiVariable_Sg____len__((std::map< std::string,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::map< std::string,CdiVariable >::mapped_type *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap___getitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___getitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___getitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___getitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  try {
+    result = (std::map< std::string,CdiVariable >::mapped_type *) &std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(arg1,(std::string const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___delitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap___delitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___delitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___delitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___delitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  try {
+    std_map_Sl_std_string_Sc_CdiVariable_Sg____delitem__(arg1,(std::string const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_has_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_has_key", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_has_key" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_has_key" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_has_key" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_keys(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_keys" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_values" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__values(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_items(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_items" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__items(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___contains__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap___contains__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___contains__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___contains__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___contains__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(arg1,(std::string const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_key_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_key_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_value_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_value_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___setitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_0(arg1,(std::string const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  std::map< std::string,CdiVariable >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___setitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsMap___setitem__" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::mapped_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::mapped_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::map< std::string,CdiVariable >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_1(arg1,(std::string const &)*arg2,(CdiVariable const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsMap___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_VarsMap___setitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsMap___setitem____SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsMap___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< std::string,CdiVariable >::__setitem__(std::map< std::string,CdiVariable >::key_type const &)\n"
+    "    std::map< std::string,CdiVariable >::__setitem__(std::map< std::string,CdiVariable >::key_type const &,std::map< std::string,CdiVariable >::mapped_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_asdict(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_asdict" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__asdict(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *ptr = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::map< std::string,CdiVariable > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsMap", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_VarsMap__SWIG_1(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_std__string_t, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsMap__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsMap__SWIG_2(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< std::string,CdiVariable >::map(std::less< std::string > const &)\n"
+    "    std::map< std::string,CdiVariable >::map()\n"
+    "    std::map< std::string,CdiVariable >::map(std::map< std::string,CdiVariable > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_empty" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (bool)((std::map< std::string,CdiVariable > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_size" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_swap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_swap" "', argument " "2"" of type '" "std::map< std::string,CdiVariable > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_swap" "', argument " "2"" of type '" "std::map< std::string,CdiVariable > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_begin" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_end" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_rbegin" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_rend" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_clear" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::pair< std::string const,CdiVariable > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_get_allocator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::allocator_type(static_cast< const std::map< std::string,CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::size_type result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->erase((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::map< std::string,CdiVariable >::size_type result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_count", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_count" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_count" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_count" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->count((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+    }
+  }
+  std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::iterator arg2 ;
+  std::map< std::string,CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::iterator""'");
+    }
+  }
+  std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsMap_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_VarsMap_erase__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_VarsMap_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< std::string,CdiVariable >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_VarsMap_erase__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsMap_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::key_type const &)\n"
+    "    std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::iterator)\n"
+    "    std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::iterator,std::map< std::string,CdiVariable >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_find(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::map< std::string,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_find", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_find" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_find" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_find" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->find((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_lower_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::map< std::string,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_lower_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_lower_bound" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_lower_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_lower_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->lower_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsMap_upper_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  std::map< std::string,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsMap_upper_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_upper_bound" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_upper_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_upper_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->upper_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_VarsMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *VarsMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *VarsMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::less< int > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::less< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____nonzero__((std::map< int,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___bool__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____bool__((std::map< int,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___len__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = std_map_Sl_int_Sc_CdiVariable_Sg____len__((std::map< int,CdiVariable > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiVariable >::mapped_type *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode___getitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___getitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___getitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    result = (std::map< int,CdiVariable >::mapped_type *) &std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___delitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode___delitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___delitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___delitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    std_map_Sl_int_Sc_CdiVariable_Sg____delitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_has_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_has_key", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_has_key" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_has_key" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg__has_key((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_keys(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_keys" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__keys(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_values" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__values(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_items(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_items" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__items(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___contains__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode___contains__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___contains__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___contains__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____contains__(arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_key_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_value_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___setitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___setitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_0(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  std::map< int,CdiVariable >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___setitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___setitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsByCode___setitem__" "', argument " "3"" of type '" "std::map< int,CdiVariable >::mapped_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsByCode___setitem__" "', argument " "3"" of type '" "std::map< int,CdiVariable >::mapped_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiVariable >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiVariable const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsByCode___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsByCode___setitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsByCode___setitem____SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsByCode___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiVariable >::__setitem__(std::map< int,CdiVariable >::key_type const &)\n"
+    "    std::map< int,CdiVariable >::__setitem__(std::map< int,CdiVariable >::key_type const &,std::map< int,CdiVariable >::mapped_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_asdict(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_asdict" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__asdict(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *ptr = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::map< int,CdiVariable > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_VarsByCode(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsByCode", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_VarsByCode__SWIG_1(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsByCode__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsByCode__SWIG_2(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsByCode'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiVariable >::map(std::less< int > const &)\n"
+    "    std::map< int,CdiVariable >::map()\n"
+    "    std::map< int,CdiVariable >::map(std::map< int,CdiVariable > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_empty" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (bool)((std::map< int,CdiVariable > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_size" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = ((std::map< int,CdiVariable > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_swap" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsByCode_swap" "', argument " "2"" of type '" "std::map< int,CdiVariable > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsByCode_swap" "', argument " "2"" of type '" "std::map< int,CdiVariable > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_begin" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_end" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_rbegin" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_rend" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_clear" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiVariable > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = ((std::map< int,CdiVariable > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::map< int,CdiVariable >::allocator_type(static_cast< const std::map< int,CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::size_type result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiVariable >::size_type result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_count", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_count" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_count" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiVariable > const *)arg1)->count((std::map< int,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::iterator arg2 ;
+  std::map< int,CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "3"" of type '" "std::map< int,CdiVariable >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "3"" of type '" "std::map< int,CdiVariable >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "VarsByCode_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_VarsByCode_erase__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsByCode_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiVariable >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_VarsByCode_erase__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsByCode_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::key_type const &)\n"
+    "    std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::iterator)\n"
+    "    std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::iterator,std::map< int,CdiVariable >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_find(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_find", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_find" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_find" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_lower_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_lower_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_VarsByCode_upper_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiVariable >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "VarsByCode_upper_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiVariable >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_VarsByCode(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *VarsByCode_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *VarsByCode_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::less< int > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::less< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____nonzero__((std::map< int,CdiTaxis > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____bool__((std::map< int,CdiTaxis > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___len__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = std_map_Sl_int_Sc_CdiTaxis_Sg____len__((std::map< int,CdiTaxis > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiTaxis >::mapped_type *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap___getitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    result = (std::map< int,CdiTaxis >::mapped_type *) &std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___delitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap___delitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    std_map_Sl_int_Sc_CdiTaxis_Sg____delitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_has_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_has_key", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg__has_key((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_keys(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_keys" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__keys(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_values" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__values(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_items(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_items" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__items(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___contains__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap___contains__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_key_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_value_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_0(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  std::map< int,CdiTaxis >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiTaxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "TaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::mapped_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::mapped_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiTaxis >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiTaxis const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "TaxesMap___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_TaxesMap___setitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_TaxesMap___setitem____SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'TaxesMap___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiTaxis >::__setitem__(std::map< int,CdiTaxis >::key_type const &)\n"
+    "    std::map< int,CdiTaxis >::__setitem__(std::map< int,CdiTaxis >::key_type const &,std::map< int,CdiTaxis >::mapped_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_asdict(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__asdict(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *ptr = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::map< int,CdiTaxis > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_TaxesMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_TaxesMap", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_TaxesMap__SWIG_1(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_TaxesMap__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_TaxesMap__SWIG_2(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_TaxesMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiTaxis >::map(std::less< int > const &)\n"
+    "    std::map< int,CdiTaxis >::map()\n"
+    "    std::map< int,CdiTaxis >::map(std::map< int,CdiTaxis > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_empty" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (bool)((std::map< int,CdiTaxis > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_size" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = ((std::map< int,CdiTaxis > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_swap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiTaxis > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiTaxis > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_begin" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_end" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_rend" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_clear" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiTaxis > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = ((std::map< int,CdiTaxis > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::allocator_type(static_cast< const std::map< int,CdiTaxis >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::size_type result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiTaxis >::size_type result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_count", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_count" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_count" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiTaxis > const *)arg1)->count((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::iterator arg2 ;
+  std::map< int,CdiTaxis >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "TaxesMap_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_TaxesMap_erase__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_TaxesMap_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiTaxis >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_TaxesMap_erase__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'TaxesMap_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::key_type const &)\n"
+    "    std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::iterator)\n"
+    "    std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::iterator,std::map< int,CdiTaxis >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_find(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiTaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_find", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_find" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_find" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_lower_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiTaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_lower_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_TaxesMap_upper_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiTaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "TaxesMap_upper_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_TaxesMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *TaxesMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *TaxesMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::less< int > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::less< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____nonzero__((std::map< int,CdiZaxis > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____bool__((std::map< int,CdiZaxis > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___len__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = std_map_Sl_int_Sc_CdiZaxis_Sg____len__((std::map< int,CdiZaxis > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiZaxis >::mapped_type *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___getitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    result = (std::map< int,CdiZaxis >::mapped_type *) &std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___delitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___delitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    std_map_Sl_int_Sc_CdiZaxis_Sg____delitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_has_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_has_key", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg__has_key((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_keys(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_keys" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__keys(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_values" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__values(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_items(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_items" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__items(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___contains__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___contains__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_key_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_value_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_0(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  std::map< int,CdiZaxis >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiZaxis,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ZaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::mapped_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ZaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::mapped_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiZaxis >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiZaxis const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "ZaxesMap___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ZaxesMap___setitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_ZaxesMap___setitem____SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'ZaxesMap___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiZaxis >::__setitem__(std::map< int,CdiZaxis >::key_type const &)\n"
+    "    std::map< int,CdiZaxis >::__setitem__(std::map< int,CdiZaxis >::key_type const &,std::map< int,CdiZaxis >::mapped_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_asdict(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__asdict(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *ptr = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::map< int,CdiZaxis > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_ZaxesMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_ZaxesMap", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_ZaxesMap__SWIG_1(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ZaxesMap__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ZaxesMap__SWIG_2(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_ZaxesMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiZaxis >::map(std::less< int > const &)\n"
+    "    std::map< int,CdiZaxis >::map()\n"
+    "    std::map< int,CdiZaxis >::map(std::map< int,CdiZaxis > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_empty" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (bool)((std::map< int,CdiZaxis > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_size" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = ((std::map< int,CdiZaxis > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_swap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ZaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiZaxis > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ZaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiZaxis > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_begin" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_end" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_rend" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_clear" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiZaxis > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = ((std::map< int,CdiZaxis > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::allocator_type(static_cast< const std::map< int,CdiZaxis >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::size_type result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiZaxis >::size_type result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_count", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_count" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_count" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiZaxis > const *)arg1)->count((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::iterator arg2 ;
+  std::map< int,CdiZaxis >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "ZaxesMap_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_ZaxesMap_erase__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ZaxesMap_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiZaxis >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_ZaxesMap_erase__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'ZaxesMap_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::key_type const &)\n"
+    "    std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::iterator)\n"
+    "    std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::iterator,std::map< int,CdiZaxis >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_find(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiZaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_find", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_find" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_find" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_lower_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiZaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_lower_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_ZaxesMap_upper_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiZaxis >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_upper_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_ZaxesMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *ZaxesMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *ZaxesMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::less< int > *arg1 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0  | 0);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::less< int > const &""'"); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::less< int > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___nonzero__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____nonzero__((std::map< int,CdiGrid > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___bool__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____bool__((std::map< int,CdiGrid > const *)arg1);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___len__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___len__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = std_map_Sl_int_Sc_CdiGrid_Sg____len__((std::map< int,CdiGrid > const *)arg1);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___getitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiGrid >::mapped_type *result = 0 ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap___getitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    result = (std::map< int,CdiGrid >::mapped_type *) &std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___delitem__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap___delitem__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  try {
+    std_map_Sl_int_Sc_CdiGrid_Sg____delitem__(arg1,(int const &)*arg2);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_has_key(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_has_key", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg__has_key((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_keys(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_keys" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__keys(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_values(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_values" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__values(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_items(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_items" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__items(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___contains__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  bool result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap___contains__", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____contains__(arg1,(int const &)*arg2);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_key_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_value_iterator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  PyObject **arg2 = (PyObject **) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  swig::SwigPyIterator *result = 0 ;
+  
+  arg2 = &swig_obj[0];
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___setitem____SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_0(arg1,(int const &)*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___setitem____SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  std::map< int,CdiGrid >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiGrid,  0  | 0);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "GridsMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiGrid >::mapped_type const &""'"); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GridsMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiGrid >::mapped_type const &""'"); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiGrid >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiGrid const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap___setitem__(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "GridsMap___setitem__", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_GridsMap___setitem____SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiGrid, SWIG_POINTER_NO_NULL | 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_GridsMap___setitem____SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'GridsMap___setitem__'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiGrid >::__setitem__(std::map< int,CdiGrid >::key_type const &)\n"
+    "    std::map< int,CdiGrid >::__setitem__(std::map< int,CdiGrid >::key_type const &,std::map< int,CdiGrid >::mapped_type const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_asdict(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  PyObject *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__asdict(arg1);
+  resultobj = result;
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  {
+    std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *ptr = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)0;
+    res1 = swig::asptr(swig_obj[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > const &""'"); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::map< int,CdiGrid > const &)*arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW |  0 );
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_GridsMap(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_GridsMap", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_GridsMap__SWIG_1(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GridsMap__SWIG_0(self, argc, argv);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GridsMap__SWIG_2(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_GridsMap'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiGrid >::map(std::less< int > const &)\n"
+    "    std::map< int,CdiGrid >::map()\n"
+    "    std::map< int,CdiGrid >::map(std::map< int,CdiGrid > const &)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_empty" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (bool)((std::map< int,CdiGrid > const *)arg1)->empty();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_size(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::size_type result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_size" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = ((std::map< int,CdiGrid > const *)arg1)->size();
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_swap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_swap", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_swap" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "GridsMap_swap" "', argument " "2"" of type '" "std::map< int,CdiGrid > &""'"); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GridsMap_swap" "', argument " "2"" of type '" "std::map< int,CdiGrid > &""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiGrid > * >(argp2);
+  (arg1)->swap(*arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_begin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_begin" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->begin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_end(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_end" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->end();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_rbegin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->rbegin();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_rend(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid >::reverse_iterator result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_rend" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->rend();
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_clear(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_clear" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  (arg1)->clear();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_get_allocator(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiGrid > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = ((std::map< int,CdiGrid > const *)arg1)->get_allocator();
+  resultobj = SWIG_NewPointerObj((new std::map< int,CdiGrid >::allocator_type(static_cast< const std::map< int,CdiGrid >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::size_type result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiGrid >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_count(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiGrid >::size_type result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_count", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_count" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_count" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiGrid > const *)arg1)->count((std::map< int,CdiGrid >::key_type const &)*arg2);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(arg1,arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_2(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::iterator arg2 ;
+  std::map< int,CdiGrid >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::SwigPyIterator *iter2 = 0 ;
+  int res2 ;
+  swig::SwigPyIterator *iter3 = 0 ;
+  int res3 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'");
+    }
+  }
+  res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "3"" of type '" "std::map< int,CdiGrid >::iterator""'");
+  } else {
+    swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *iter_t = dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "3"" of type '" "std::map< int,CdiGrid >::iterator""'");
+    }
+  }
+  std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_erase(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "GridsMap_erase", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_GridsMap_erase__SWIG_1(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_GridsMap_erase__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::SwigPyIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::SwigPyIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::SwigPyIterator_T<std::map< int,CdiGrid >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_GridsMap_erase__SWIG_2(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'GridsMap_erase'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::key_type const &)\n"
+    "    std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::iterator)\n"
+    "    std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::iterator,std::map< int,CdiGrid >::iterator)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_find(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiGrid >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_find", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_find" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_find" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiGrid >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_lower_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiGrid >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_lower_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiGrid >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_GridsMap_upper_bound(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  std::map< int,CdiGrid >::iterator result;
+  
+  if (!SWIG_Python_UnpackTuple(args, "GridsMap_upper_bound", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'");
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiGrid >::key_type const &)*arg2);
+  resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)),
+    swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_GridsMap(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *GridsMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *GridsMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_CdiGrid__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  CdiGrid *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (CdiGrid *)new CdiGrid();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiGrid__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiGrid *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiGrid" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiGrid *)new CdiGrid(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiGrid(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiGrid", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_CdiGrid__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiGrid__SWIG_1(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiGrid'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiGrid::CdiGrid()\n"
+    "    CdiGrid::CdiGrid(int)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_CdiGrid(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiGrid" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_gridID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_gridID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_gridID_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_gridID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->gridID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_gridID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_gridID_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->gridID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_type_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_type_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_type_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_type_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->type);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_size_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_size_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_size_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_size_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->size);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xsize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xsize_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xsize_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_xsize_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->xsize = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xsize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xsize_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->xsize);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ysize_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ysize_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ysize_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_ysize_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ysize = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ysize_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ysize_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->ysize);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_prec_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_prec_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_prec_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_prec_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->prec = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_prec_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_prec_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->prec);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ncorner_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ncorner_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ncorner_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_ncorner_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ncorner = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ncorner_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ncorner_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->ncorner);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasXValues_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasXValues_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasXValues_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasXValues_set" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasXValues = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasXValues_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasXValues_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasXValues);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasYValues_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasYValues_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasYValues_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasYValues_set" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasYValues = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasYValues_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasYValues_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasYValues);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasBounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasBounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasBounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasBounds_set" "', argument " "2"" of type '" "bool""'");
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasBounds = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_hasBounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  bool result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasBounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasBounds);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xvalues_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xvalues_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xvalues_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xvalues_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->xvalues = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xvalues_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xvalues_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xvalues);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yvalues_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yvalues_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yvalues_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yvalues_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->yvalues = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yvalues_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yvalues_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->yvalues);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xbounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xbounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xbounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xbounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->xbounds = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xbounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xbounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xbounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ybounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ybounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ybounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ybounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->ybounds = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ybounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ybounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ybounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xlongname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xlongname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xlongname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xlongname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xlongname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xlongname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xlongname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xlongname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xlongname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xstdname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xstdname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xstdname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xstdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xstdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xstdname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xstdname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xstdname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xstdname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xunits_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xunits_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xunits_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xunits_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xunits_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xunits = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_xunits_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xunits_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xunits);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_yname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->yname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->yname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ylongname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ylongname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ylongname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ylongname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_ylongname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->ylongname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ylongname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ylongname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->ylongname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ystdname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ystdname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ystdname_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ystdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_ystdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->ystdname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_ystdname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ystdname_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->ystdname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yunits_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yunits_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yunits_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yunits_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_yunits_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->yunits = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_yunits_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yunits_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->yunits);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_name_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_name_set" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_name_get" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getValues" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  (arg1)->getValues();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getBounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getBounds" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  (arg1)->getBounds();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getValuesAsPointer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  double *arg2 = (double *) 0 ;
+  double *arg3 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getValuesAsPointer", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "3"" of type '" "double *""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  (arg1)->getValuesAsPointer(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getBoundsAsPointer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  double *arg2 = (double *) 0 ;
+  double *arg3 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getBoundsAsPointer", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "3"" of type '" "double *""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  (arg1)->getBoundsAsPointer(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getFloatVals(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  float *arg2 = (float *) 0 ;
+  float *arg3 = (float *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getFloatVals", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getFloatVals" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getFloatVals" "', argument " "2"" of type '" "float *""'"); 
+  }
+  arg2 = reinterpret_cast< float * >(argp2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getFloatVals" "', argument " "3"" of type '" "float *""'"); 
+  }
+  arg3 = reinterpret_cast< float * >(argp3);
+  (arg1)->getFloatVals(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiGrid_getFloatBounds(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  float *arg2 = (float *) 0 ;
+  float *arg3 = (float *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getFloatBounds", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getFloatBounds" "', argument " "1"" of type '" "CdiGrid *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getFloatBounds" "', argument " "2"" of type '" "float *""'"); 
+  }
+  arg2 = reinterpret_cast< float * >(argp2);
+  res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getFloatBounds" "', argument " "3"" of type '" "float *""'"); 
+  }
+  arg3 = reinterpret_cast< float * >(argp3);
+  (arg1)->getFloatBounds(arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *CdiGrid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_CdiGrid, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *CdiGrid_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_CdiTaxis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  CdiTaxis *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (CdiTaxis *)new CdiTaxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiTaxis__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiTaxis *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiTaxis" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiTaxis *)new CdiTaxis(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiTaxis(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiTaxis", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_CdiTaxis__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiTaxis__SWIG_1(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiTaxis'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiTaxis::CdiTaxis()\n"
+    "    CdiTaxis::CdiTaxis(int)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_CdiTaxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiTaxis" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_taxisID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_taxisID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_taxisID_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_taxisID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_taxisID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_taxisID_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_ntsteps_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_ntsteps_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_ntsteps_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_ntsteps_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ntsteps = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_ntsteps_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_ntsteps_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->ntsteps);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_unit_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_unit_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unit_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_unit_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->unit = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_unit_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unit_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->unit);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_rdate_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_rdate_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rdate_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_rdate_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->rdate = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_rdate_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rdate_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->rdate);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_rtime_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_rtime_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rtime_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_rtime_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->rtime = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_rtime_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rtime_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->rtime);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_vdate_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_vdate_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vdate_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_vdate_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vdate = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_vdate_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vdate_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->vdate);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_vtime_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_vtime_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vtime_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_vtime_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vtime = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_vtime_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vtime_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->vtime);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_type_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_type_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_type_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_type_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->type);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_calendar_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_calendar_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_calendar_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_calendar_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->calendar = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_calendar_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_calendar_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->calendar);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_hasBounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_hasBounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_hasBounds_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_hasBounds_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->hasBounds = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_hasBounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_hasBounds_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->hasBounds);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  char *arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char temp2[CDI_MAX_NAME] ;
+  int res2 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_name_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_name_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  res2 = SWIG_AsCharArray(swig_obj[1], temp2, CDI_MAX_NAME);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiTaxis_name_set" "', argument " "2"" of type '" "char [CDI_MAX_NAME]""'");
+  }
+  arg2 = reinterpret_cast< char * >(temp2);
+  if (arg2) memcpy(arg1->name,arg2,CDI_MAX_NAME*sizeof(char));
+  else memset(arg1->name,0,CDI_MAX_NAME*sizeof(char));
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  char *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_name_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (char *)(char *) ((arg1)->name);
+  {
+    size_t size = SWIG_strnlen(result, CDI_MAX_NAME);
+    
+    
+    
+    resultobj = SWIG_FromCharPtrAndSize(result, size);
+  }
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_unitname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_unitname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unitname_set" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(swig_obj[1], &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiTaxis_unitname_set" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  if (arg2) {
+    size_t size = strlen(reinterpret_cast< const char * >(reinterpret_cast< const char * >(arg2))) + 1;
+    arg1->unitname = (char const *)reinterpret_cast< char* >(memcpy(new char[size], arg2, sizeof(char)*(size)));
+  } else {
+    arg1->unitname = 0;
+  }
+  resultobj = SWIG_Py_Void();
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiTaxis_unitname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  char *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unitname_get" "', argument " "1"" of type '" "CdiTaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (char *) ((arg1)->unitname);
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *CdiTaxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_CdiTaxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *CdiTaxis_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_CdiZaxis__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  CdiZaxis *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (CdiZaxis *)new CdiZaxis();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiZaxis__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiZaxis *result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiZaxis" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiZaxis *)new CdiZaxis(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiZaxis(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[2] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiZaxis", 0, 1, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_CdiZaxis__SWIG_0(self, argc, argv);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiZaxis__SWIG_1(self, argc, argv);
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiZaxis'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiZaxis::CdiZaxis()\n"
+    "    CdiZaxis::CdiZaxis(int)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_CdiZaxis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiZaxis" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_zaxisID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_zaxisID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_zaxisID_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_zaxisID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->zaxisID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_zaxisID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_zaxisID_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->zaxisID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_type_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_type_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_type_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_type_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_type_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_type_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->type);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_ltype_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_ltype_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ltype_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_ltype_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ltype = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_ltype_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ltype_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->ltype);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_size_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_size_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_size_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_size_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->size);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_prec_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_prec_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_prec_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_prec_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->prec = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_prec_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_prec_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->prec);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_plevels_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_plevels_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plevels_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_plevels_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->plevels = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_plevels_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plevels_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->plevels);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_plbounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_plbounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plbounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_plbounds_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->plbounds = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_plbounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plbounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->plbounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_pubounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_pubounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pubounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_pubounds_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->pubounds = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_pubounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pubounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->pubounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_pweights_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_pweights_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pweights_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_pweights_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->pweights = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_pweights_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pweights_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->pweights);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_levels_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_levels_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_levels_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_levels_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->levels = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_levels_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_levels_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->levels);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_lbounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_lbounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_lbounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_lbounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->lbounds = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_lbounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_lbounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->lbounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_ubounds_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_ubounds_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ubounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_ubounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->ubounds = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_ubounds_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ubounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ubounds);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_weights_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_weights_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_weights_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_weights_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->weights = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_weights_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_weights_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->weights);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_name_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_name_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_name_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_longname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_longname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_longname_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_longname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_longname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->longname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_longname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_longname_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->longname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_units_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_units_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_units_set" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_units_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_units_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->units = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiZaxis_units_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_units_get" "', argument " "1"" of type '" "CdiZaxis *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->units);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *CdiZaxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_CdiZaxis, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *CdiZaxis_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_CdiVariable__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {
+  PyObject *resultobj = 0;
+  CdiVariable *result = 0 ;
+  
+  if ((nobjs < 0) || (nobjs > 0)) SWIG_fail;
+  result = (CdiVariable *)new CdiVariable();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiVariable__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  int arg1 ;
+  int arg2 ;
+  int arg3 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  CdiVariable *result = 0 ;
+  
+  if ((nobjs < 3) || (nobjs > 3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_int(swig_obj[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiVariable" "', argument " "1"" of type '" "int""'");
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_CdiVariable" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  ecode3 = SWIG_AsVal_int(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_CdiVariable" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (CdiVariable *)new CdiVariable(arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_CdiVariable(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[4] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiVariable", 0, 3, argv))) SWIG_fail;
+  --argc;
+  if (argc == 0) {
+    return _wrap_new_CdiVariable__SWIG_0(self, argc, argv);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_CdiVariable__SWIG_1(self, argc, argv);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiVariable'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiVariable::CdiVariable()\n"
+    "    CdiVariable::CdiVariable(int,int,int)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_CdiVariable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiVariable" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_varID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_varID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_varID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_varID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->varID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_varID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_varID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->varID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_zaxisID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_zaxisID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxisID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_zaxisID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->zaxisID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_zaxisID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxisID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->zaxisID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_gridID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_gridID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_gridID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_gridID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->gridID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_gridID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_gridID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->gridID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_taxisID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_taxisID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxisID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_taxisID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_taxisID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxisID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_timeID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_timeID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_timeID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_timeID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->timeID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_timeID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_timeID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->timeID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_vlistID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_vlistID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_vlistID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_vlistID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vlistID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_vlistID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_vlistID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->vlistID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_size_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_size_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_size_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_size_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_size_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_size_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->size);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_code_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_code_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_code_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_code_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->code = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_code_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_code_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->code);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_datatype_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_datatype_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_datatype_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_datatype_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->datatype = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_datatype_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_datatype_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->datatype);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_streamID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_streamID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_streamID_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_streamID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->streamID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_streamID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_streamID_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->streamID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_name_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_name_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_name_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_name_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_name_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_name_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_longname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_longname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_longname_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_longname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_longname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->longname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_longname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_longname_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->longname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_units_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_units_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_units_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_units_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_units_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->units = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_units_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_units_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->units);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_stdname_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_stdname_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_stdname_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_stdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_stdname_set" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->stdname = *arg2;
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_stdname_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_stdname_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->stdname);
+  resultobj = SWIG_From_std_string(static_cast< std::string >(*result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_missval_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_missval_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_missval_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_double(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_missval_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->missval = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_missval_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_missval_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double) ((arg1)->missval);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_values_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_values_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_values_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_values_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->values = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_values_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_values_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->values);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_valuesWithLevel_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_valuesWithLevel_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_valuesWithLevel_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_valuesWithLevel_set" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > * >(argp2);
+  if (arg1) (arg1)->valuesWithLevel = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_valuesWithLevel_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_valuesWithLevel_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)& ((arg1)->valuesWithLevel);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_grid_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiGrid *arg2 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_grid_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_grid_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_grid_set" "', argument " "2"" of type '" "CdiGrid *""'"); 
+  }
+  arg2 = reinterpret_cast< CdiGrid * >(argp2);
+  if (arg1) (arg1)->grid = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_grid_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  CdiGrid *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_grid_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiGrid *)& ((arg1)->grid);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_zaxis_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiZaxis *arg2 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_zaxis_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxis_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_zaxis_set" "', argument " "2"" of type '" "CdiZaxis *""'"); 
+  }
+  arg2 = reinterpret_cast< CdiZaxis * >(argp2);
+  if (arg1) (arg1)->zaxis = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_zaxis_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  CdiZaxis *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxis_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiZaxis *)& ((arg1)->zaxis);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_taxis_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiTaxis *arg2 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "CdiVariable_taxis_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxis_set" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_taxis_set" "', argument " "2"" of type '" "CdiTaxis *""'"); 
+  }
+  arg2 = reinterpret_cast< CdiTaxis * >(argp2);
+  if (arg1) (arg1)->taxis = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_taxis_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  CdiTaxis *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxis_get" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiTaxis *)& ((arg1)->taxis);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_sinfo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_sinfo" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->sinfo();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValues" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->getValues();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->getValuesWithLevel(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->getValuesWithLevel();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getValuesWithLevel", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getValuesWithLevel__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getValuesWithLevel__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getValuesWithLevel'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiVariable::getValuesWithLevel(int)\n"
+    "    CdiVariable::getValuesWithLevel()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getFValues(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  SwigValueWrapper< std::vector< float,std::allocator< float > > > result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValues" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (arg1)->getFValues();
+  resultobj = SWIG_NewPointerObj((new std::vector< float,std::allocator< float > >(static_cast< const std::vector< float,std::allocator< float > >& >(result))), SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = (arg1)->getFValuesWithLevel(arg2);
+  resultobj = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(static_cast< const std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >& >(result))), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (arg1)->getFValuesWithLevel();
+  resultobj = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(static_cast< const std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >& >(result))), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getFValuesWithLevel", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getFValuesWithLevel__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getFValuesWithLevel__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getFValuesWithLevel'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiVariable::getFValuesWithLevel(int)\n"
+    "    CdiVariable::getFValuesWithLevel()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesAsPointer(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  double *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double *)(arg1)->getValuesAsPointer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  double **result = 0 ;
+  
+  if ((nobjs < 2) || (nobjs > 2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  result = (double **)(arg1)->getValuesWithLevelAsPointer(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(PyObject *SWIGUNUSEDPARM(self), Py_ssize_t nobjs, PyObject **swig_obj) {
+  PyObject *resultobj = 0;
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double **result = 0 ;
+  
+  if ((nobjs < 1) || (nobjs > 1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double **)(arg1)->getValuesWithLevelAsPointer();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer(PyObject *self, PyObject *args) {
+  Py_ssize_t argc;
+  PyObject *argv[3] = {
+    0
+  };
+  
+  if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getValuesWithLevelAsPointer", 0, 2, argv))) SWIG_fail;
+  --argc;
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(self, argc, argv);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(self, argc, argv);
+      }
+    }
+  }
+  
+fail:
+  SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getValuesWithLevelAsPointer'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    CdiVariable::getValuesWithLevelAsPointer(int)\n"
+    "    CdiVariable::getValuesWithLevelAsPointer()\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *CdiVariable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_CdiVariable, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *CdiVariable_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+SWIGINTERN PyObject *_wrap_new_Cdi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  PyObject *swig_obj[1] ;
+  Cdi *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_AsCharPtrAndSize(swig_obj[0], &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Cdi" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (Cdi *)new Cdi((char const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Cdi, SWIG_POINTER_NEW |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete_Cdi(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Cdi" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_streamID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_streamID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_streamID_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_streamID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->streamID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_streamID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_streamID_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->streamID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_vlistID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_vlistID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_vlistID_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_vlistID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vlistID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_vlistID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_vlistID_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->vlistID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_nvars_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_nvars_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nvars_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_nvars_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->nvars = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_nvars_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nvars_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->nvars);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_nzaxes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_nzaxes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nzaxes_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_nzaxes_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->nzaxes = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_nzaxes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nzaxes_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->nzaxes);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_ngrids_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_ngrids_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ngrids_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_ngrids_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ngrids = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_ngrids_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ngrids_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->ngrids);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_ntaxes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_ntaxes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ntaxes_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_ntaxes_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ntaxes = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_ntaxes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ntaxes_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->ntaxes);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_taxisID_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_taxisID_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxisID_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(swig_obj[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_taxisID_set" "', argument " "2"" of type '" "int""'");
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_taxisID_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  int result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxisID_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_varnames_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg2 = (std::vector< std::string,std::allocator< std::string > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_varnames_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varnames_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_varnames_set" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string,std::allocator< std::string > > * >(argp2);
+  if (arg1) (arg1)->varnames = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_varnames_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varnames_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)& ((arg1)->varnames);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_codes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_codes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_codes_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_codes_set" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2);
+  if (arg1) (arg1)->codes = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_codes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_codes_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)& ((arg1)->codes);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_variables_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *arg2 = (std::vector< CdiVariable,std::allocator< CdiVariable > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_variables_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_variables_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_variables_set" "', argument " "2"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable,std::allocator< CdiVariable > > * >(argp2);
+  if (arg1) (arg1)->variables = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_variables_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_variables_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)& ((arg1)->variables);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_var_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *arg2 = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_var_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_var_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_var_set" "', argument " "2"" of type '" "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > * >(argp2);
+  if (arg1) (arg1)->var = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_var_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_var_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)& ((arg1)->var);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_varByCode_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *arg2 = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_varByCode_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varByCode_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_varByCode_set" "', argument " "2"" of type '" "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > * >(argp2);
+  if (arg1) (arg1)->varByCode = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_varByCode_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varByCode_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)& ((arg1)->varByCode);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_taxes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *arg2 = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_taxes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxes_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_taxes_set" "', argument " "2"" of type '" "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > * >(argp2);
+  if (arg1) (arg1)->taxes = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_taxes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxes_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)& ((arg1)->taxes);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_zaxes_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *arg2 = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_zaxes_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_zaxes_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_zaxes_set" "', argument " "2"" of type '" "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > * >(argp2);
+  if (arg1) (arg1)->zaxes = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_zaxes_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_zaxes_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)& ((arg1)->zaxes);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_grids_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *arg2 = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject *swig_obj[2] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "Cdi_grids_set", 2, 2, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_grids_set" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_grids_set" "', argument " "2"" of type '" "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > * >(argp2);
+  if (arg1) (arg1)->grids = *arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_grids_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_grids_get" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)& ((arg1)->grids);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_Cdi_griddes(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_griddes" "', argument " "1"" of type '" "Cdi *""'"); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  (arg1)->griddes();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *Cdi_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_Cdi, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *Cdi_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  return SWIG_Python_InitShadowInstance(args);
+}
+
+static PyMethodDef SwigMethods[] = {
+	 { "SWIG_PyInstanceMethod_New", SWIG_PyInstanceMethod_New, METH_O, NULL},
+	 { "delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_O, NULL},
+	 { "SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_O, NULL},
+	 { "SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, NULL},
+	 { "SwigPyIterator_decr", _wrap_SwigPyIterator_decr, METH_VARARGS, NULL},
+	 { "SwigPyIterator_distance", _wrap_SwigPyIterator_distance, METH_VARARGS, NULL},
+	 { "SwigPyIterator_equal", _wrap_SwigPyIterator_equal, METH_VARARGS, NULL},
+	 { "SwigPyIterator_copy", _wrap_SwigPyIterator_copy, METH_O, NULL},
+	 { "SwigPyIterator_next", _wrap_SwigPyIterator_next, METH_O, NULL},
+	 { "SwigPyIterator___next__", _wrap_SwigPyIterator___next__, METH_O, NULL},
+	 { "SwigPyIterator_previous", _wrap_SwigPyIterator_previous, METH_O, NULL},
+	 { "SwigPyIterator_advance", _wrap_SwigPyIterator_advance, METH_VARARGS, NULL},
+	 { "SwigPyIterator___eq__", _wrap_SwigPyIterator___eq__, METH_VARARGS, NULL},
+	 { "SwigPyIterator___ne__", _wrap_SwigPyIterator___ne__, METH_VARARGS, NULL},
+	 { "SwigPyIterator___iadd__", _wrap_SwigPyIterator___iadd__, METH_VARARGS, NULL},
+	 { "SwigPyIterator___isub__", _wrap_SwigPyIterator___isub__, METH_VARARGS, NULL},
+	 { "SwigPyIterator___add__", _wrap_SwigPyIterator___add__, METH_VARARGS, NULL},
+	 { "SwigPyIterator___sub__", _wrap_SwigPyIterator___sub__, METH_VARARGS, NULL},
+	 { "SwigPyIterator_swigregister", SwigPyIterator_swigregister, METH_O, NULL},
+	 { "IntVector_iterator", _wrap_IntVector_iterator, METH_O, NULL},
+	 { "IntVector___nonzero__", _wrap_IntVector___nonzero__, METH_O, NULL},
+	 { "IntVector___bool__", _wrap_IntVector___bool__, METH_O, NULL},
+	 { "IntVector___len__", _wrap_IntVector___len__, METH_O, NULL},
+	 { "IntVector___getslice__", _wrap_IntVector___getslice__, METH_VARARGS, NULL},
+	 { "IntVector___setslice__", _wrap_IntVector___setslice__, METH_VARARGS, NULL},
+	 { "IntVector___delslice__", _wrap_IntVector___delslice__, METH_VARARGS, NULL},
+	 { "IntVector___delitem__", _wrap_IntVector___delitem__, METH_VARARGS, NULL},
+	 { "IntVector___getitem__", _wrap_IntVector___getitem__, METH_VARARGS, NULL},
+	 { "IntVector___setitem__", _wrap_IntVector___setitem__, METH_VARARGS, NULL},
+	 { "IntVector_pop", _wrap_IntVector_pop, METH_O, NULL},
+	 { "IntVector_append", _wrap_IntVector_append, METH_VARARGS, NULL},
+	 { "IntVector_empty", _wrap_IntVector_empty, METH_O, NULL},
+	 { "IntVector_size", _wrap_IntVector_size, METH_O, NULL},
+	 { "IntVector_swap", _wrap_IntVector_swap, METH_VARARGS, NULL},
+	 { "IntVector_begin", _wrap_IntVector_begin, METH_O, NULL},
+	 { "IntVector_end", _wrap_IntVector_end, METH_O, NULL},
+	 { "IntVector_rbegin", _wrap_IntVector_rbegin, METH_O, NULL},
+	 { "IntVector_rend", _wrap_IntVector_rend, METH_O, NULL},
+	 { "IntVector_clear", _wrap_IntVector_clear, METH_O, NULL},
+	 { "IntVector_get_allocator", _wrap_IntVector_get_allocator, METH_O, NULL},
+	 { "IntVector_pop_back", _wrap_IntVector_pop_back, METH_O, NULL},
+	 { "IntVector_erase", _wrap_IntVector_erase, METH_VARARGS, NULL},
+	 { "new_IntVector", _wrap_new_IntVector, METH_VARARGS, NULL},
+	 { "IntVector_push_back", _wrap_IntVector_push_back, METH_VARARGS, NULL},
+	 { "IntVector_front", _wrap_IntVector_front, METH_O, NULL},
+	 { "IntVector_back", _wrap_IntVector_back, METH_O, NULL},
+	 { "IntVector_assign", _wrap_IntVector_assign, METH_VARARGS, NULL},
+	 { "IntVector_resize", _wrap_IntVector_resize, METH_VARARGS, NULL},
+	 { "IntVector_insert", _wrap_IntVector_insert, METH_VARARGS, NULL},
+	 { "IntVector_reserve", _wrap_IntVector_reserve, METH_VARARGS, NULL},
+	 { "IntVector_capacity", _wrap_IntVector_capacity, METH_O, NULL},
+	 { "delete_IntVector", _wrap_delete_IntVector, METH_O, NULL},
+	 { "IntVector_swigregister", IntVector_swigregister, METH_O, NULL},
+	 { "IntVector_swiginit", IntVector_swiginit, METH_VARARGS, NULL},
+	 { "DoubleVector_iterator", _wrap_DoubleVector_iterator, METH_O, NULL},
+	 { "DoubleVector___nonzero__", _wrap_DoubleVector___nonzero__, METH_O, NULL},
+	 { "DoubleVector___bool__", _wrap_DoubleVector___bool__, METH_O, NULL},
+	 { "DoubleVector___len__", _wrap_DoubleVector___len__, METH_O, NULL},
+	 { "DoubleVector___getslice__", _wrap_DoubleVector___getslice__, METH_VARARGS, NULL},
+	 { "DoubleVector___setslice__", _wrap_DoubleVector___setslice__, METH_VARARGS, NULL},
+	 { "DoubleVector___delslice__", _wrap_DoubleVector___delslice__, METH_VARARGS, NULL},
+	 { "DoubleVector___delitem__", _wrap_DoubleVector___delitem__, METH_VARARGS, NULL},
+	 { "DoubleVector___getitem__", _wrap_DoubleVector___getitem__, METH_VARARGS, NULL},
+	 { "DoubleVector___setitem__", _wrap_DoubleVector___setitem__, METH_VARARGS, NULL},
+	 { "DoubleVector_pop", _wrap_DoubleVector_pop, METH_O, NULL},
+	 { "DoubleVector_append", _wrap_DoubleVector_append, METH_VARARGS, NULL},
+	 { "DoubleVector_empty", _wrap_DoubleVector_empty, METH_O, NULL},
+	 { "DoubleVector_size", _wrap_DoubleVector_size, METH_O, NULL},
+	 { "DoubleVector_swap", _wrap_DoubleVector_swap, METH_VARARGS, NULL},
+	 { "DoubleVector_begin", _wrap_DoubleVector_begin, METH_O, NULL},
+	 { "DoubleVector_end", _wrap_DoubleVector_end, METH_O, NULL},
+	 { "DoubleVector_rbegin", _wrap_DoubleVector_rbegin, METH_O, NULL},
+	 { "DoubleVector_rend", _wrap_DoubleVector_rend, METH_O, NULL},
+	 { "DoubleVector_clear", _wrap_DoubleVector_clear, METH_O, NULL},
+	 { "DoubleVector_get_allocator", _wrap_DoubleVector_get_allocator, METH_O, NULL},
+	 { "DoubleVector_pop_back", _wrap_DoubleVector_pop_back, METH_O, NULL},
+	 { "DoubleVector_erase", _wrap_DoubleVector_erase, METH_VARARGS, NULL},
+	 { "new_DoubleVector", _wrap_new_DoubleVector, METH_VARARGS, NULL},
+	 { "DoubleVector_push_back", _wrap_DoubleVector_push_back, METH_VARARGS, NULL},
+	 { "DoubleVector_front", _wrap_DoubleVector_front, METH_O, NULL},
+	 { "DoubleVector_back", _wrap_DoubleVector_back, METH_O, NULL},
+	 { "DoubleVector_assign", _wrap_DoubleVector_assign, METH_VARARGS, NULL},
+	 { "DoubleVector_resize", _wrap_DoubleVector_resize, METH_VARARGS, NULL},
+	 { "DoubleVector_insert", _wrap_DoubleVector_insert, METH_VARARGS, NULL},
+	 { "DoubleVector_reserve", _wrap_DoubleVector_reserve, METH_VARARGS, NULL},
+	 { "DoubleVector_capacity", _wrap_DoubleVector_capacity, METH_O, NULL},
+	 { "delete_DoubleVector", _wrap_delete_DoubleVector, METH_O, NULL},
+	 { "DoubleVector_swigregister", DoubleVector_swigregister, METH_O, NULL},
+	 { "DoubleVector_swiginit", DoubleVector_swiginit, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_iterator", _wrap_DoubleDoubleVector_iterator, METH_O, NULL},
+	 { "DoubleDoubleVector___nonzero__", _wrap_DoubleDoubleVector___nonzero__, METH_O, NULL},
+	 { "DoubleDoubleVector___bool__", _wrap_DoubleDoubleVector___bool__, METH_O, NULL},
+	 { "DoubleDoubleVector___len__", _wrap_DoubleDoubleVector___len__, METH_O, NULL},
+	 { "DoubleDoubleVector___getslice__", _wrap_DoubleDoubleVector___getslice__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector___setslice__", _wrap_DoubleDoubleVector___setslice__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector___delslice__", _wrap_DoubleDoubleVector___delslice__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector___delitem__", _wrap_DoubleDoubleVector___delitem__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector___getitem__", _wrap_DoubleDoubleVector___getitem__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector___setitem__", _wrap_DoubleDoubleVector___setitem__, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_pop", _wrap_DoubleDoubleVector_pop, METH_O, NULL},
+	 { "DoubleDoubleVector_append", _wrap_DoubleDoubleVector_append, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_empty", _wrap_DoubleDoubleVector_empty, METH_O, NULL},
+	 { "DoubleDoubleVector_size", _wrap_DoubleDoubleVector_size, METH_O, NULL},
+	 { "DoubleDoubleVector_swap", _wrap_DoubleDoubleVector_swap, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_begin", _wrap_DoubleDoubleVector_begin, METH_O, NULL},
+	 { "DoubleDoubleVector_end", _wrap_DoubleDoubleVector_end, METH_O, NULL},
+	 { "DoubleDoubleVector_rbegin", _wrap_DoubleDoubleVector_rbegin, METH_O, NULL},
+	 { "DoubleDoubleVector_rend", _wrap_DoubleDoubleVector_rend, METH_O, NULL},
+	 { "DoubleDoubleVector_clear", _wrap_DoubleDoubleVector_clear, METH_O, NULL},
+	 { "DoubleDoubleVector_get_allocator", _wrap_DoubleDoubleVector_get_allocator, METH_O, NULL},
+	 { "DoubleDoubleVector_pop_back", _wrap_DoubleDoubleVector_pop_back, METH_O, NULL},
+	 { "DoubleDoubleVector_erase", _wrap_DoubleDoubleVector_erase, METH_VARARGS, NULL},
+	 { "new_DoubleDoubleVector", _wrap_new_DoubleDoubleVector, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_push_back", _wrap_DoubleDoubleVector_push_back, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_front", _wrap_DoubleDoubleVector_front, METH_O, NULL},
+	 { "DoubleDoubleVector_back", _wrap_DoubleDoubleVector_back, METH_O, NULL},
+	 { "DoubleDoubleVector_assign", _wrap_DoubleDoubleVector_assign, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_resize", _wrap_DoubleDoubleVector_resize, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_insert", _wrap_DoubleDoubleVector_insert, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_reserve", _wrap_DoubleDoubleVector_reserve, METH_VARARGS, NULL},
+	 { "DoubleDoubleVector_capacity", _wrap_DoubleDoubleVector_capacity, METH_O, NULL},
+	 { "delete_DoubleDoubleVector", _wrap_delete_DoubleDoubleVector, METH_O, NULL},
+	 { "DoubleDoubleVector_swigregister", DoubleDoubleVector_swigregister, METH_O, NULL},
+	 { "DoubleDoubleVector_swiginit", DoubleDoubleVector_swiginit, METH_VARARGS, NULL},
+	 { "StringVector_iterator", _wrap_StringVector_iterator, METH_O, NULL},
+	 { "StringVector___nonzero__", _wrap_StringVector___nonzero__, METH_O, NULL},
+	 { "StringVector___bool__", _wrap_StringVector___bool__, METH_O, NULL},
+	 { "StringVector___len__", _wrap_StringVector___len__, METH_O, NULL},
+	 { "StringVector___getslice__", _wrap_StringVector___getslice__, METH_VARARGS, NULL},
+	 { "StringVector___setslice__", _wrap_StringVector___setslice__, METH_VARARGS, NULL},
+	 { "StringVector___delslice__", _wrap_StringVector___delslice__, METH_VARARGS, NULL},
+	 { "StringVector___delitem__", _wrap_StringVector___delitem__, METH_VARARGS, NULL},
+	 { "StringVector___getitem__", _wrap_StringVector___getitem__, METH_VARARGS, NULL},
+	 { "StringVector___setitem__", _wrap_StringVector___setitem__, METH_VARARGS, NULL},
+	 { "StringVector_pop", _wrap_StringVector_pop, METH_O, NULL},
+	 { "StringVector_append", _wrap_StringVector_append, METH_VARARGS, NULL},
+	 { "StringVector_empty", _wrap_StringVector_empty, METH_O, NULL},
+	 { "StringVector_size", _wrap_StringVector_size, METH_O, NULL},
+	 { "StringVector_swap", _wrap_StringVector_swap, METH_VARARGS, NULL},
+	 { "StringVector_begin", _wrap_StringVector_begin, METH_O, NULL},
+	 { "StringVector_end", _wrap_StringVector_end, METH_O, NULL},
+	 { "StringVector_rbegin", _wrap_StringVector_rbegin, METH_O, NULL},
+	 { "StringVector_rend", _wrap_StringVector_rend, METH_O, NULL},
+	 { "StringVector_clear", _wrap_StringVector_clear, METH_O, NULL},
+	 { "StringVector_get_allocator", _wrap_StringVector_get_allocator, METH_O, NULL},
+	 { "StringVector_pop_back", _wrap_StringVector_pop_back, METH_O, NULL},
+	 { "StringVector_erase", _wrap_StringVector_erase, METH_VARARGS, NULL},
+	 { "new_StringVector", _wrap_new_StringVector, METH_VARARGS, NULL},
+	 { "StringVector_push_back", _wrap_StringVector_push_back, METH_VARARGS, NULL},
+	 { "StringVector_front", _wrap_StringVector_front, METH_O, NULL},
+	 { "StringVector_back", _wrap_StringVector_back, METH_O, NULL},
+	 { "StringVector_assign", _wrap_StringVector_assign, METH_VARARGS, NULL},
+	 { "StringVector_resize", _wrap_StringVector_resize, METH_VARARGS, NULL},
+	 { "StringVector_insert", _wrap_StringVector_insert, METH_VARARGS, NULL},
+	 { "StringVector_reserve", _wrap_StringVector_reserve, METH_VARARGS, NULL},
+	 { "StringVector_capacity", _wrap_StringVector_capacity, METH_O, NULL},
+	 { "delete_StringVector", _wrap_delete_StringVector, METH_O, NULL},
+	 { "StringVector_swigregister", StringVector_swigregister, METH_O, NULL},
+	 { "StringVector_swiginit", StringVector_swiginit, METH_VARARGS, NULL},
+	 { "VarsVector_iterator", _wrap_VarsVector_iterator, METH_O, NULL},
+	 { "VarsVector___nonzero__", _wrap_VarsVector___nonzero__, METH_O, NULL},
+	 { "VarsVector___bool__", _wrap_VarsVector___bool__, METH_O, NULL},
+	 { "VarsVector___len__", _wrap_VarsVector___len__, METH_O, NULL},
+	 { "VarsVector___getslice__", _wrap_VarsVector___getslice__, METH_VARARGS, NULL},
+	 { "VarsVector___setslice__", _wrap_VarsVector___setslice__, METH_VARARGS, NULL},
+	 { "VarsVector___delslice__", _wrap_VarsVector___delslice__, METH_VARARGS, NULL},
+	 { "VarsVector___delitem__", _wrap_VarsVector___delitem__, METH_VARARGS, NULL},
+	 { "VarsVector___getitem__", _wrap_VarsVector___getitem__, METH_VARARGS, NULL},
+	 { "VarsVector___setitem__", _wrap_VarsVector___setitem__, METH_VARARGS, NULL},
+	 { "VarsVector_pop", _wrap_VarsVector_pop, METH_O, NULL},
+	 { "VarsVector_append", _wrap_VarsVector_append, METH_VARARGS, NULL},
+	 { "VarsVector_empty", _wrap_VarsVector_empty, METH_O, NULL},
+	 { "VarsVector_size", _wrap_VarsVector_size, METH_O, NULL},
+	 { "VarsVector_swap", _wrap_VarsVector_swap, METH_VARARGS, NULL},
+	 { "VarsVector_begin", _wrap_VarsVector_begin, METH_O, NULL},
+	 { "VarsVector_end", _wrap_VarsVector_end, METH_O, NULL},
+	 { "VarsVector_rbegin", _wrap_VarsVector_rbegin, METH_O, NULL},
+	 { "VarsVector_rend", _wrap_VarsVector_rend, METH_O, NULL},
+	 { "VarsVector_clear", _wrap_VarsVector_clear, METH_O, NULL},
+	 { "VarsVector_get_allocator", _wrap_VarsVector_get_allocator, METH_O, NULL},
+	 { "VarsVector_pop_back", _wrap_VarsVector_pop_back, METH_O, NULL},
+	 { "VarsVector_erase", _wrap_VarsVector_erase, METH_VARARGS, NULL},
+	 { "new_VarsVector", _wrap_new_VarsVector, METH_VARARGS, NULL},
+	 { "VarsVector_push_back", _wrap_VarsVector_push_back, METH_VARARGS, NULL},
+	 { "VarsVector_front", _wrap_VarsVector_front, METH_O, NULL},
+	 { "VarsVector_back", _wrap_VarsVector_back, METH_O, NULL},
+	 { "VarsVector_assign", _wrap_VarsVector_assign, METH_VARARGS, NULL},
+	 { "VarsVector_resize", _wrap_VarsVector_resize, METH_VARARGS, NULL},
+	 { "VarsVector_insert", _wrap_VarsVector_insert, METH_VARARGS, NULL},
+	 { "VarsVector_reserve", _wrap_VarsVector_reserve, METH_VARARGS, NULL},
+	 { "VarsVector_capacity", _wrap_VarsVector_capacity, METH_O, NULL},
+	 { "delete_VarsVector", _wrap_delete_VarsVector, METH_O, NULL},
+	 { "VarsVector_swigregister", VarsVector_swigregister, METH_O, NULL},
+	 { "VarsVector_swiginit", VarsVector_swiginit, METH_VARARGS, NULL},
+	 { "VarsMap_iterator", _wrap_VarsMap_iterator, METH_O, NULL},
+	 { "VarsMap___nonzero__", _wrap_VarsMap___nonzero__, METH_O, NULL},
+	 { "VarsMap___bool__", _wrap_VarsMap___bool__, METH_O, NULL},
+	 { "VarsMap___len__", _wrap_VarsMap___len__, METH_O, NULL},
+	 { "VarsMap___getitem__", _wrap_VarsMap___getitem__, METH_VARARGS, NULL},
+	 { "VarsMap___delitem__", _wrap_VarsMap___delitem__, METH_VARARGS, NULL},
+	 { "VarsMap_has_key", _wrap_VarsMap_has_key, METH_VARARGS, NULL},
+	 { "VarsMap_keys", _wrap_VarsMap_keys, METH_O, NULL},
+	 { "VarsMap_values", _wrap_VarsMap_values, METH_O, NULL},
+	 { "VarsMap_items", _wrap_VarsMap_items, METH_O, NULL},
+	 { "VarsMap___contains__", _wrap_VarsMap___contains__, METH_VARARGS, NULL},
+	 { "VarsMap_key_iterator", _wrap_VarsMap_key_iterator, METH_O, NULL},
+	 { "VarsMap_value_iterator", _wrap_VarsMap_value_iterator, METH_O, NULL},
+	 { "VarsMap___setitem__", _wrap_VarsMap___setitem__, METH_VARARGS, NULL},
+	 { "VarsMap_asdict", _wrap_VarsMap_asdict, METH_O, NULL},
+	 { "new_VarsMap", _wrap_new_VarsMap, METH_VARARGS, NULL},
+	 { "VarsMap_empty", _wrap_VarsMap_empty, METH_O, NULL},
+	 { "VarsMap_size", _wrap_VarsMap_size, METH_O, NULL},
+	 { "VarsMap_swap", _wrap_VarsMap_swap, METH_VARARGS, NULL},
+	 { "VarsMap_begin", _wrap_VarsMap_begin, METH_O, NULL},
+	 { "VarsMap_end", _wrap_VarsMap_end, METH_O, NULL},
+	 { "VarsMap_rbegin", _wrap_VarsMap_rbegin, METH_O, NULL},
+	 { "VarsMap_rend", _wrap_VarsMap_rend, METH_O, NULL},
+	 { "VarsMap_clear", _wrap_VarsMap_clear, METH_O, NULL},
+	 { "VarsMap_get_allocator", _wrap_VarsMap_get_allocator, METH_O, NULL},
+	 { "VarsMap_count", _wrap_VarsMap_count, METH_VARARGS, NULL},
+	 { "VarsMap_erase", _wrap_VarsMap_erase, METH_VARARGS, NULL},
+	 { "VarsMap_find", _wrap_VarsMap_find, METH_VARARGS, NULL},
+	 { "VarsMap_lower_bound", _wrap_VarsMap_lower_bound, METH_VARARGS, NULL},
+	 { "VarsMap_upper_bound", _wrap_VarsMap_upper_bound, METH_VARARGS, NULL},
+	 { "delete_VarsMap", _wrap_delete_VarsMap, METH_O, NULL},
+	 { "VarsMap_swigregister", VarsMap_swigregister, METH_O, NULL},
+	 { "VarsMap_swiginit", VarsMap_swiginit, METH_VARARGS, NULL},
+	 { "VarsByCode_iterator", _wrap_VarsByCode_iterator, METH_O, NULL},
+	 { "VarsByCode___nonzero__", _wrap_VarsByCode___nonzero__, METH_O, NULL},
+	 { "VarsByCode___bool__", _wrap_VarsByCode___bool__, METH_O, NULL},
+	 { "VarsByCode___len__", _wrap_VarsByCode___len__, METH_O, NULL},
+	 { "VarsByCode___getitem__", _wrap_VarsByCode___getitem__, METH_VARARGS, NULL},
+	 { "VarsByCode___delitem__", _wrap_VarsByCode___delitem__, METH_VARARGS, NULL},
+	 { "VarsByCode_has_key", _wrap_VarsByCode_has_key, METH_VARARGS, NULL},
+	 { "VarsByCode_keys", _wrap_VarsByCode_keys, METH_O, NULL},
+	 { "VarsByCode_values", _wrap_VarsByCode_values, METH_O, NULL},
+	 { "VarsByCode_items", _wrap_VarsByCode_items, METH_O, NULL},
+	 { "VarsByCode___contains__", _wrap_VarsByCode___contains__, METH_VARARGS, NULL},
+	 { "VarsByCode_key_iterator", _wrap_VarsByCode_key_iterator, METH_O, NULL},
+	 { "VarsByCode_value_iterator", _wrap_VarsByCode_value_iterator, METH_O, NULL},
+	 { "VarsByCode___setitem__", _wrap_VarsByCode___setitem__, METH_VARARGS, NULL},
+	 { "VarsByCode_asdict", _wrap_VarsByCode_asdict, METH_O, NULL},
+	 { "new_VarsByCode", _wrap_new_VarsByCode, METH_VARARGS, NULL},
+	 { "VarsByCode_empty", _wrap_VarsByCode_empty, METH_O, NULL},
+	 { "VarsByCode_size", _wrap_VarsByCode_size, METH_O, NULL},
+	 { "VarsByCode_swap", _wrap_VarsByCode_swap, METH_VARARGS, NULL},
+	 { "VarsByCode_begin", _wrap_VarsByCode_begin, METH_O, NULL},
+	 { "VarsByCode_end", _wrap_VarsByCode_end, METH_O, NULL},
+	 { "VarsByCode_rbegin", _wrap_VarsByCode_rbegin, METH_O, NULL},
+	 { "VarsByCode_rend", _wrap_VarsByCode_rend, METH_O, NULL},
+	 { "VarsByCode_clear", _wrap_VarsByCode_clear, METH_O, NULL},
+	 { "VarsByCode_get_allocator", _wrap_VarsByCode_get_allocator, METH_O, NULL},
+	 { "VarsByCode_count", _wrap_VarsByCode_count, METH_VARARGS, NULL},
+	 { "VarsByCode_erase", _wrap_VarsByCode_erase, METH_VARARGS, NULL},
+	 { "VarsByCode_find", _wrap_VarsByCode_find, METH_VARARGS, NULL},
+	 { "VarsByCode_lower_bound", _wrap_VarsByCode_lower_bound, METH_VARARGS, NULL},
+	 { "VarsByCode_upper_bound", _wrap_VarsByCode_upper_bound, METH_VARARGS, NULL},
+	 { "delete_VarsByCode", _wrap_delete_VarsByCode, METH_O, NULL},
+	 { "VarsByCode_swigregister", VarsByCode_swigregister, METH_O, NULL},
+	 { "VarsByCode_swiginit", VarsByCode_swiginit, METH_VARARGS, NULL},
+	 { "TaxesMap_iterator", _wrap_TaxesMap_iterator, METH_O, NULL},
+	 { "TaxesMap___nonzero__", _wrap_TaxesMap___nonzero__, METH_O, NULL},
+	 { "TaxesMap___bool__", _wrap_TaxesMap___bool__, METH_O, NULL},
+	 { "TaxesMap___len__", _wrap_TaxesMap___len__, METH_O, NULL},
+	 { "TaxesMap___getitem__", _wrap_TaxesMap___getitem__, METH_VARARGS, NULL},
+	 { "TaxesMap___delitem__", _wrap_TaxesMap___delitem__, METH_VARARGS, NULL},
+	 { "TaxesMap_has_key", _wrap_TaxesMap_has_key, METH_VARARGS, NULL},
+	 { "TaxesMap_keys", _wrap_TaxesMap_keys, METH_O, NULL},
+	 { "TaxesMap_values", _wrap_TaxesMap_values, METH_O, NULL},
+	 { "TaxesMap_items", _wrap_TaxesMap_items, METH_O, NULL},
+	 { "TaxesMap___contains__", _wrap_TaxesMap___contains__, METH_VARARGS, NULL},
+	 { "TaxesMap_key_iterator", _wrap_TaxesMap_key_iterator, METH_O, NULL},
+	 { "TaxesMap_value_iterator", _wrap_TaxesMap_value_iterator, METH_O, NULL},
+	 { "TaxesMap___setitem__", _wrap_TaxesMap___setitem__, METH_VARARGS, NULL},
+	 { "TaxesMap_asdict", _wrap_TaxesMap_asdict, METH_O, NULL},
+	 { "new_TaxesMap", _wrap_new_TaxesMap, METH_VARARGS, NULL},
+	 { "TaxesMap_empty", _wrap_TaxesMap_empty, METH_O, NULL},
+	 { "TaxesMap_size", _wrap_TaxesMap_size, METH_O, NULL},
+	 { "TaxesMap_swap", _wrap_TaxesMap_swap, METH_VARARGS, NULL},
+	 { "TaxesMap_begin", _wrap_TaxesMap_begin, METH_O, NULL},
+	 { "TaxesMap_end", _wrap_TaxesMap_end, METH_O, NULL},
+	 { "TaxesMap_rbegin", _wrap_TaxesMap_rbegin, METH_O, NULL},
+	 { "TaxesMap_rend", _wrap_TaxesMap_rend, METH_O, NULL},
+	 { "TaxesMap_clear", _wrap_TaxesMap_clear, METH_O, NULL},
+	 { "TaxesMap_get_allocator", _wrap_TaxesMap_get_allocator, METH_O, NULL},
+	 { "TaxesMap_count", _wrap_TaxesMap_count, METH_VARARGS, NULL},
+	 { "TaxesMap_erase", _wrap_TaxesMap_erase, METH_VARARGS, NULL},
+	 { "TaxesMap_find", _wrap_TaxesMap_find, METH_VARARGS, NULL},
+	 { "TaxesMap_lower_bound", _wrap_TaxesMap_lower_bound, METH_VARARGS, NULL},
+	 { "TaxesMap_upper_bound", _wrap_TaxesMap_upper_bound, METH_VARARGS, NULL},
+	 { "delete_TaxesMap", _wrap_delete_TaxesMap, METH_O, NULL},
+	 { "TaxesMap_swigregister", TaxesMap_swigregister, METH_O, NULL},
+	 { "TaxesMap_swiginit", TaxesMap_swiginit, METH_VARARGS, NULL},
+	 { "ZaxesMap_iterator", _wrap_ZaxesMap_iterator, METH_O, NULL},
+	 { "ZaxesMap___nonzero__", _wrap_ZaxesMap___nonzero__, METH_O, NULL},
+	 { "ZaxesMap___bool__", _wrap_ZaxesMap___bool__, METH_O, NULL},
+	 { "ZaxesMap___len__", _wrap_ZaxesMap___len__, METH_O, NULL},
+	 { "ZaxesMap___getitem__", _wrap_ZaxesMap___getitem__, METH_VARARGS, NULL},
+	 { "ZaxesMap___delitem__", _wrap_ZaxesMap___delitem__, METH_VARARGS, NULL},
+	 { "ZaxesMap_has_key", _wrap_ZaxesMap_has_key, METH_VARARGS, NULL},
+	 { "ZaxesMap_keys", _wrap_ZaxesMap_keys, METH_O, NULL},
+	 { "ZaxesMap_values", _wrap_ZaxesMap_values, METH_O, NULL},
+	 { "ZaxesMap_items", _wrap_ZaxesMap_items, METH_O, NULL},
+	 { "ZaxesMap___contains__", _wrap_ZaxesMap___contains__, METH_VARARGS, NULL},
+	 { "ZaxesMap_key_iterator", _wrap_ZaxesMap_key_iterator, METH_O, NULL},
+	 { "ZaxesMap_value_iterator", _wrap_ZaxesMap_value_iterator, METH_O, NULL},
+	 { "ZaxesMap___setitem__", _wrap_ZaxesMap___setitem__, METH_VARARGS, NULL},
+	 { "ZaxesMap_asdict", _wrap_ZaxesMap_asdict, METH_O, NULL},
+	 { "new_ZaxesMap", _wrap_new_ZaxesMap, METH_VARARGS, NULL},
+	 { "ZaxesMap_empty", _wrap_ZaxesMap_empty, METH_O, NULL},
+	 { "ZaxesMap_size", _wrap_ZaxesMap_size, METH_O, NULL},
+	 { "ZaxesMap_swap", _wrap_ZaxesMap_swap, METH_VARARGS, NULL},
+	 { "ZaxesMap_begin", _wrap_ZaxesMap_begin, METH_O, NULL},
+	 { "ZaxesMap_end", _wrap_ZaxesMap_end, METH_O, NULL},
+	 { "ZaxesMap_rbegin", _wrap_ZaxesMap_rbegin, METH_O, NULL},
+	 { "ZaxesMap_rend", _wrap_ZaxesMap_rend, METH_O, NULL},
+	 { "ZaxesMap_clear", _wrap_ZaxesMap_clear, METH_O, NULL},
+	 { "ZaxesMap_get_allocator", _wrap_ZaxesMap_get_allocator, METH_O, NULL},
+	 { "ZaxesMap_count", _wrap_ZaxesMap_count, METH_VARARGS, NULL},
+	 { "ZaxesMap_erase", _wrap_ZaxesMap_erase, METH_VARARGS, NULL},
+	 { "ZaxesMap_find", _wrap_ZaxesMap_find, METH_VARARGS, NULL},
+	 { "ZaxesMap_lower_bound", _wrap_ZaxesMap_lower_bound, METH_VARARGS, NULL},
+	 { "ZaxesMap_upper_bound", _wrap_ZaxesMap_upper_bound, METH_VARARGS, NULL},
+	 { "delete_ZaxesMap", _wrap_delete_ZaxesMap, METH_O, NULL},
+	 { "ZaxesMap_swigregister", ZaxesMap_swigregister, METH_O, NULL},
+	 { "ZaxesMap_swiginit", ZaxesMap_swiginit, METH_VARARGS, NULL},
+	 { "GridsMap_iterator", _wrap_GridsMap_iterator, METH_O, NULL},
+	 { "GridsMap___nonzero__", _wrap_GridsMap___nonzero__, METH_O, NULL},
+	 { "GridsMap___bool__", _wrap_GridsMap___bool__, METH_O, NULL},
+	 { "GridsMap___len__", _wrap_GridsMap___len__, METH_O, NULL},
+	 { "GridsMap___getitem__", _wrap_GridsMap___getitem__, METH_VARARGS, NULL},
+	 { "GridsMap___delitem__", _wrap_GridsMap___delitem__, METH_VARARGS, NULL},
+	 { "GridsMap_has_key", _wrap_GridsMap_has_key, METH_VARARGS, NULL},
+	 { "GridsMap_keys", _wrap_GridsMap_keys, METH_O, NULL},
+	 { "GridsMap_values", _wrap_GridsMap_values, METH_O, NULL},
+	 { "GridsMap_items", _wrap_GridsMap_items, METH_O, NULL},
+	 { "GridsMap___contains__", _wrap_GridsMap___contains__, METH_VARARGS, NULL},
+	 { "GridsMap_key_iterator", _wrap_GridsMap_key_iterator, METH_O, NULL},
+	 { "GridsMap_value_iterator", _wrap_GridsMap_value_iterator, METH_O, NULL},
+	 { "GridsMap___setitem__", _wrap_GridsMap___setitem__, METH_VARARGS, NULL},
+	 { "GridsMap_asdict", _wrap_GridsMap_asdict, METH_O, NULL},
+	 { "new_GridsMap", _wrap_new_GridsMap, METH_VARARGS, NULL},
+	 { "GridsMap_empty", _wrap_GridsMap_empty, METH_O, NULL},
+	 { "GridsMap_size", _wrap_GridsMap_size, METH_O, NULL},
+	 { "GridsMap_swap", _wrap_GridsMap_swap, METH_VARARGS, NULL},
+	 { "GridsMap_begin", _wrap_GridsMap_begin, METH_O, NULL},
+	 { "GridsMap_end", _wrap_GridsMap_end, METH_O, NULL},
+	 { "GridsMap_rbegin", _wrap_GridsMap_rbegin, METH_O, NULL},
+	 { "GridsMap_rend", _wrap_GridsMap_rend, METH_O, NULL},
+	 { "GridsMap_clear", _wrap_GridsMap_clear, METH_O, NULL},
+	 { "GridsMap_get_allocator", _wrap_GridsMap_get_allocator, METH_O, NULL},
+	 { "GridsMap_count", _wrap_GridsMap_count, METH_VARARGS, NULL},
+	 { "GridsMap_erase", _wrap_GridsMap_erase, METH_VARARGS, NULL},
+	 { "GridsMap_find", _wrap_GridsMap_find, METH_VARARGS, NULL},
+	 { "GridsMap_lower_bound", _wrap_GridsMap_lower_bound, METH_VARARGS, NULL},
+	 { "GridsMap_upper_bound", _wrap_GridsMap_upper_bound, METH_VARARGS, NULL},
+	 { "delete_GridsMap", _wrap_delete_GridsMap, METH_O, NULL},
+	 { "GridsMap_swigregister", GridsMap_swigregister, METH_O, NULL},
+	 { "GridsMap_swiginit", GridsMap_swiginit, METH_VARARGS, NULL},
+	 { "new_CdiGrid", _wrap_new_CdiGrid, METH_VARARGS, NULL},
+	 { "delete_CdiGrid", _wrap_delete_CdiGrid, METH_O, NULL},
+	 { "CdiGrid_gridID_set", _wrap_CdiGrid_gridID_set, METH_VARARGS, NULL},
+	 { "CdiGrid_gridID_get", _wrap_CdiGrid_gridID_get, METH_O, NULL},
+	 { "CdiGrid_type_set", _wrap_CdiGrid_type_set, METH_VARARGS, NULL},
+	 { "CdiGrid_type_get", _wrap_CdiGrid_type_get, METH_O, NULL},
+	 { "CdiGrid_size_set", _wrap_CdiGrid_size_set, METH_VARARGS, NULL},
+	 { "CdiGrid_size_get", _wrap_CdiGrid_size_get, METH_O, NULL},
+	 { "CdiGrid_xsize_set", _wrap_CdiGrid_xsize_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xsize_get", _wrap_CdiGrid_xsize_get, METH_O, NULL},
+	 { "CdiGrid_ysize_set", _wrap_CdiGrid_ysize_set, METH_VARARGS, NULL},
+	 { "CdiGrid_ysize_get", _wrap_CdiGrid_ysize_get, METH_O, NULL},
+	 { "CdiGrid_prec_set", _wrap_CdiGrid_prec_set, METH_VARARGS, NULL},
+	 { "CdiGrid_prec_get", _wrap_CdiGrid_prec_get, METH_O, NULL},
+	 { "CdiGrid_ncorner_set", _wrap_CdiGrid_ncorner_set, METH_VARARGS, NULL},
+	 { "CdiGrid_ncorner_get", _wrap_CdiGrid_ncorner_get, METH_O, NULL},
+	 { "CdiGrid_hasXValues_set", _wrap_CdiGrid_hasXValues_set, METH_VARARGS, NULL},
+	 { "CdiGrid_hasXValues_get", _wrap_CdiGrid_hasXValues_get, METH_O, NULL},
+	 { "CdiGrid_hasYValues_set", _wrap_CdiGrid_hasYValues_set, METH_VARARGS, NULL},
+	 { "CdiGrid_hasYValues_get", _wrap_CdiGrid_hasYValues_get, METH_O, NULL},
+	 { "CdiGrid_hasBounds_set", _wrap_CdiGrid_hasBounds_set, METH_VARARGS, NULL},
+	 { "CdiGrid_hasBounds_get", _wrap_CdiGrid_hasBounds_get, METH_O, NULL},
+	 { "CdiGrid_xvalues_set", _wrap_CdiGrid_xvalues_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xvalues_get", _wrap_CdiGrid_xvalues_get, METH_O, NULL},
+	 { "CdiGrid_yvalues_set", _wrap_CdiGrid_yvalues_set, METH_VARARGS, NULL},
+	 { "CdiGrid_yvalues_get", _wrap_CdiGrid_yvalues_get, METH_O, NULL},
+	 { "CdiGrid_xbounds_set", _wrap_CdiGrid_xbounds_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xbounds_get", _wrap_CdiGrid_xbounds_get, METH_O, NULL},
+	 { "CdiGrid_ybounds_set", _wrap_CdiGrid_ybounds_set, METH_VARARGS, NULL},
+	 { "CdiGrid_ybounds_get", _wrap_CdiGrid_ybounds_get, METH_O, NULL},
+	 { "CdiGrid_xname_set", _wrap_CdiGrid_xname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xname_get", _wrap_CdiGrid_xname_get, METH_O, NULL},
+	 { "CdiGrid_xlongname_set", _wrap_CdiGrid_xlongname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xlongname_get", _wrap_CdiGrid_xlongname_get, METH_O, NULL},
+	 { "CdiGrid_xstdname_set", _wrap_CdiGrid_xstdname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xstdname_get", _wrap_CdiGrid_xstdname_get, METH_O, NULL},
+	 { "CdiGrid_xunits_set", _wrap_CdiGrid_xunits_set, METH_VARARGS, NULL},
+	 { "CdiGrid_xunits_get", _wrap_CdiGrid_xunits_get, METH_O, NULL},
+	 { "CdiGrid_yname_set", _wrap_CdiGrid_yname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_yname_get", _wrap_CdiGrid_yname_get, METH_O, NULL},
+	 { "CdiGrid_ylongname_set", _wrap_CdiGrid_ylongname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_ylongname_get", _wrap_CdiGrid_ylongname_get, METH_O, NULL},
+	 { "CdiGrid_ystdname_set", _wrap_CdiGrid_ystdname_set, METH_VARARGS, NULL},
+	 { "CdiGrid_ystdname_get", _wrap_CdiGrid_ystdname_get, METH_O, NULL},
+	 { "CdiGrid_yunits_set", _wrap_CdiGrid_yunits_set, METH_VARARGS, NULL},
+	 { "CdiGrid_yunits_get", _wrap_CdiGrid_yunits_get, METH_O, NULL},
+	 { "CdiGrid_name_set", _wrap_CdiGrid_name_set, METH_VARARGS, NULL},
+	 { "CdiGrid_name_get", _wrap_CdiGrid_name_get, METH_O, NULL},
+	 { "CdiGrid_getValues", _wrap_CdiGrid_getValues, METH_O, NULL},
+	 { "CdiGrid_getBounds", _wrap_CdiGrid_getBounds, METH_O, NULL},
+	 { "CdiGrid_getValuesAsPointer", _wrap_CdiGrid_getValuesAsPointer, METH_VARARGS, NULL},
+	 { "CdiGrid_getBoundsAsPointer", _wrap_CdiGrid_getBoundsAsPointer, METH_VARARGS, NULL},
+	 { "CdiGrid_getFloatVals", _wrap_CdiGrid_getFloatVals, METH_VARARGS, NULL},
+	 { "CdiGrid_getFloatBounds", _wrap_CdiGrid_getFloatBounds, METH_VARARGS, NULL},
+	 { "CdiGrid_swigregister", CdiGrid_swigregister, METH_O, NULL},
+	 { "CdiGrid_swiginit", CdiGrid_swiginit, METH_VARARGS, NULL},
+	 { "new_CdiTaxis", _wrap_new_CdiTaxis, METH_VARARGS, NULL},
+	 { "delete_CdiTaxis", _wrap_delete_CdiTaxis, METH_O, NULL},
+	 { "CdiTaxis_taxisID_set", _wrap_CdiTaxis_taxisID_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_taxisID_get", _wrap_CdiTaxis_taxisID_get, METH_O, NULL},
+	 { "CdiTaxis_ntsteps_set", _wrap_CdiTaxis_ntsteps_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_ntsteps_get", _wrap_CdiTaxis_ntsteps_get, METH_O, NULL},
+	 { "CdiTaxis_unit_set", _wrap_CdiTaxis_unit_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_unit_get", _wrap_CdiTaxis_unit_get, METH_O, NULL},
+	 { "CdiTaxis_rdate_set", _wrap_CdiTaxis_rdate_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_rdate_get", _wrap_CdiTaxis_rdate_get, METH_O, NULL},
+	 { "CdiTaxis_rtime_set", _wrap_CdiTaxis_rtime_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_rtime_get", _wrap_CdiTaxis_rtime_get, METH_O, NULL},
+	 { "CdiTaxis_vdate_set", _wrap_CdiTaxis_vdate_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_vdate_get", _wrap_CdiTaxis_vdate_get, METH_O, NULL},
+	 { "CdiTaxis_vtime_set", _wrap_CdiTaxis_vtime_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_vtime_get", _wrap_CdiTaxis_vtime_get, METH_O, NULL},
+	 { "CdiTaxis_type_set", _wrap_CdiTaxis_type_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_type_get", _wrap_CdiTaxis_type_get, METH_O, NULL},
+	 { "CdiTaxis_calendar_set", _wrap_CdiTaxis_calendar_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_calendar_get", _wrap_CdiTaxis_calendar_get, METH_O, NULL},
+	 { "CdiTaxis_hasBounds_set", _wrap_CdiTaxis_hasBounds_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_hasBounds_get", _wrap_CdiTaxis_hasBounds_get, METH_O, NULL},
+	 { "CdiTaxis_name_set", _wrap_CdiTaxis_name_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_name_get", _wrap_CdiTaxis_name_get, METH_O, NULL},
+	 { "CdiTaxis_unitname_set", _wrap_CdiTaxis_unitname_set, METH_VARARGS, NULL},
+	 { "CdiTaxis_unitname_get", _wrap_CdiTaxis_unitname_get, METH_O, NULL},
+	 { "CdiTaxis_swigregister", CdiTaxis_swigregister, METH_O, NULL},
+	 { "CdiTaxis_swiginit", CdiTaxis_swiginit, METH_VARARGS, NULL},
+	 { "new_CdiZaxis", _wrap_new_CdiZaxis, METH_VARARGS, NULL},
+	 { "delete_CdiZaxis", _wrap_delete_CdiZaxis, METH_O, NULL},
+	 { "CdiZaxis_zaxisID_set", _wrap_CdiZaxis_zaxisID_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_zaxisID_get", _wrap_CdiZaxis_zaxisID_get, METH_O, NULL},
+	 { "CdiZaxis_type_set", _wrap_CdiZaxis_type_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_type_get", _wrap_CdiZaxis_type_get, METH_O, NULL},
+	 { "CdiZaxis_ltype_set", _wrap_CdiZaxis_ltype_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_ltype_get", _wrap_CdiZaxis_ltype_get, METH_O, NULL},
+	 { "CdiZaxis_size_set", _wrap_CdiZaxis_size_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_size_get", _wrap_CdiZaxis_size_get, METH_O, NULL},
+	 { "CdiZaxis_prec_set", _wrap_CdiZaxis_prec_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_prec_get", _wrap_CdiZaxis_prec_get, METH_O, NULL},
+	 { "CdiZaxis_plevels_set", _wrap_CdiZaxis_plevels_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_plevels_get", _wrap_CdiZaxis_plevels_get, METH_O, NULL},
+	 { "CdiZaxis_plbounds_set", _wrap_CdiZaxis_plbounds_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_plbounds_get", _wrap_CdiZaxis_plbounds_get, METH_O, NULL},
+	 { "CdiZaxis_pubounds_set", _wrap_CdiZaxis_pubounds_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_pubounds_get", _wrap_CdiZaxis_pubounds_get, METH_O, NULL},
+	 { "CdiZaxis_pweights_set", _wrap_CdiZaxis_pweights_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_pweights_get", _wrap_CdiZaxis_pweights_get, METH_O, NULL},
+	 { "CdiZaxis_levels_set", _wrap_CdiZaxis_levels_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_levels_get", _wrap_CdiZaxis_levels_get, METH_O, NULL},
+	 { "CdiZaxis_lbounds_set", _wrap_CdiZaxis_lbounds_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_lbounds_get", _wrap_CdiZaxis_lbounds_get, METH_O, NULL},
+	 { "CdiZaxis_ubounds_set", _wrap_CdiZaxis_ubounds_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_ubounds_get", _wrap_CdiZaxis_ubounds_get, METH_O, NULL},
+	 { "CdiZaxis_weights_set", _wrap_CdiZaxis_weights_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_weights_get", _wrap_CdiZaxis_weights_get, METH_O, NULL},
+	 { "CdiZaxis_name_set", _wrap_CdiZaxis_name_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_name_get", _wrap_CdiZaxis_name_get, METH_O, NULL},
+	 { "CdiZaxis_longname_set", _wrap_CdiZaxis_longname_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_longname_get", _wrap_CdiZaxis_longname_get, METH_O, NULL},
+	 { "CdiZaxis_units_set", _wrap_CdiZaxis_units_set, METH_VARARGS, NULL},
+	 { "CdiZaxis_units_get", _wrap_CdiZaxis_units_get, METH_O, NULL},
+	 { "CdiZaxis_swigregister", CdiZaxis_swigregister, METH_O, NULL},
+	 { "CdiZaxis_swiginit", CdiZaxis_swiginit, METH_VARARGS, NULL},
+	 { "new_CdiVariable", _wrap_new_CdiVariable, METH_VARARGS, NULL},
+	 { "delete_CdiVariable", _wrap_delete_CdiVariable, METH_O, NULL},
+	 { "CdiVariable_varID_set", _wrap_CdiVariable_varID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_varID_get", _wrap_CdiVariable_varID_get, METH_O, NULL},
+	 { "CdiVariable_zaxisID_set", _wrap_CdiVariable_zaxisID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_zaxisID_get", _wrap_CdiVariable_zaxisID_get, METH_O, NULL},
+	 { "CdiVariable_gridID_set", _wrap_CdiVariable_gridID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_gridID_get", _wrap_CdiVariable_gridID_get, METH_O, NULL},
+	 { "CdiVariable_taxisID_set", _wrap_CdiVariable_taxisID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_taxisID_get", _wrap_CdiVariable_taxisID_get, METH_O, NULL},
+	 { "CdiVariable_timeID_set", _wrap_CdiVariable_timeID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_timeID_get", _wrap_CdiVariable_timeID_get, METH_O, NULL},
+	 { "CdiVariable_vlistID_set", _wrap_CdiVariable_vlistID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_vlistID_get", _wrap_CdiVariable_vlistID_get, METH_O, NULL},
+	 { "CdiVariable_size_set", _wrap_CdiVariable_size_set, METH_VARARGS, NULL},
+	 { "CdiVariable_size_get", _wrap_CdiVariable_size_get, METH_O, NULL},
+	 { "CdiVariable_code_set", _wrap_CdiVariable_code_set, METH_VARARGS, NULL},
+	 { "CdiVariable_code_get", _wrap_CdiVariable_code_get, METH_O, NULL},
+	 { "CdiVariable_datatype_set", _wrap_CdiVariable_datatype_set, METH_VARARGS, NULL},
+	 { "CdiVariable_datatype_get", _wrap_CdiVariable_datatype_get, METH_O, NULL},
+	 { "CdiVariable_streamID_set", _wrap_CdiVariable_streamID_set, METH_VARARGS, NULL},
+	 { "CdiVariable_streamID_get", _wrap_CdiVariable_streamID_get, METH_O, NULL},
+	 { "CdiVariable_name_set", _wrap_CdiVariable_name_set, METH_VARARGS, NULL},
+	 { "CdiVariable_name_get", _wrap_CdiVariable_name_get, METH_O, NULL},
+	 { "CdiVariable_longname_set", _wrap_CdiVariable_longname_set, METH_VARARGS, NULL},
+	 { "CdiVariable_longname_get", _wrap_CdiVariable_longname_get, METH_O, NULL},
+	 { "CdiVariable_units_set", _wrap_CdiVariable_units_set, METH_VARARGS, NULL},
+	 { "CdiVariable_units_get", _wrap_CdiVariable_units_get, METH_O, NULL},
+	 { "CdiVariable_stdname_set", _wrap_CdiVariable_stdname_set, METH_VARARGS, NULL},
+	 { "CdiVariable_stdname_get", _wrap_CdiVariable_stdname_get, METH_O, NULL},
+	 { "CdiVariable_missval_set", _wrap_CdiVariable_missval_set, METH_VARARGS, NULL},
+	 { "CdiVariable_missval_get", _wrap_CdiVariable_missval_get, METH_O, NULL},
+	 { "CdiVariable_values_set", _wrap_CdiVariable_values_set, METH_VARARGS, NULL},
+	 { "CdiVariable_values_get", _wrap_CdiVariable_values_get, METH_O, NULL},
+	 { "CdiVariable_valuesWithLevel_set", _wrap_CdiVariable_valuesWithLevel_set, METH_VARARGS, NULL},
+	 { "CdiVariable_valuesWithLevel_get", _wrap_CdiVariable_valuesWithLevel_get, METH_O, NULL},
+	 { "CdiVariable_grid_set", _wrap_CdiVariable_grid_set, METH_VARARGS, NULL},
+	 { "CdiVariable_grid_get", _wrap_CdiVariable_grid_get, METH_O, NULL},
+	 { "CdiVariable_zaxis_set", _wrap_CdiVariable_zaxis_set, METH_VARARGS, NULL},
+	 { "CdiVariable_zaxis_get", _wrap_CdiVariable_zaxis_get, METH_O, NULL},
+	 { "CdiVariable_taxis_set", _wrap_CdiVariable_taxis_set, METH_VARARGS, NULL},
+	 { "CdiVariable_taxis_get", _wrap_CdiVariable_taxis_get, METH_O, NULL},
+	 { "CdiVariable_sinfo", _wrap_CdiVariable_sinfo, METH_O, NULL},
+	 { "CdiVariable_getValues", _wrap_CdiVariable_getValues, METH_O, NULL},
+	 { "CdiVariable_getValuesWithLevel", _wrap_CdiVariable_getValuesWithLevel, METH_VARARGS, NULL},
+	 { "CdiVariable_getFValues", _wrap_CdiVariable_getFValues, METH_O, NULL},
+	 { "CdiVariable_getFValuesWithLevel", _wrap_CdiVariable_getFValuesWithLevel, METH_VARARGS, NULL},
+	 { "CdiVariable_getValuesAsPointer", _wrap_CdiVariable_getValuesAsPointer, METH_O, NULL},
+	 { "CdiVariable_getValuesWithLevelAsPointer", _wrap_CdiVariable_getValuesWithLevelAsPointer, METH_VARARGS, NULL},
+	 { "CdiVariable_swigregister", CdiVariable_swigregister, METH_O, NULL},
+	 { "CdiVariable_swiginit", CdiVariable_swiginit, METH_VARARGS, NULL},
+	 { "new_Cdi", _wrap_new_Cdi, METH_O, NULL},
+	 { "delete_Cdi", _wrap_delete_Cdi, METH_O, NULL},
+	 { "Cdi_streamID_set", _wrap_Cdi_streamID_set, METH_VARARGS, NULL},
+	 { "Cdi_streamID_get", _wrap_Cdi_streamID_get, METH_O, NULL},
+	 { "Cdi_vlistID_set", _wrap_Cdi_vlistID_set, METH_VARARGS, NULL},
+	 { "Cdi_vlistID_get", _wrap_Cdi_vlistID_get, METH_O, NULL},
+	 { "Cdi_nvars_set", _wrap_Cdi_nvars_set, METH_VARARGS, NULL},
+	 { "Cdi_nvars_get", _wrap_Cdi_nvars_get, METH_O, NULL},
+	 { "Cdi_nzaxes_set", _wrap_Cdi_nzaxes_set, METH_VARARGS, NULL},
+	 { "Cdi_nzaxes_get", _wrap_Cdi_nzaxes_get, METH_O, NULL},
+	 { "Cdi_ngrids_set", _wrap_Cdi_ngrids_set, METH_VARARGS, NULL},
+	 { "Cdi_ngrids_get", _wrap_Cdi_ngrids_get, METH_O, NULL},
+	 { "Cdi_ntaxes_set", _wrap_Cdi_ntaxes_set, METH_VARARGS, NULL},
+	 { "Cdi_ntaxes_get", _wrap_Cdi_ntaxes_get, METH_O, NULL},
+	 { "Cdi_taxisID_set", _wrap_Cdi_taxisID_set, METH_VARARGS, NULL},
+	 { "Cdi_taxisID_get", _wrap_Cdi_taxisID_get, METH_O, NULL},
+	 { "Cdi_varnames_set", _wrap_Cdi_varnames_set, METH_VARARGS, NULL},
+	 { "Cdi_varnames_get", _wrap_Cdi_varnames_get, METH_O, NULL},
+	 { "Cdi_codes_set", _wrap_Cdi_codes_set, METH_VARARGS, NULL},
+	 { "Cdi_codes_get", _wrap_Cdi_codes_get, METH_O, NULL},
+	 { "Cdi_variables_set", _wrap_Cdi_variables_set, METH_VARARGS, NULL},
+	 { "Cdi_variables_get", _wrap_Cdi_variables_get, METH_O, NULL},
+	 { "Cdi_var_set", _wrap_Cdi_var_set, METH_VARARGS, NULL},
+	 { "Cdi_var_get", _wrap_Cdi_var_get, METH_O, NULL},
+	 { "Cdi_varByCode_set", _wrap_Cdi_varByCode_set, METH_VARARGS, NULL},
+	 { "Cdi_varByCode_get", _wrap_Cdi_varByCode_get, METH_O, NULL},
+	 { "Cdi_taxes_set", _wrap_Cdi_taxes_set, METH_VARARGS, NULL},
+	 { "Cdi_taxes_get", _wrap_Cdi_taxes_get, METH_O, NULL},
+	 { "Cdi_zaxes_set", _wrap_Cdi_zaxes_set, METH_VARARGS, NULL},
+	 { "Cdi_zaxes_get", _wrap_Cdi_zaxes_get, METH_O, NULL},
+	 { "Cdi_grids_set", _wrap_Cdi_grids_set, METH_VARARGS, NULL},
+	 { "Cdi_grids_get", _wrap_Cdi_grids_get, METH_O, NULL},
+	 { "Cdi_griddes", _wrap_Cdi_griddes, METH_O, NULL},
+	 { "Cdi_swigregister", Cdi_swigregister, METH_O, NULL},
+	 { "Cdi_swiginit", Cdi_swiginit, METH_VARARGS, NULL},
+	 { NULL, NULL, 0, NULL }
+};
+
+static PyMethodDef SwigMethods_proxydocs[] = {
+	 { NULL, NULL, 0, NULL }
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static swig_type_info _swigt__p_Cdi = {"_p_Cdi", "Cdi *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiGrid = {"_p_CdiGrid", "std::map< int,CdiGrid >::mapped_type *|CdiGrid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiTaxis = {"_p_CdiTaxis", "std::map< int,CdiTaxis >::mapped_type *|CdiTaxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiVariable = {"_p_CdiVariable", "std::map< std::string,CdiVariable >::mapped_type *|std::vector< CdiVariable >::value_type *|std::map< int,CdiVariable >::mapped_type *|CdiVariable *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiZaxis = {"_p_CdiZaxis", "std::map< int,CdiZaxis >::mapped_type *|CdiZaxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_float = {"_p_float", "float *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_key_type = {"_p_key_type", "key_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_mapped_type = {"_p_mapped_type", "mapped_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_PyObject = {"_p_p_PyObject", "PyObject **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_double = {"_p_p_double", "double **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_CdiVariable_t = {"_p_std__allocatorT_CdiVariable_t", "std::vector< CdiVariable >::allocator_type *|std::allocator< CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t", "std::map< int,CdiGrid >::allocator_type *|std::allocator< std::pair< int const,CdiGrid > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t", "std::map< int,CdiTaxis >::allocator_type *|std::allocator< std::pair< int const,CdiTaxis > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t", "std::map< int,CdiVariable >::allocator_type *|std::allocator< std::pair< int const,CdiVariable > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t", "std::map< int,CdiZaxis >::allocator_type *|std::allocator< std::pair< int const,CdiZaxis > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t", "std::allocator< std::pair< std::string const,CdiVariable > > *|std::map< std::string,CdiVariable >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__lessT_int_t = {"_p_std__lessT_int_t", "std::less< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t", "std::map< int,CdiGrid > *|std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t", "std::map< int,CdiTaxis > *|std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *|std::map< int,CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t", "std::map< int,CdiZaxis > *|std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *|std::map< std::string,CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t = {"_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t", "std::vector< CdiVariable,std::allocator< CdiVariable > > *|std::vector< CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_float_std__allocatorT_float_t_t = {"_p_std__vectorT_float_std__allocatorT_float_t_t", "std::vector< float,std::allocator< float > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t = {"_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t", "std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_Cdi,
+  &_swigt__p_CdiGrid,
+  &_swigt__p_CdiTaxis,
+  &_swigt__p_CdiVariable,
+  &_swigt__p_CdiZaxis,
+  &_swigt__p_allocator_type,
+  &_swigt__p_char,
+  &_swigt__p_difference_type,
+  &_swigt__p_double,
+  &_swigt__p_float,
+  &_swigt__p_key_type,
+  &_swigt__p_mapped_type,
+  &_swigt__p_p_PyObject,
+  &_swigt__p_p_double,
+  &_swigt__p_size_type,
+  &_swigt__p_std__allocatorT_CdiVariable_t,
+  &_swigt__p_std__allocatorT_double_t,
+  &_swigt__p_std__allocatorT_int_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t,
+  &_swigt__p_std__allocatorT_std__string_t,
+  &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  &_swigt__p_std__invalid_argument,
+  &_swigt__p_std__lessT_int_t,
+  &_swigt__p_std__lessT_std__string_t,
+  &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,
+  &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,
+  &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,
+  &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,
+  &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,
+  &_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,
+  &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
+  &_swigt__p_std__vectorT_float_std__allocatorT_float_t_t,
+  &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
+  &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t,
+  &_swigt__p_swig__SwigPyIterator,
+  &_swigt__p_value_type,
+};
+
+static swig_cast_info _swigc__p_Cdi[] = {  {&_swigt__p_Cdi, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiGrid[] = {  {&_swigt__p_CdiGrid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiTaxis[] = {  {&_swigt__p_CdiTaxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiVariable[] = {  {&_swigt__p_CdiVariable, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiZaxis[] = {  {&_swigt__p_CdiZaxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_float[] = {  {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_key_type[] = {  {&_swigt__p_key_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_mapped_type[] = {  {&_swigt__p_mapped_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_PyObject[] = {  {&_swigt__p_p_PyObject, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_double[] = {  {&_swigt__p_p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_size_type[] = {  {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_CdiVariable_t[] = {  {&_swigt__p_std__allocatorT_CdiVariable_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_double_t[] = {  {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_int_t[] = {  {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__lessT_int_t[] = {  {&_swigt__p_std__lessT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__lessT_std__string_t[] = {  {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t[] = {  {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t[] = {  {&_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_float_std__allocatorT_float_t_t[] = {  {&_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = {  {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__SwigPyIterator[] = {  {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_Cdi,
+  _swigc__p_CdiGrid,
+  _swigc__p_CdiTaxis,
+  _swigc__p_CdiVariable,
+  _swigc__p_CdiZaxis,
+  _swigc__p_allocator_type,
+  _swigc__p_char,
+  _swigc__p_difference_type,
+  _swigc__p_double,
+  _swigc__p_float,
+  _swigc__p_key_type,
+  _swigc__p_mapped_type,
+  _swigc__p_p_PyObject,
+  _swigc__p_p_double,
+  _swigc__p_size_type,
+  _swigc__p_std__allocatorT_CdiVariable_t,
+  _swigc__p_std__allocatorT_double_t,
+  _swigc__p_std__allocatorT_int_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t,
+  _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t,
+  _swigc__p_std__allocatorT_std__string_t,
+  _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  _swigc__p_std__invalid_argument,
+  _swigc__p_std__lessT_int_t,
+  _swigc__p_std__lessT_std__string_t,
+  _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,
+  _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,
+  _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,
+  _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,
+  _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,
+  _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,
+  _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
+  _swigc__p_std__vectorT_float_std__allocatorT_float_t_t,
+  _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
+  _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t,
+  _swigc__p_swig__SwigPyIterator,
+  _swigc__p_value_type,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0, 0, 0, 0.0, 0, 0}};
+
+#ifdef __cplusplus
+}
+#endif
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned statically to an initial
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded.
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int init;
+  
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+  
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        /* Our module is already in the list, so there's nothing more to do. */
+        return;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+    
+    /* otherwise we must add our module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+  
+  /* When multiple interpreters are used, a module could have already been initialized in
+       a different interpreter, but not yet have a pointer in this interpreter.
+       In this case, we do not want to continue adding types... everything should be
+       set up already */
+  if (init == 0) return;
+  
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+    
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name);
+#endif
+    
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+        type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+    
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+        if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+          cast->type = ret;
+          ret = 0;
+        } else {
+          /* Check for casting already in the list */
+          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+          if (!ocast) ret = 0;
+        }
+      }
+      
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+  
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+    printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+  
+  if (init_run) return;
+  init_run = 1;
+  
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{
+  /* c-mode */
+#endif
+}
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+  /* Python-specific SWIG API */
+#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
+  
+  /* -----------------------------------------------------------------------------
+   * global variable support code.
+   * ----------------------------------------------------------------------------- */
+  
+  typedef struct swig_globalvar {
+    char       *name;                  /* Name of global variable */
+    PyObject *(*get_attr)(void);       /* Return the current value */
+    int       (*set_attr)(PyObject *); /* Set the value */
+    struct swig_globalvar *next;
+  } swig_globalvar;
+  
+  typedef struct swig_varlinkobject {
+    PyObject_HEAD
+    swig_globalvar *vars;
+  } swig_varlinkobject;
+  
+  SWIGINTERN PyObject *
+  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_InternFromString("<Swig global variables>");
+#else
+    return PyString_FromString("<Swig global variables>");
+#endif
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_str(swig_varlinkobject *v) {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *str = PyUnicode_InternFromString("(");
+    PyObject *tail;
+    PyObject *joined;
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      tail = PyUnicode_FromString(var->name);
+      joined = PyUnicode_Concat(str, tail);
+      Py_DecRef(str);
+      Py_DecRef(tail);
+      str = joined;
+      if (var->next) {
+        tail = PyUnicode_InternFromString(", ");
+        joined = PyUnicode_Concat(str, tail);
+        Py_DecRef(str);
+        Py_DecRef(tail);
+        str = joined;
+      }
+    }
+    tail = PyUnicode_InternFromString(")");
+    joined = PyUnicode_Concat(str, tail);
+    Py_DecRef(str);
+    Py_DecRef(tail);
+    str = joined;
+#else
+    PyObject *str = PyString_FromString("(");
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+    }
+    PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+    return str;
+  }
+  
+  SWIGINTERN void
+  swig_varlink_dealloc(swig_varlinkobject *v) {
+    swig_globalvar *var = v->vars;
+    while (var) {
+      swig_globalvar *n = var->next;
+      free(var->name);
+      free(var);
+      var = n;
+    }
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+    PyObject *res = NULL;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->get_attr)();
+        break;
+      }
+      var = var->next;
+    }
+    if (res == NULL && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+    int res = 1;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->set_attr)(p);
+        break;
+      }
+      var = var->next;
+    }
+    if (res == 1 && !PyErr_Occurred()) {
+      PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n);
+    }
+    return res;
+  }
+  
+  SWIGINTERN PyTypeObject*
+  swig_varlink_type(void) {
+    static char varlink__doc__[] = "Swig var link object";
+    static PyTypeObject varlink_type;
+    static int type_init = 0;
+    if (!type_init) {
+      const PyTypeObject tmp = {
+#if PY_VERSION_HEX >= 0x03000000
+        PyVarObject_HEAD_INIT(NULL, 0)
+#else
+        PyObject_HEAD_INIT(NULL)
+        0,                                  /* ob_size */
+#endif
+        "swigvarlink",                      /* tp_name */
+        sizeof(swig_varlinkobject),         /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        (destructor) swig_varlink_dealloc,  /* tp_dealloc */
+        0,                                  /* tp_print */
+        (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+        (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+        0,                                  /* tp_compare */
+        (reprfunc) swig_varlink_repr,       /* tp_repr */
+        0,                                  /* tp_as_number */
+        0,                                  /* tp_as_sequence */
+        0,                                  /* tp_as_mapping */
+        0,                                  /* tp_hash */
+        0,                                  /* tp_call */
+        (reprfunc) swig_varlink_str,        /* tp_str */
+        0,                                  /* tp_getattro */
+        0,                                  /* tp_setattro */
+        0,                                  /* tp_as_buffer */
+        0,                                  /* tp_flags */
+        varlink__doc__,                     /* tp_doc */
+        0,                                  /* tp_traverse */
+        0,                                  /* tp_clear */
+        0,                                  /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+        0,                                  /* tp_del */
+        0,                                  /* tp_version_tag */
+#if PY_VERSION_HEX >= 0x03040000
+        0,                                  /* tp_finalize */
+#endif
+#if PY_VERSION_HEX >= 0x03080000
+        0,                                  /* tp_vectorcall */
+#endif
+#if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000)
+        0,                                  /* tp_print */
+#endif
+#ifdef COUNT_ALLOCS
+        0,                                  /* tp_allocs */
+        0,                                  /* tp_frees */
+        0,                                  /* tp_maxalloc */
+        0,                                  /* tp_prev */
+        0                                   /* tp_next */
+#endif
+      };
+      varlink_type = tmp;
+      type_init = 1;
+      if (PyType_Ready(&varlink_type) < 0)
+      return NULL;
+    }
+    return &varlink_type;
+  }
+  
+  /* Create a variable linking object for use later */
+  SWIGINTERN PyObject *
+  SWIG_Python_newvarlink(void) {
+    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
+    if (result) {
+      result->vars = 0;
+    }
+    return ((PyObject*) result);
+  }
+  
+  SWIGINTERN void 
+  SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+    swig_varlinkobject *v = (swig_varlinkobject *) p;
+    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+    if (gv) {
+      size_t size = strlen(name)+1;
+      gv->name = (char *)malloc(size);
+      if (gv->name) {
+        memcpy(gv->name, name, size);
+        gv->get_attr = get_attr;
+        gv->set_attr = set_attr;
+        gv->next = v->vars;
+      }
+    }
+    v->vars = gv;
+  }
+  
+  SWIGINTERN PyObject *
+  SWIG_globals(void) {
+    static PyObject *globals = 0;
+    if (!globals) {
+      globals = SWIG_newvarlink();
+    }
+    return globals;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * constants/methods manipulation
+   * ----------------------------------------------------------------------------- */
+  
+  /* Install Constants */
+  SWIGINTERN void
+  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+    PyObject *obj = 0;
+    size_t i;
+    for (i = 0; constants[i].type; ++i) {
+      switch(constants[i].type) {
+      case SWIG_PY_POINTER:
+        obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+        break;
+      case SWIG_PY_BINARY:
+        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+        break;
+      default:
+        obj = 0;
+        break;
+      }
+      if (obj) {
+        PyDict_SetItemString(d, constants[i].name, obj);
+        Py_DECREF(obj);
+      }
+    }
+  }
+  
+  /* -----------------------------------------------------------------------------*/
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  /* -----------------------------------------------------------------------------*/
+  
+  SWIGINTERN void
+  SWIG_Python_FixMethods(PyMethodDef *methods,
+    swig_const_info *const_table,
+    swig_type_info **types,
+    swig_type_info **types_initial) {
+    size_t i;
+    for (i = 0; methods[i].ml_name; ++i) {
+      const char *c = methods[i].ml_doc;
+      if (!c) continue;
+      c = strstr(c, "swig_ptr: ");
+      if (c) {
+        int j;
+        swig_const_info *ci = 0;
+        const char *name = c + 10;
+        for (j = 0; const_table[j].type; ++j) {
+          if (strncmp(const_table[j].name, name, 
+              strlen(const_table[j].name)) == 0) {
+            ci = &(const_table[j]);
+            break;
+          }
+        }
+        if (ci) {
+          void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
+          if (ptr) {
+            size_t shift = (ci->ptype) - types;
+            swig_type_info *ty = types_initial[shift];
+            size_t ldoc = (c - methods[i].ml_doc);
+            size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
+            char *ndoc = (char*)malloc(ldoc + lptr + 10);
+            if (ndoc) {
+              char *buff = ndoc;
+              memcpy(buff, methods[i].ml_doc, ldoc);
+              buff += ldoc;
+              memcpy(buff, "swig_ptr: ", 10);
+              buff += 10;
+              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+              methods[i].ml_doc = ndoc;
+            }
+          }
+        }
+      }
+    }
+  } 
+  
+  /* -----------------------------------------------------------------------------
+   * Method creation and docstring support functions
+   * ----------------------------------------------------------------------------- */
+  
+  /* -----------------------------------------------------------------------------
+   * Function to find the method definition with the correct docstring for the
+   * proxy module as opposed to the low-level API
+   * ----------------------------------------------------------------------------- */
+  
+  SWIGINTERN PyMethodDef *SWIG_PythonGetProxyDoc(const char *name) {
+    /* Find the function in the modified method table */
+    size_t offset = 0;
+    int found = 0;
+    while (SwigMethods_proxydocs[offset].ml_meth != NULL) {
+      if (strcmp(SwigMethods_proxydocs[offset].ml_name, name) == 0) {
+        found = 1;
+        break;
+      }
+      offset++;
+    }
+    /* Use the copy with the modified docstring if available */
+    return found ? &SwigMethods_proxydocs[offset] : NULL;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * Wrapper of PyInstanceMethod_New() used in Python 3
+   * It is exported to the generated module, used for -fastproxy
+   * ----------------------------------------------------------------------------- */
+  
+  SWIGINTERN PyObject *SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) {
+    if (PyCFunction_Check(func)) {
+      PyCFunctionObject *funcobj = (PyCFunctionObject *)func;
+      PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name);
+      if (ml)
+      func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module);
+    }
+#if PY_VERSION_HEX >= 0x03000000
+    return PyInstanceMethod_New(func);
+#else
+    return PyMethod_New(func, NULL, NULL);
+#endif
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * Wrapper of PyStaticMethod_New()
+   * It is exported to the generated module, used for -fastproxy
+   * ----------------------------------------------------------------------------- */
+  
+  SWIGINTERN PyObject *SWIG_PyStaticMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) {
+    if (PyCFunction_Check(func)) {
+      PyCFunctionObject *funcobj = (PyCFunctionObject *)func;
+      PyMethodDef *ml = SWIG_PythonGetProxyDoc(funcobj->m_ml->ml_name);
+      if (ml)
+      func = PyCFunction_NewEx(ml, funcobj->m_self, funcobj->m_module);
+    }
+    return PyStaticMethod_New(func);
+  }
+  
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------*
+ *  Partial Init method
+ * -----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+SWIGEXPORT 
+#if PY_VERSION_HEX >= 0x03000000
+PyObject*
+#else
+void
+#endif
+SWIG_init(void) {
+  PyObject *m, *d, *md, *globals;
+  
+#if PY_VERSION_HEX >= 0x03000000
+  static struct PyModuleDef SWIG_module = {
+    PyModuleDef_HEAD_INIT,
+    SWIG_name,
+    NULL,
+    -1,
+    SwigMethods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+#endif
+  
+#if defined(SWIGPYTHON_BUILTIN)
+  static SwigPyClientData SwigPyObject_clientdata = {
+    0, 0, 0, 0, 0, 0, 0
+  };
+  static PyGetSetDef this_getset_def = {
+    (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+  };
+  static SwigPyGetSet thisown_getset_closure = {
+    SwigPyObject_own,
+    SwigPyObject_own
+  };
+  static PyGetSetDef thisown_getset_def = {
+    (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+  };
+  PyTypeObject *builtin_pytype;
+  int builtin_base_count;
+  swig_type_info *builtin_basetype;
+  PyObject *tuple;
+  PyGetSetDescrObject *static_getset;
+  PyTypeObject *metatype;
+  PyTypeObject *swigpyobject;
+  SwigPyClientData *cd;
+  PyObject *public_interface, *public_symbol;
+  PyObject *this_descr;
+  PyObject *thisown_descr;
+  PyObject *self = 0;
+  int i;
+  
+  (void)builtin_pytype;
+  (void)builtin_base_count;
+  (void)builtin_basetype;
+  (void)tuple;
+  (void)static_getset;
+  (void)self;
+  
+  /* Metaclass is used to implement static member variables */
+  metatype = SwigPyObjectType();
+  assert(metatype);
+#endif
+  
+  (void)globals;
+  
+  /* Create singletons now to avoid potential deadlocks with multi-threaded usage after module initialization */
+  SWIG_This();
+  SWIG_Python_TypeCache();
+  SwigPyPacked_type();
+#ifndef SWIGPYTHON_BUILTIN
+  SwigPyObject_type();
+#endif
+  
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
+  
+#if PY_VERSION_HEX >= 0x03000000
+  m = PyModule_Create(&SWIG_module);
+#else
+  m = Py_InitModule(SWIG_name, SwigMethods);
+#endif
+  
+  md = d = PyModule_GetDict(m);
+  (void)md;
+  
+  SWIG_InitializeModule(0);
+  
+#ifdef SWIGPYTHON_BUILTIN
+  swigpyobject = SwigPyObject_TypeOnce();
+  
+  SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
+  assert(SwigPyObject_stype);
+  cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+  if (!cd) {
+    SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
+    SwigPyObject_clientdata.pytype = swigpyobject;
+  } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) {
+    PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
+# if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+# else
+    return;
+# endif
+  }
+  
+  /* All objects have a 'this' attribute */
+  this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def);
+  (void)this_descr;
+  
+  /* All objects have a 'thisown' attribute */
+  thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def);
+  (void)thisown_descr;
+  
+  public_interface = PyList_New(0);
+  public_symbol = 0;
+  (void)public_symbol;
+  
+  PyDict_SetItemString(md, "__all__", public_interface);
+  Py_DECREF(public_interface);
+  for (i = 0; SwigMethods[i].ml_name != NULL; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name);
+  for (i = 0; swig_const_table[i].name != 0; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name);
+#endif
+  
+  SWIG_InstallConstants(d,swig_const_table);
+  
+  
+  // thread safe initialization
+  swig::container_owner_attribute();
+  
+#if PY_VERSION_HEX >= 0x03000000
+  return m;
+#else
+  return;
+#endif
+}
+
diff --git a/interfaces/ruby/cdi_wrapper.cpp b/interfaces/ruby/cdi_wrapper.cpp
new file mode 100644
index 000000000..01246936d
--- /dev/null
+++ b/interfaces/ruby/cdi_wrapper.cpp
@@ -0,0 +1,33805 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 4.0.2
+ *
+ * This file is not intended to be easily readable and contains a number of
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG
+ * interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+
+#ifndef SWIGRUBY
+#define SWIGRUBY
+#endif
+
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__))
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__))
+# else
+#   define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if defined(__GNUC__)
+#  if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#    ifndef GCC_HASCLASSVISIBILITY
+#      define GCC_HASCLASSVISIBILITY
+#    endif
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__))
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__))
+# else
+#   define SWIGUNUSED
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if defined(__GNUC__)
+#  if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#    ifndef GCC_HASCLASSVISIBILITY
+#      define GCC_HASCLASSVISIBILITY
+#    endif
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */
+#if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES)
+# define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
+#endif
+
+/* Intel's compiler complains if a variable which was never initialised is
+ * cast to void, which is a common idiom which we use to indicate that we
+ * are aware a variable isn't used.  So we just silence that warning.
+ * See: https://github.com/swig/swig/issues/192 for more discussion.
+ */
+#ifdef __INTEL_COMPILER
+# pragma warning disable 592
+#endif
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+#define SWIG_POINTER_NO_NULL       0x4
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/*
+   Flags/methods for returning states.
+
+   The SWIG conversion methods, as ConvertPtr, return an integer
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+
+   Use the following macros/flags to set or process the returning
+   states.
+
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {
+        if (<obj is ok>) {
+          if (<need new object>) {
+            *ptr = <ptr to new allocated object>;
+            return SWIG_NEWOBJ;
+          } else {
+            *ptr = <ptr to old object>;
+            return SWIG_OLDOBJ;
+          }
+        } else {
+          return SWIG_BADOBJ;
+        }
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0)
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) {
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) {
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0;
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast(r) (r)
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/*
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCmp(const char *nb, const char *tb) {
+  int equiv = 1;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (equiv != 0 && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = SWIG_TypeNameComp(nb, ne, tb, te);
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0;
+}
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/*
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/*
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start,
+                            swig_module_info *end,
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      size_t l = 0;
+      size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	size_t i = (l + r) >> 1;
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  int compare = strcmp(name, iname);
+	  if (compare == 0) {
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+
+  We start searching at module start, and finish searching when start == end.
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start,
+                     swig_module_info *end,
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+
+  /* neither found a match */
+  return 0;
+}
+
+/*
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  const unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/*
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  unsigned char *u = (unsigned char *) ptr;
+  const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    char d = *(c++);
+    unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = (unsigned char)((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = (unsigned char)((d - ('a'-10)) << 4);
+    else
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (unsigned char)(d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (unsigned char)(d - ('a'-10));
+    else
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/*
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1
+#define  SWIG_IOError        	   -2
+#define  SWIG_RuntimeError   	   -3
+#define  SWIG_IndexError     	   -4
+#define  SWIG_TypeError      	   -5
+#define  SWIG_DivisionByZero 	   -6
+#define  SWIG_OverflowError  	   -7
+#define  SWIG_SyntaxError    	   -8
+#define  SWIG_ValueError     	   -9
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12
+#define  SWIG_NullReferenceError   -13
+
+
+
+#include <ruby.h>
+
+/* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which
+ * breaks using rb_intern as an lvalue, as SWIG does.  We work around this
+ * issue for now by disabling this.
+ * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645
+ */
+#ifdef rb_intern
+# undef rb_intern
+#endif
+
+/* Remove global macros defined in Ruby's win32.h */
+#ifdef write
+# undef write
+#endif
+#ifdef read
+# undef read
+#endif
+#ifdef bind
+# undef bind
+#endif
+#ifdef close
+# undef close
+#endif
+#ifdef connect
+# undef connect
+#endif
+
+
+/* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */
+#ifndef NUM2LL
+#define NUM2LL(x) NUM2LONG((x))
+#endif
+#ifndef LL2NUM
+#define LL2NUM(x) INT2NUM((long) (x))
+#endif
+#ifndef ULL2NUM
+#define ULL2NUM(x) UINT2NUM((unsigned long) (x))
+#endif
+
+/* Ruby 1.7 doesn't (yet) define NUM2ULL() */
+#ifndef NUM2ULL
+#ifdef HAVE_LONG_LONG
+#define NUM2ULL(x) rb_num2ull((x))
+#else
+#define NUM2ULL(x) NUM2ULONG(x)
+#endif
+#endif
+
+/* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */
+/* Define these for older versions so we can just write code the new way */
+#ifndef RSTRING_LEN
+# define RSTRING_LEN(x) RSTRING(x)->len
+#endif
+#ifndef RSTRING_PTR
+# define RSTRING_PTR(x) RSTRING(x)->ptr
+#endif
+#ifndef RSTRING_END
+# define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x))
+#endif
+#ifndef RARRAY_LEN
+# define RARRAY_LEN(x) RARRAY(x)->len
+#endif
+#ifndef RARRAY_PTR
+# define RARRAY_PTR(x) RARRAY(x)->ptr
+#endif
+#ifndef RFLOAT_VALUE
+# define RFLOAT_VALUE(x) RFLOAT(x)->value
+#endif
+#ifndef DOUBLE2NUM
+# define DOUBLE2NUM(x) rb_float_new(x)
+#endif
+#ifndef RHASH_TBL
+# define RHASH_TBL(x) (RHASH(x)->tbl)
+#endif
+#ifndef RHASH_ITER_LEV
+# define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev)
+#endif
+#ifndef RHASH_IFNONE
+# define RHASH_IFNONE(x) (RHASH(x)->ifnone)
+#endif
+#ifndef RHASH_SIZE
+# define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries)
+#endif
+#ifndef RHASH_EMPTY_P
+# define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0)
+#endif
+#ifndef RSTRUCT_LEN
+# define RSTRUCT_LEN(x) RSTRUCT(x)->len
+#endif
+#ifndef RSTRUCT_PTR
+# define RSTRUCT_PTR(x) RSTRUCT(x)->ptr
+#endif
+#ifndef RTYPEDDATA_P
+# define RTYPEDDATA_P(x) (TYPE(x) != T_DATA)
+#endif
+
+
+
+/*
+ * The following macros are used for providing the correct type of a
+ * function pointer to the Ruby C API.
+ * Starting with Ruby 2.7 (corresponding to RB_METHOD_DEFINITION_DECL being
+ * defined) these macros act transparently due to Ruby's moving away from
+ * ANYARGS and instead employing strict function signatures.
+ *
+ * Note: In case of C (not C++) the macros are transparent even before
+ * Ruby 2.7 due to the fact that the Ruby C API used function declarators
+ * with empty parentheses, which allows for an unspecified number of
+ * arguments.
+ *
+ * PROTECTFUNC(f) is used for the function pointer argument of the Ruby
+ * C API function rb_protect().
+ *
+ * VALUEFUNC(f) is used for the function pointer argument(s) of Ruby C API
+ * functions like rb_define_method() and rb_define_singleton_method().
+ *
+ * VOIDFUNC(f) is used to typecast a C function that implements either
+ * the "mark" or "free" stuff for a Ruby Data object, so that it can be
+ * passed as an argument to Ruby C API functions like Data_Wrap_Struct()
+ * and Data_Make_Struct().
+ *
+ * SWIG_RUBY_VOID_ANYARGS_FUNC(f) is used for the function pointer
+ * argument(s) of Ruby C API functions like rb_define_virtual_variable().
+ *
+ * SWIG_RUBY_INT_ANYARGS_FUNC(f) is used for the function pointer
+ * argument(s) of Ruby C API functions like st_foreach().
+ */
+#if defined(__cplusplus) && !defined(RB_METHOD_DEFINITION_DECL)
+#  define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f)
+#  define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f)
+#  define VOIDFUNC(f) ((RUBY_DATA_FUNC) f)
+#  define SWIG_RUBY_VOID_ANYARGS_FUNC(f) ((void (*)(ANYARGS))(f))
+#  define SWIG_RUBY_INT_ANYARGS_FUNC(f) ((int (*)(ANYARGS))(f))
+#else
+#  define PROTECTFUNC(f) (f)
+#  define VALUEFUNC(f) (f)
+#  define VOIDFUNC(f) (f)
+#  define SWIG_RUBY_VOID_ANYARGS_FUNC(f) (f)
+#  define SWIG_RUBY_INT_ANYARGS_FUNC(f) (f)
+#endif
+
+/* Don't use for expressions have side effect */
+#ifndef RB_STRING_VALUE
+#define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s)))
+#endif
+#ifndef StringValue
+#define StringValue(s) RB_STRING_VALUE(s)
+#endif
+#ifndef StringValuePtr
+#define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s))
+#endif
+#ifndef StringValueLen
+#define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s))
+#endif
+#ifndef SafeStringValue
+#define SafeStringValue(v) do {\
+    StringValue(v);\
+    rb_check_safe_str(v);\
+} while (0)
+#endif
+
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+#define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1)
+#define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new")
+#endif
+
+static VALUE _mSWIG = Qnil;
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+
+/* Define some additional error types */
+#define SWIG_ObjectPreviouslyDeletedError  -100
+
+
+/* Define custom exceptions for errors that do not map to existing Ruby
+   exceptions.  Note this only works for C++ since a global cannot be
+   initialized by a function in C.  For C, fallback to rb_eRuntimeError.*/
+
+SWIGINTERN VALUE 
+getNullReferenceError(void) {
+  static int init = 0;
+  static VALUE rb_eNullReferenceError ;
+  if (!init) {
+    init = 1;
+    rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError);
+  }
+  return rb_eNullReferenceError;
+} 
+
+SWIGINTERN VALUE 
+getObjectPreviouslyDeletedError(void) {
+  static int init = 0;
+  static VALUE rb_eObjectPreviouslyDeleted ;
+  if (!init) {
+    init = 1;
+    rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError);
+  }
+  return rb_eObjectPreviouslyDeleted;
+} 
+
+
+SWIGINTERN VALUE
+SWIG_Ruby_ErrorType(int SWIG_code) {
+  VALUE type;
+  switch (SWIG_code) {
+  case SWIG_MemoryError:
+    type = rb_eNoMemError;
+    break;
+  case SWIG_IOError:
+    type = rb_eIOError;
+    break;
+  case SWIG_RuntimeError:
+    type = rb_eRuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = rb_eIndexError;
+    break;
+  case SWIG_TypeError:
+    type = rb_eTypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = rb_eZeroDivError;
+    break;
+  case SWIG_OverflowError:
+    type = rb_eRangeError;
+    break;
+  case SWIG_SyntaxError:
+    type = rb_eSyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = rb_eArgError;
+    break;
+  case SWIG_SystemError:
+    type = rb_eFatal;
+    break;
+  case SWIG_AttributeError:
+    type = rb_eRuntimeError;
+    break;
+  case SWIG_NullReferenceError:
+    type = getNullReferenceError();
+    break;
+  case SWIG_ObjectPreviouslyDeletedError:
+    type = getObjectPreviouslyDeletedError();
+    break;
+  case SWIG_UnknownError:
+    type = rb_eRuntimeError;
+    break;
+  default:
+    type = rb_eRuntimeError;
+  }
+  return type;
+}
+
+
+/* This function is called when a user inputs a wrong argument to
+   a method.
+ */
+SWIGINTERN 
+const char* Ruby_Format_TypeError( const char* msg,
+				   const char* type, 
+				   const char* name, 
+				   const int argn,
+				   VALUE input )
+{
+  char buf[128];
+  VALUE str;
+  VALUE asStr;
+  if ( msg && *msg )
+    {
+      str = rb_str_new2(msg);
+    }
+  else
+    {
+      str = rb_str_new(NULL, 0);
+    }
+
+  str = rb_str_cat2( str, "Expected argument " );
+  sprintf( buf, "%d of type ", argn-1 );
+  str = rb_str_cat2( str, buf );
+  str = rb_str_cat2( str, type );
+  str = rb_str_cat2( str, ", but got " );
+  str = rb_str_cat2( str, rb_obj_classname(input) );
+  str = rb_str_cat2( str, " " );
+  asStr = rb_inspect(input);
+  if ( RSTRING_LEN(asStr) > 30 )
+    {
+      str = rb_str_cat( str, StringValuePtr(asStr), 30 );
+      str = rb_str_cat2( str, "..." );
+    }
+  else
+    {
+      str = rb_str_append( str, asStr );
+    }
+
+  if ( name )
+    {
+      str = rb_str_cat2( str, "\n\tin SWIG method '" );
+      str = rb_str_cat2( str, name );
+      str = rb_str_cat2( str, "'" );
+    }
+
+  return StringValuePtr( str );
+}
+
+/* This function is called when an overloaded method fails */
+SWIGINTERN 
+void Ruby_Format_OverloadedError(
+				 const int argc,
+				 const int maxargs,
+				 const char* method, 
+				 const char* prototypes 
+				 )
+{
+  const char* msg = "Wrong # of arguments";
+  if ( argc <= maxargs ) msg = "Wrong arguments";
+  rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n"  
+	   "Possible C/C++ prototypes are:\n%s",
+	   msg, method, prototypes);
+}
+
+/* -----------------------------------------------------------------------------
+ * rubytracking.swg
+ *
+ * This file contains support for tracking mappings from
+ * Ruby objects to C++ objects.  This functionality is needed
+ * to implement mark functions for Ruby's mark and sweep
+ * garbage collector.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if !defined(ST_DATA_T_DEFINED)
+/* Needs to be explicitly included for Ruby 1.8 and earlier */
+#include <st.h>
+#endif
+
+/* Ruby 1.8 actually assumes the first case. */
+#if SIZEOF_VOIDP == SIZEOF_LONG
+#  define SWIG2NUM(v) LONG2NUM((unsigned long)v)
+#  define NUM2SWIG(x) (unsigned long)NUM2LONG(x)
+#elif SIZEOF_VOIDP == SIZEOF_LONG_LONG
+#  define SWIG2NUM(v) LL2NUM((unsigned long long)v)
+#  define NUM2SWIG(x) (unsigned long long)NUM2LL(x)
+#else
+#  error sizeof(void*) is not the same as long or long long
+#endif
+
+/* Global hash table to store Trackings from C/C++
+   structs to Ruby Objects.
+*/
+static st_table* swig_ruby_trackings = NULL;
+
+static VALUE swig_ruby_trackings_count(ID id, VALUE *var) {
+  return SWIG2NUM(swig_ruby_trackings->num_entries);
+}
+
+
+/* Setup a hash table to store Trackings */
+SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) {
+  /* Create a hash table to store Trackings from C++
+     objects to Ruby objects. */
+
+  /* Try to see if some other .so has already created a
+     tracking hash table, which we keep hidden in an instance var
+     in the SWIG module.
+     This is done to allow multiple DSOs to share the same
+     tracking table.
+  */
+  VALUE trackings_value = Qnil;
+  /* change the variable name so that we can mix modules
+     compiled with older SWIG's - this used to be called "@__trackings__" */
+  ID trackings_id = rb_intern( "@__safetrackings__" );
+  VALUE verbose = rb_gv_get("VERBOSE");
+  rb_gv_set("VERBOSE", Qfalse);
+  trackings_value = rb_ivar_get( _mSWIG, trackings_id );
+  rb_gv_set("VERBOSE", verbose);
+
+  /* The trick here is that we have to store the hash table
+  pointer in a Ruby variable. We do not want Ruby's GC to
+  treat this pointer as a Ruby object, so we convert it to
+  a Ruby numeric value. */
+  if (trackings_value == Qnil) {
+    /* No, it hasn't.  Create one ourselves */
+    swig_ruby_trackings = st_init_numtable();
+    rb_ivar_set( _mSWIG, trackings_id, SWIG2NUM(swig_ruby_trackings) );
+  } else {
+    swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value);
+  }
+
+  rb_define_virtual_variable("SWIG_TRACKINGS_COUNT",
+                             VALUEFUNC(swig_ruby_trackings_count),
+                             SWIG_RUBY_VOID_ANYARGS_FUNC((rb_gvar_setter_t*)NULL));
+}
+
+/* Add a Tracking from a C/C++ struct to a Ruby object */
+SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) {
+  /* Store the mapping to the global hash table. */
+  st_insert(swig_ruby_trackings, (st_data_t)ptr, object);
+}
+
+/* Get the Ruby object that owns the specified C/C++ struct */
+SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) {
+  /* Now lookup the value stored in the global hash table */
+  VALUE value;
+
+  if (st_lookup(swig_ruby_trackings, (st_data_t)ptr, &value)) {
+    return value;
+  } else {
+    return Qnil;
+  }
+}
+
+/* Remove a Tracking from a C/C++ struct to a Ruby object.  It
+   is very important to remove objects once they are destroyed
+   since the same memory address may be reused later to create
+   a new object. */
+SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) {
+  /* Delete the object from the hash table */
+  st_delete(swig_ruby_trackings, (st_data_t *)&ptr, NULL);
+}
+
+/* This is a helper method that unlinks a Ruby object from its
+   underlying C++ object.  This is needed if the lifetime of the
+   Ruby object is longer than the C++ object. */
+SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) {
+  VALUE object = SWIG_RubyInstanceFor(ptr);
+
+  if (object != Qnil) {
+    // object might have the T_ZOMBIE type, but that's just
+    // because the GC has flagged it as such for a deferred
+    // destruction. Until then, it's still a T_DATA object.
+    DATA_PTR(object) = 0;
+  }
+}
+
+/* This is a helper method that iterates over all the trackings
+   passing the C++ object pointer and its related Ruby object
+   to the passed callback function. */
+
+/* Proxy method to abstract the internal trackings datatype */
+static int swig_ruby_internal_iterate_callback(st_data_t ptr, st_data_t obj, st_data_t meth) {
+  ((void (*) (void *, VALUE))meth)((void *)ptr, (VALUE)obj);
+  return ST_CONTINUE;
+}
+
+SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) {
+  st_foreach(swig_ruby_trackings,
+             SWIG_RUBY_INT_ANYARGS_FUNC(swig_ruby_internal_iterate_callback),
+             (st_data_t)meth);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Ruby API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SWIGINTERN VALUE
+SWIG_Ruby_AppendOutput(VALUE target, VALUE o) {
+  if (NIL_P(target)) {
+    target = o;
+  } else {
+    if (TYPE(target) != T_ARRAY) {
+      VALUE o2 = target;
+      target = rb_ary_new();
+      rb_ary_push(target, o2);
+    }
+    rb_ary_push(target, o);
+  }
+  return target;
+}
+
+/* For ruby1.8.4 and earlier. */
+#ifndef RUBY_INIT_STACK
+   RUBY_EXTERN void Init_stack(VALUE* addr);
+#  define RUBY_INIT_STACK \
+   VALUE variable_in_this_stack_frame; \
+   Init_stack(&variable_in_this_stack_frame);
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * rubyrun.swg
+ *
+ * This file contains the runtime support for Ruby modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* For backward compatibility only */
+#define SWIG_POINTER_EXCEPTION  0
+
+/* for raw pointers */
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Ruby_NewPointerObj(ptr, type, flags)
+#define SWIG_AcquirePtr(ptr, own)                       SWIG_Ruby_AcquirePtr(ptr, own)
+#define swig_owntype                                    swig_ruby_owntype
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Ruby_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_ConvertPtr(obj, pptr, type, 0)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_NewPointerObj(ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Ruby_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Ruby_GetModule(clientdata)
+#define SWIG_SetModule(clientdata, pointer) 		SWIG_Ruby_SetModule(pointer)
+
+
+/* Error manipulation */
+
+#define SWIG_ErrorType(code)                            SWIG_Ruby_ErrorType(code)               
+#define SWIG_Error(code, msg)            		rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg)
+#define SWIG_fail                        		goto fail				 
+
+
+/* Ruby-specific SWIG API */
+
+#define SWIG_InitRuntime()                              SWIG_Ruby_InitRuntime()              
+#define SWIG_define_class(ty)                        	SWIG_Ruby_define_class(ty)
+#define SWIG_NewClassInstance(value, ty)             	SWIG_Ruby_NewClassInstance(value, ty)
+#define SWIG_MangleStr(value)                        	SWIG_Ruby_MangleStr(value)		  
+#define SWIG_CheckConvert(value, ty)                 	SWIG_Ruby_CheckConvert(value, ty)	  
+
+#include "assert.h"
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+  VALUE klass;
+  VALUE mImpl;
+  void  (*mark)(void *);
+  void  (*destroy)(void *);
+  int trackObjects;
+} swig_class;
+
+
+/* Global pointer used to keep some internal SWIG stuff */
+static VALUE _cSWIG_Pointer = Qnil;
+static VALUE swig_runtime_data_type_pointer = Qnil;
+
+/* Global IDs used to keep some internal SWIG stuff */
+static ID swig_arity_id = 0;
+static ID swig_call_id  = 0;
+
+/*
+  If your swig extension is to be run within an embedded ruby and has
+  director callbacks, you should set -DRUBY_EMBEDDED during compilation.  
+  This will reset ruby's stack frame on each entry point from the main 
+  program the first time a virtual director function is invoked (in a 
+  non-recursive way).
+  If this is not done, you run the risk of Ruby trashing the stack.
+*/
+
+#ifdef RUBY_EMBEDDED
+
+#  define SWIG_INIT_STACK                            \
+      if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \
+      ++swig_virtual_calls;
+#  define SWIG_RELEASE_STACK --swig_virtual_calls;
+#  define Ruby_DirectorTypeMismatchException(x) \
+          rb_raise( rb_eTypeError, "%s", x ); return c_result;
+
+      static unsigned int swig_virtual_calls = 0;
+
+#else  /* normal non-embedded extension */
+
+#  define SWIG_INIT_STACK
+#  define SWIG_RELEASE_STACK
+#  define Ruby_DirectorTypeMismatchException(x) \
+          throw Swig::DirectorTypeMismatchException( x );
+
+#endif  /* RUBY_EMBEDDED */
+
+
+SWIGRUNTIME VALUE 
+getExceptionClass(void) {
+  static int init = 0;
+  static VALUE rubyExceptionClass ;
+  if (!init) {
+    init = 1;
+    rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception"));
+  }
+  return rubyExceptionClass;
+} 
+
+/* This code checks to see if the Ruby object being raised as part
+   of an exception inherits from the Ruby class Exception.  If so,
+   the object is simply returned.  If not, then a new Ruby exception
+   object is created and that will be returned to Ruby.*/
+SWIGRUNTIME VALUE
+SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) {
+  VALUE exceptionClass = getExceptionClass();
+  if (rb_obj_is_kind_of(obj, exceptionClass)) {
+    return obj;
+  }  else {
+    return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj));
+  }
+}
+
+/* Initialize Ruby runtime support */
+SWIGRUNTIME void
+SWIG_Ruby_InitRuntime(void)
+{
+  if (_mSWIG == Qnil) {
+    _mSWIG = rb_define_module("SWIG");
+    swig_call_id  = rb_intern("call");
+    swig_arity_id = rb_intern("arity");
+  }
+}
+
+/* Define Ruby class for C type */
+SWIGRUNTIME void
+SWIG_Ruby_define_class(swig_type_info *type)
+{
+  char *klass_name = (char *) malloc(4 + strlen(type->name) + 1);
+  sprintf(klass_name, "TYPE%s", type->name);
+  if (NIL_P(_cSWIG_Pointer)) {
+    _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject);
+    rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new");
+  }
+  rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer);
+  free((void *) klass_name);
+}
+
+/* Create a new pointer object */
+SWIGRUNTIME VALUE
+SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags)
+{
+  int own =  flags & SWIG_POINTER_OWN; 
+  int track;
+  char *klass_name;
+  swig_class *sklass;
+  VALUE klass;
+  VALUE obj;
+
+  if (!ptr)
+    return Qnil;
+
+  assert(type);
+  if (type->clientdata) {
+    sklass = (swig_class *) type->clientdata;
+		
+    /* Are we tracking this class and have we already returned this Ruby object? */
+    track = sklass->trackObjects;
+    if (track) {
+      obj = SWIG_RubyInstanceFor(ptr);
+
+      /* Check the object's type and make sure it has the correct type.
+        It might not in cases where methods do things like 
+        downcast methods. */
+      if (obj != Qnil) {
+        VALUE value = rb_iv_get(obj, "@__swigtype__");
+        const char* type_name = RSTRING_PTR(value);
+				
+        if (strcmp(type->name, type_name) == 0) {
+          return obj;
+        }
+      }
+    }
+
+    /* Create a new Ruby object */
+    obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), 
+			   ( own ? VOIDFUNC(sklass->destroy) : 
+			     (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 )
+			     ), ptr);
+
+    /* If tracking is on for this class then track this object. */
+    if (track) {
+      SWIG_RubyAddTracking(ptr, obj);
+    }
+  } else {
+    klass_name = (char *) malloc(4 + strlen(type->name) + 1);
+    sprintf(klass_name, "TYPE%s", type->name);
+    klass = rb_const_get(_mSWIG, rb_intern(klass_name));
+    free((void *) klass_name);
+    obj = Data_Wrap_Struct(klass, 0, 0, ptr);
+  }
+  rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name));
+
+  return obj;
+}
+
+/* Create a new class instance (always owned) */
+SWIGRUNTIME VALUE
+SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type)
+{
+  VALUE obj;
+  swig_class *sklass = (swig_class *) type->clientdata;
+  obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0);
+  rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name));
+  return obj;
+}
+
+/* Get type mangle from class name */
+SWIGRUNTIMEINLINE char *
+SWIG_Ruby_MangleStr(VALUE obj)
+{
+  VALUE stype = rb_iv_get(obj, "@__swigtype__");
+  if (NIL_P(stype))
+    return NULL;
+  return StringValuePtr(stype);
+}
+
+/* Acquire a pointer value */
+typedef struct {
+  void (*datafree)(void *);
+  int own;
+} swig_ruby_owntype;
+
+SWIGRUNTIME swig_ruby_owntype
+SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) {
+  swig_ruby_owntype oldown = {0, 0};
+  if (TYPE(obj) == T_DATA && !RTYPEDDATA_P(obj)) {
+    oldown.datafree = RDATA(obj)->dfree;
+    RDATA(obj)->dfree = own.datafree;
+  }
+  return oldown;
+}
+
+/* Convert a pointer value */
+SWIGRUNTIME int
+SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own)
+{
+  char *c;
+  swig_cast_info *tc;
+  void *vptr = 0;
+
+  /* Grab the pointer */
+  if (NIL_P(obj)) {
+    if (ptr)
+      *ptr = 0;
+    return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK;
+  } else {
+    if (TYPE(obj) != T_DATA || (TYPE(obj) == T_DATA && RTYPEDDATA_P(obj))) {
+      return SWIG_ERROR;
+    }
+    Data_Get_Struct(obj, void, vptr);
+  }
+  
+  if (own) {
+    own->datafree = RDATA(obj)->dfree;
+    own->own = 0;
+  }
+    
+  /* Check to see if the input object is giving up ownership
+     of the underlying C struct or C++ object.  If so then we
+     need to reset the destructor since the Ruby object no 
+     longer owns the underlying C++ object.*/ 
+  if (flags & SWIG_POINTER_DISOWN) {
+    /* Is tracking on for this class? */
+    int track = 0;
+    if (ty && ty->clientdata) {
+      swig_class *sklass = (swig_class *) ty->clientdata;
+      track = sklass->trackObjects;
+    }
+		
+    if (track) {
+      /* We are tracking objects for this class.  Thus we change the destructor
+       * to SWIG_RubyRemoveTracking.  This allows us to
+       * remove the mapping from the C++ to Ruby object
+       * when the Ruby object is garbage collected.  If we don't
+       * do this, then it is possible we will return a reference 
+       * to a Ruby object that no longer exists thereby crashing Ruby. */
+      RDATA(obj)->dfree = SWIG_RubyRemoveTracking;
+    } else {    
+      RDATA(obj)->dfree = 0;
+    }
+  }
+
+  /* Do type-checking if type info was provided */
+  if (ty) {
+    if (ty->clientdata) {
+      if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) {
+        if (vptr == 0) {
+          /* The object has already been deleted */
+          return SWIG_ObjectPreviouslyDeletedError;
+        }
+      }
+    }
+    if ((c = SWIG_MangleStr(obj)) == NULL) {
+      return SWIG_ERROR;
+    }
+    tc = SWIG_TypeCheck(c, ty);
+    if (!tc) {
+      return SWIG_ERROR;
+    } else {
+      if (ptr) {
+        if (tc->type == ty) {
+          *ptr = vptr;
+        } else {
+          int newmemory = 0;
+          *ptr = SWIG_TypeCast(tc, vptr, &newmemory);
+          if (newmemory == SWIG_CAST_NEW_MEMORY) {
+            assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+            if (own)
+              own->own = own->own | SWIG_CAST_NEW_MEMORY;
+          }
+        }
+      }
+    }
+  } else {
+    if (ptr)
+      *ptr = vptr;
+  }
+  
+  return SWIG_OK;
+}
+
+/* Check convert */
+SWIGRUNTIMEINLINE int
+SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty)
+{
+  char *c = SWIG_MangleStr(obj);
+  if (!c) return 0;
+  return SWIG_TypeCheck(c,ty) != 0;
+}
+
+SWIGRUNTIME VALUE
+SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) {
+  char result[1024];
+  char *r = result;
+  if ((2*sz + 1 + strlen(type->name)) > 1000) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r, ptr, sz);
+  strcpy(r, type->name);
+  return rb_str_new2(result);
+}
+
+/* Convert a packed pointer value */
+SWIGRUNTIME int
+SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) {
+  swig_cast_info *tc;
+  const char  *c;
+
+  if (TYPE(obj) != T_STRING) goto type_error;
+  c = StringValuePtr(obj);
+  /* Pointer values must start with leading underscore */
+  if (*c != '_') goto type_error;
+  c++;
+  c = SWIG_UnpackData(c, ptr, sz);
+  if (ty) {
+    tc = SWIG_TypeCheck(c, ty);
+    if (!tc) goto type_error;
+  }
+  return SWIG_OK;
+
+ type_error:
+  return SWIG_ERROR;
+}
+
+SWIGRUNTIME swig_module_info *
+SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata))
+{
+  VALUE pointer;
+  swig_module_info *ret = 0;
+  VALUE verbose = rb_gv_get("VERBOSE");
+
+ /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */
+  rb_gv_set("VERBOSE", Qfalse);
+  
+  /* first check if pointer already created */
+  pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME);
+  if (pointer != Qnil) {
+    Data_Get_Struct(pointer, swig_module_info, ret);
+  }
+
+  /* reinstate warnings */
+  rb_gv_set("VERBOSE", verbose);
+  return ret;
+}
+
+SWIGRUNTIME void 
+SWIG_Ruby_SetModule(swig_module_info *pointer)
+{
+  /* register a new class */
+  VALUE cl = rb_define_class("swig_runtime_data", rb_cObject);
+  /* create and store the structure pointer to a global variable */
+  swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer);
+  rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer);
+}
+
+/* This function can be used to check whether a proc or method or similarly
+   callable function has been passed.  Usually used in a %typecheck, like:
+
+   %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) {
+        $result = SWIG_Ruby_isCallable( $input );
+   }
+ */
+SWIGINTERN
+int SWIG_Ruby_isCallable( VALUE proc )
+{
+  if ( rb_respond_to( proc, swig_call_id ) )
+    return 1;
+  return 0;
+}
+
+/* This function can be used to check the arity (number of arguments)
+   a proc or method can take.  Usually used in a %typecheck.
+   Valid arities will be that equal to minimal or those < 0
+   which indicate a variable number of parameters at the end.
+ */
+SWIGINTERN
+int SWIG_Ruby_arity( VALUE proc, int minimal )
+{
+  if ( rb_respond_to( proc, swig_arity_id ) )
+    {
+      VALUE num = rb_funcall( proc, swig_arity_id, 0 );
+      int arity = NUM2INT(num);
+      if ( arity < 0 && (arity+1) < -minimal ) return 1;
+      if ( arity == minimal ) return 1;
+      return 1;
+    }
+  return 0;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+  #define SWIG_exception(code, msg) do { SWIG_Error(code, msg);; } while(0) 
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_Cdi swig_types[0]
+#define SWIGTYPE_p_CdiGrid swig_types[1]
+#define SWIGTYPE_p_CdiTaxis swig_types[2]
+#define SWIGTYPE_p_CdiVariable swig_types[3]
+#define SWIGTYPE_p_CdiZaxis swig_types[4]
+#define SWIGTYPE_p_allocator_type swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_difference_type swig_types[7]
+#define SWIGTYPE_p_double swig_types[8]
+#define SWIGTYPE_p_float swig_types[9]
+#define SWIGTYPE_p_key_type swig_types[10]
+#define SWIGTYPE_p_mapped_type swig_types[11]
+#define SWIGTYPE_p_p_double swig_types[12]
+#define SWIGTYPE_p_p_void swig_types[13]
+#define SWIGTYPE_p_size_type swig_types[14]
+#define SWIGTYPE_p_std__allocatorT_CdiVariable_t swig_types[15]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[16]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[17]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t swig_types[18]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t swig_types[19]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t swig_types[20]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t swig_types[21]
+#define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t swig_types[22]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[23]
+#define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[24]
+#define SWIGTYPE_p_std__lessT_int_t swig_types[25]
+#define SWIGTYPE_p_std__lessT_std__string_t swig_types[26]
+#define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t swig_types[27]
+#define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator swig_types[28]
+#define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator swig_types[29]
+#define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t swig_types[30]
+#define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator swig_types[31]
+#define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator swig_types[32]
+#define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t swig_types[33]
+#define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator swig_types[34]
+#define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator swig_types[35]
+#define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t swig_types[36]
+#define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator swig_types[37]
+#define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator swig_types[38]
+#define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t swig_types[39]
+#define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator swig_types[40]
+#define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator swig_types[41]
+#define SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t swig_types[42]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[43]
+#define SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t swig_types[44]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[45]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[46]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[47]
+#define SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t swig_types[48]
+#define SWIGTYPE_p_swig__ConstIterator swig_types[49]
+#define SWIGTYPE_p_swig__GC_VALUE swig_types[50]
+#define SWIGTYPE_p_swig__Iterator swig_types[51]
+#define SWIGTYPE_p_value_type swig_types[52]
+#define SWIGTYPE_p_void swig_types[53]
+static swig_type_info *swig_types[55];
+static swig_module_info swig_module = {swig_types, 54, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#define SWIG_init    Init_Cdi
+#define SWIG_name    "Cdi"
+
+static VALUE mCdi;
+
+#define SWIG_RUBY_THREAD_BEGIN_BLOCK
+#define SWIG_RUBY_THREAD_END_BLOCK
+
+
+#define SWIGVERSION 0x040002 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+#define SWIG_FILE_WITH_INIT
+#include "cdi.hpp"
+
+
+#include <typeinfo>
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigGCReferences {
+    VALUE _hash;
+
+    SwigGCReferences() : _hash(Qnil) {
+    }
+    ~SwigGCReferences() {
+      if (_hash != Qnil)
+        rb_gc_unregister_address(&_hash);
+    }
+    static void EndProcHandler(VALUE) {
+      // Ruby interpreter ending - _hash can no longer be accessed.
+      SwigGCReferences &s_references = instance();
+      s_references._hash = Qnil;
+    }
+  public:
+    static SwigGCReferences& instance() {
+      // Hash of all GC_VALUE's currently in use
+      static SwigGCReferences s_references;
+
+      return s_references;
+    }
+    static void initialize() {
+      SwigGCReferences &s_references = instance();
+      if (s_references._hash == Qnil) {
+        rb_set_end_proc(&EndProcHandler, Qnil);
+        s_references._hash = rb_hash_new();
+        rb_gc_register_address(&s_references._hash);
+      }
+    }
+    void GC_register(VALUE& obj) {
+      if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj))
+        return;
+      if (_hash != Qnil) {
+        VALUE val = rb_hash_aref(_hash, obj);
+        unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 0;
+        ++n;
+        rb_hash_aset(_hash, obj, INT2NUM(n));
+      }
+    }
+    void GC_unregister(const VALUE& obj) {
+      if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj))
+        return;
+      // this test should not be needed but I've noticed some very erratic
+      // behavior of none being unregistered in some very rare situations.
+      if (BUILTIN_TYPE(obj) == T_NONE)
+        return;
+      if (_hash != Qnil) {
+        VALUE val = rb_hash_aref(_hash, obj);
+        unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 1;
+        --n;
+        if (n)
+          rb_hash_aset(_hash, obj, INT2NUM(n));
+        else
+          rb_hash_delete(_hash, obj);
+      }
+    }
+  };
+
+  class GC_VALUE {
+  protected:
+    VALUE  _obj;
+
+    static ID hash_id;
+    static ID   lt_id;
+    static ID   gt_id;
+    static ID   eq_id;
+    static ID   le_id;
+    static ID   ge_id;
+
+    static ID  pos_id;
+    static ID  neg_id;
+    static ID  inv_id;
+
+    static ID  add_id;
+    static ID  sub_id;
+    static ID  mul_id;
+    static ID  div_id;
+    static ID  mod_id;
+
+    static ID  and_id;
+    static ID   or_id;
+    static ID  xor_id;
+
+    static ID  lshift_id;
+    static ID  rshift_id;
+
+    struct OpArgs
+    {
+      VALUE src;
+      ID    id;
+      int   nargs;
+      VALUE target;
+    };
+
+
+  public:
+    GC_VALUE() : _obj(Qnil)
+    {
+    }
+
+    GC_VALUE(const GC_VALUE& item) : _obj(item._obj)
+    {
+      SwigGCReferences::instance().GC_register(_obj);
+    }
+    
+    GC_VALUE(VALUE obj) :_obj(obj)
+    {
+      SwigGCReferences::instance().GC_register(_obj);
+    }
+    
+    ~GC_VALUE() 
+    {
+      SwigGCReferences::instance().GC_unregister(_obj);
+    }
+    
+    GC_VALUE & operator=(const GC_VALUE& item) 
+    {
+      SwigGCReferences::instance().GC_unregister(_obj);
+      _obj = item._obj;
+      SwigGCReferences::instance().GC_register(_obj);
+      return *this;
+    }
+
+    operator VALUE() const
+    {
+      return _obj;
+    }
+
+    VALUE inspect() const
+    {
+      return rb_inspect(_obj);
+    }
+
+    VALUE to_s() const
+    {
+      return rb_inspect(_obj);
+    }
+
+    static VALUE swig_rescue_swallow(VALUE, VALUE)
+    {
+      /*
+      VALUE errstr = rb_obj_as_string(rb_errinfo());
+      printf("Swallowing error: '%s'\n", RSTRING_PTR(StringValue(errstr)));
+      */
+      return Qnil; /* Swallow Ruby exception */
+    }
+
+    static VALUE swig_rescue_funcall(VALUE p)
+    {
+      OpArgs* args = (OpArgs*) p;
+      return rb_funcall(args->src, args->id, args->nargs, args->target);
+    }
+
+    bool relational_equal_op(const GC_VALUE& other, const ID& op_id, bool (*op_func)(const VALUE& a, const VALUE& b)) const
+    {
+      if (FIXNUM_P(_obj) && FIXNUM_P(other._obj)) {
+        return op_func(_obj, other._obj);
+      }
+      bool res = false;
+      VALUE ret = Qnil;
+      SWIG_RUBY_THREAD_BEGIN_BLOCK;
+      if (rb_respond_to(_obj, op_id)) {
+        OpArgs  args;
+        args.src    = _obj;
+        args.id     = op_id;
+        args.nargs  = 1;
+        args.target = VALUE(other);
+        ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args),
+                       (VALUEFUNC(swig_rescue_swallow)), Qnil);
+      }
+      if (ret == Qnil) {
+        VALUE a = rb_funcall(         _obj, hash_id, 0 );
+        VALUE b = rb_funcall( VALUE(other), hash_id, 0 );
+        res = op_func(a, b);
+      } else {
+        res = RTEST(ret);
+      }
+      SWIG_RUBY_THREAD_END_BLOCK;
+      return res;
+    }
+
+    static bool operator_eq(const VALUE& a, const VALUE& b) { return a == b; }
+    static bool operator_lt(const VALUE& a, const VALUE& b) { return a < b; }
+    static bool operator_le(const VALUE& a, const VALUE& b) { return a <= b; }
+    static bool operator_gt(const VALUE& a, const VALUE& b) { return a > b; }
+    static bool operator_ge(const VALUE& a, const VALUE& b) { return a >= b; }
+
+    bool operator==(const GC_VALUE& other) const { return relational_equal_op(other, eq_id, operator_eq); }
+    bool operator<(const GC_VALUE& other) const { return relational_equal_op(other, lt_id, operator_lt); }
+    bool operator<=(const GC_VALUE& other) const { return relational_equal_op(other, le_id, operator_le); }
+    bool operator>(const GC_VALUE& other) const { return relational_equal_op(other, gt_id, operator_gt); }
+    bool operator>=(const GC_VALUE& other) const { return relational_equal_op(other, ge_id, operator_ge); }
+
+    bool operator!=(const GC_VALUE& other) const
+    {
+      return !(this->operator==(other));
+    }
+
+    GC_VALUE unary_op(const ID& op_id) const
+    {
+      VALUE ret = Qnil;
+      SWIG_RUBY_THREAD_BEGIN_BLOCK;
+      OpArgs  args;
+      args.src    = _obj;
+      args.id     = op_id;
+      args.nargs  = 0;
+      args.target = Qnil;
+      ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args),
+                     (VALUEFUNC(swig_rescue_swallow)), Qnil);
+      SWIG_RUBY_THREAD_END_BLOCK;
+      return ret;
+    }
+
+    GC_VALUE operator+() const { return unary_op(pos_id); }
+    GC_VALUE operator-() const { return unary_op(neg_id); }
+    GC_VALUE operator~() const { return unary_op(inv_id); }
+
+    GC_VALUE binary_op(const GC_VALUE& other, const ID& op_id) const
+    {
+      VALUE ret = Qnil;
+      SWIG_RUBY_THREAD_BEGIN_BLOCK;
+      OpArgs  args;
+      args.src    = _obj;
+      args.id     = op_id;
+      args.nargs  = 1;
+      args.target = VALUE(other);
+      ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args),
+                     (VALUEFUNC(swig_rescue_swallow)), Qnil);
+      SWIG_RUBY_THREAD_END_BLOCK;
+      return GC_VALUE(ret);
+    }
+
+    GC_VALUE operator+(const GC_VALUE& other) const { return binary_op(other, add_id); }
+    GC_VALUE operator-(const GC_VALUE& other) const { return binary_op(other, sub_id); }
+    GC_VALUE operator*(const GC_VALUE& other) const { return binary_op(other, mul_id); }
+    GC_VALUE operator/(const GC_VALUE& other) const { return binary_op(other, div_id); }
+    GC_VALUE operator%(const GC_VALUE& other) const { return binary_op(other, mod_id); }
+    GC_VALUE operator&(const GC_VALUE& other) const { return binary_op(other, and_id); }
+    GC_VALUE operator^(const GC_VALUE& other) const { return binary_op(other, xor_id); }
+    GC_VALUE operator|(const GC_VALUE& other) const { return binary_op(other, or_id); }
+    GC_VALUE operator<<(const GC_VALUE& other) const { return binary_op(other, lshift_id); }
+    GC_VALUE operator>>(const GC_VALUE& other) const { return binary_op(other, rshift_id); }
+  };
+
+  ID  GC_VALUE::hash_id = rb_intern("hash");
+  ID  GC_VALUE::lt_id = rb_intern("<");
+  ID  GC_VALUE::gt_id = rb_intern(">");
+  ID  GC_VALUE::eq_id = rb_intern("==");
+  ID  GC_VALUE::le_id = rb_intern("<=");
+  ID  GC_VALUE::ge_id = rb_intern(">=");
+
+  ID  GC_VALUE::pos_id = rb_intern("+@");
+  ID  GC_VALUE::neg_id = rb_intern("-@");
+  ID  GC_VALUE::inv_id = rb_intern("~");
+
+  ID  GC_VALUE::add_id = rb_intern("+");
+  ID  GC_VALUE::sub_id = rb_intern("-");
+  ID  GC_VALUE::mul_id = rb_intern("*");
+  ID  GC_VALUE::div_id = rb_intern("/");
+  ID  GC_VALUE::mod_id = rb_intern("%");
+
+  ID  GC_VALUE::and_id = rb_intern("&");
+  ID  GC_VALUE::or_id  = rb_intern("|");
+  ID  GC_VALUE::xor_id = rb_intern("^");
+
+  ID  GC_VALUE::lshift_id = rb_intern("<<");
+  ID  GC_VALUE::rshift_id = rb_intern(">>");
+
+  typedef GC_VALUE LANGUAGE_OBJ;
+
+} // namespace swig
+
+
+
+#if defined(__GNUC__)
+#  if __GNUC__ == 2 && __GNUC_MINOR <= 96
+#     define SWIG_STD_NOMODERN_STL
+#  endif
+#endif
+
+
+#include <string>
+
+
+#include <stddef.h>
+
+
+#include <iostream>
+
+
+namespace swig {
+  struct stop_iteration {
+  };
+
+  /** 
+   * Abstract base class used to represent all iterators of STL containers.
+   */
+  struct ConstIterator {
+  public:
+    typedef ConstIterator self_type;
+
+  protected:
+    GC_VALUE _seq;
+
+  protected:
+    ConstIterator(VALUE seq) : _seq(seq)
+    {
+    }
+
+    // Random access iterator methods, but not required in Ruby
+    virtual ptrdiff_t distance(const ConstIterator &x) const
+    {
+      throw std::invalid_argument("distance not supported");
+    }
+
+    virtual bool equal (const ConstIterator &x) const
+    {
+      throw std::invalid_argument("equal not supported");
+    }
+
+    virtual self_type* advance(ptrdiff_t n)
+    {
+      throw std::invalid_argument("advance not supported");
+    }
+      
+  public:
+    virtual ~ConstIterator() {}
+
+    // Access iterator method, required by Ruby
+    virtual VALUE value() const {
+      throw std::invalid_argument("value not supported");
+      return Qnil;
+    };
+
+    virtual VALUE setValue( const VALUE& v ) {
+      throw std::invalid_argument("value= not supported");
+      return Qnil;
+    }
+
+    virtual self_type* next( size_t n = 1 )
+    {
+      return this->advance( n );
+    }
+
+    virtual self_type* previous( size_t n = 1 )
+    {
+      ptrdiff_t nn = n;
+      return this->advance( -nn );
+    }
+
+    virtual VALUE to_s() const {
+      throw std::invalid_argument("to_s not supported");
+      return Qnil;
+    }
+
+    virtual VALUE inspect() const {
+      throw std::invalid_argument("inspect not supported");
+      return Qnil;
+    }
+    
+    virtual ConstIterator *dup() const
+    {
+      throw std::invalid_argument("dup not supported");
+      return NULL;
+    }
+
+    //
+    // C++ common/needed methods.  We emulate a bidirectional
+    // operator, to be compatible with all the STL.
+    // The iterator traits will then tell the STL what type of
+    // iterator we really are.
+    //
+    ConstIterator() : _seq( Qnil )
+    {
+    }
+
+    ConstIterator( const self_type& b ) : _seq( b._seq )
+    {
+    }
+
+    self_type& operator=( const self_type& b )
+    {
+      _seq = b._seq;
+      return *this;
+    }
+
+    bool operator == (const ConstIterator& x)  const
+    {
+      return equal(x);
+    }
+      
+    bool operator != (const ConstIterator& x) const
+    {
+      return ! operator==(x);
+    }
+      
+    // Pre-decrement operator
+    self_type& operator--()
+    {
+      return *previous();
+    }
+
+    // Pre-increment operator
+    self_type& operator++()
+    {
+      return *next();
+    }
+
+    // Post-decrement operator
+    self_type operator--(int)
+    {
+      self_type r = *this;
+      previous();
+      return r;
+    }
+
+    // Post-increment operator
+    self_type operator++(int)
+    {
+      self_type r = *this;
+      next();
+      return r;
+    }
+
+    ConstIterator& operator += (ptrdiff_t n)
+    {
+      return *advance(n);
+    }
+
+    ConstIterator& operator -= (ptrdiff_t n)
+    {
+      return *advance(-n);
+    }
+
+    ConstIterator* operator + (ptrdiff_t n) const
+    {
+      return dup()->advance(n);
+    }
+
+    ConstIterator* operator - (ptrdiff_t n) const
+    {
+      return dup()->advance(-n);
+    }
+      
+    ptrdiff_t operator - (const ConstIterator& x) const
+    {
+      return x.distance(*this);
+    }
+      
+    static swig_type_info* descriptor() {
+      static int init = 0;
+      static swig_type_info* desc = 0;
+      if (!init) {
+	desc = SWIG_TypeQuery("swig::ConstIterator *");
+	init = 1;
+      }	
+      return desc;
+    }
+  };
+
+
+  /**
+   * Abstract base class used to represent all non-const iterators of STL containers.
+   * 
+   */
+  struct Iterator : public ConstIterator {
+  public:
+    typedef Iterator self_type;
+
+  protected:
+    Iterator(VALUE seq) : ConstIterator(seq)
+    {
+    }
+
+    virtual self_type* advance(ptrdiff_t n)
+    {
+      throw std::invalid_argument("operation not supported");
+    }
+
+  public:
+    static swig_type_info* descriptor() {
+      static int init = 0;
+      static swig_type_info* desc = 0;
+      if (!init) {
+	desc = SWIG_TypeQuery("swig::Iterator *");
+	init = 1;
+      }	
+      return desc;
+    }
+    
+    virtual Iterator *dup() const
+    {
+      throw std::invalid_argument("dup not supported");
+      return NULL;
+    }
+      
+    virtual self_type* next( size_t n = 1 )
+    {
+      return this->advance( n );
+    }
+
+    virtual self_type* previous( size_t n = 1 )
+    {
+      ptrdiff_t nn = n;
+      return this->advance( -nn );
+    }
+
+    bool operator == (const ConstIterator& x)  const
+    {
+      return equal(x);
+    }
+      
+    bool operator != (const Iterator& x) const
+    {
+      return ! operator==(x);
+    }
+      
+    Iterator& operator += (ptrdiff_t n)
+    {
+      return *advance(n);
+    }
+
+    Iterator& operator -= (ptrdiff_t n)
+    {
+      return *advance(-n);
+    }
+      
+    Iterator* operator + (ptrdiff_t n) const
+    {
+      return dup()->advance(n);
+    }
+
+    Iterator* operator - (ptrdiff_t n) const
+    {
+      return dup()->advance(-n);
+    }
+      
+    ptrdiff_t operator - (const Iterator& x) const
+    {
+      return x.distance(*this);
+    }
+  };
+
+}
+
+
+SWIGINTERN VALUE
+SWIG_ruby_failed(VALUE SWIGUNUSEDPARM(arg1), VALUE SWIGUNUSEDPARM(arg2))
+{
+  return Qnil;
+} 
+
+
+/*@SWIG:/sw/spack-levante/swig-4.0.2-2xopcb/share/swig/4.0.2/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE arg)
+{
+  VALUE *args = (VALUE *)arg;
+  VALUE obj = args[0];
+  VALUE type = TYPE(obj);
+  unsigned long *res = (unsigned long *)(args[1]);
+  *res = type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj);
+  return obj;
+}
+/*@SWIG@*/
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long (VALUE obj, unsigned long *val) 
+{
+  VALUE type = TYPE(obj);
+  if ((type == T_FIXNUM) || (type == T_BIGNUM)) {
+    unsigned long v;
+    VALUE a[2];
+    a[0] = obj;
+    a[1] = (VALUE)(&v);
+    if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) {
+      if (val) *val = v;
+      return SWIG_OK;
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+#if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE)
+#  define SWIG_LONG_LONG_AVAILABLE
+#endif
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+/*@SWIG:/sw/spack-levante/swig-4.0.2-2xopcb/share/swig/4.0.2/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+SWIGINTERN VALUE SWIG_AUX_NUM2ULL(VALUE arg)
+{
+  VALUE *args = (VALUE *)arg;
+  VALUE obj = args[0];
+  VALUE type = TYPE(obj);
+  long long *res = (long long *)(args[1]);
+  *res = type == T_FIXNUM ? NUM2ULL(obj) : rb_big2ull(obj);
+  return obj;
+}
+/*@SWIG@*/
+
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long (VALUE obj, unsigned long long *val)
+{ 
+  VALUE type = TYPE(obj);
+  if ((type == T_FIXNUM) || (type == T_BIGNUM)) {
+    unsigned long long v;
+    VALUE a[2];
+    a[0] = obj;
+    a[1] = (VALUE)(&v);
+    if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) {
+      if (val) *val = v;
+      return SWIG_OK;
+    }
+  }
+  return SWIG_TypeError;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_size_t (VALUE obj, size_t *val)
+{
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(size_t) <= sizeof(unsigned long long)) {
+    unsigned long long v;
+    res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  }
+#endif
+  return res;
+}
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_bool  (bool value)
+{
+  return value ? Qtrue : Qfalse;
+}
+
+
+/*@SWIG:/sw/spack-levante/swig-4.0.2-2xopcb/share/swig/4.0.2/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE arg)
+{
+  VALUE *args = (VALUE *)arg;
+  VALUE obj = args[0];
+  VALUE type = TYPE(obj);
+  long *res = (long *)(args[1]);
+  *res = type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj);
+  return obj;
+}
+/*@SWIG@*/
+
+SWIGINTERN int
+SWIG_AsVal_long (VALUE obj, long* val)
+{
+  VALUE type = TYPE(obj);
+  if ((type == T_FIXNUM) || (type == T_BIGNUM)) {
+    long v;
+    VALUE a[2];
+    a[0] = obj;
+    a[1] = (VALUE)(&v);
+    if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) {
+      if (val) *val = v;
+      return SWIG_OK;
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+/*@SWIG:/sw/spack-levante/swig-4.0.2-2xopcb/share/swig/4.0.2/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+SWIGINTERN VALUE SWIG_AUX_NUM2LL(VALUE arg)
+{
+  VALUE *args = (VALUE *)arg;
+  VALUE obj = args[0];
+  VALUE type = TYPE(obj);
+  long long *res = (long long *)(args[1]);
+  *res = type == T_FIXNUM ? NUM2LL(obj) : rb_big2ll(obj);
+  return obj;
+}
+/*@SWIG@*/
+
+SWIGINTERN int
+SWIG_AsVal_long_SS_long (VALUE obj, long long *val)
+{
+  VALUE type = TYPE(obj);
+  if ((type == T_FIXNUM) || (type == T_BIGNUM)) {
+    long long v;
+    VALUE a[2];
+    a[0] = obj;
+    a[1] = (VALUE)(&v);
+    if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) {
+      if (val) *val = v;
+      return SWIG_OK;
+    }
+  }
+  return SWIG_TypeError;
+}
+#endif
+
+
+SWIGINTERNINLINE int
+SWIG_AsVal_ptrdiff_t (VALUE obj, ptrdiff_t *val)
+{
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    long v;
+    res = SWIG_AsVal_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(ptrdiff_t) <= sizeof(long long)) {
+    long long v;
+    res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  }
+#endif
+  return res;
+}
+
+
+  #define SWIG_From_long   LONG2NUM 
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE VALUE 
+SWIG_From_long_SS_long  (long long value)
+{
+  return LL2NUM(value);
+}
+#endif
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_ptrdiff_t  (ptrdiff_t value)
+{    
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    return SWIG_From_long  (static_cast< long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(ptrdiff_t) <= sizeof(long long) */
+    return SWIG_From_long_SS_long  (static_cast< long long >(value));
+  }
+#endif
+}
+
+
+#include <algorithm>
+
+
+#include <vector>
+
+
+#include <utility>
+
+
+#include <map>
+
+
+#include <algorithm>
+
+
+SWIGINTERN int
+SWIG_AsVal_int (VALUE obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_int  (int value)
+{    
+  return SWIG_From_long  (value);
+}
+
+
+namespace swig {
+  template <class Type>
+  struct noconst_traits {
+    typedef Type noconst_type;
+  };
+
+  template <class Type>
+  struct noconst_traits<const Type> {
+    typedef Type noconst_type;
+  };
+
+  /*
+    type categories
+  */
+  struct pointer_category { };
+  struct value_category { };
+
+  /*
+    General traits that provides type_name and type_info
+  */
+  template <class Type> struct traits { };
+
+  template <class Type>
+  inline const char* type_name() {
+    return traits<typename noconst_traits<Type >::noconst_type >::type_name();
+  }
+
+  template <class Type> struct traits_info {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  /*
+    Partial specialization for pointers (traits_info)
+  */
+  template <class Type> struct traits_info<Type *> {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  template <class Type>
+  inline swig_type_info *type_info() {
+    return traits_info<Type>::type_info();
+  }
+
+  /*
+    Partial specialization for pointers (traits)
+  */
+  template <class Type> struct traits <Type *> {
+    typedef pointer_category category;
+    static std::string make_ptr_name(const char* name) {
+      std::string ptrname = name;
+      ptrname += " *";
+      return ptrname;
+    }
+    static const char* type_name() {
+      static std::string name = make_ptr_name(swig::type_name<Type>());
+      return name.c_str();
+    }
+  };
+
+  template <class Type, class Category>
+  struct traits_as { };
+
+  template <class Type, class Category>
+  struct traits_check { };
+
+}
+
+
+namespace swig {
+  template <class Type> struct traits_asptr;
+  template <class Type> struct traits_asval;
+  struct pointer_category;
+  template <class Type, class Category> struct traits_as;
+  template <class Type> struct traits_from;
+  template <class Type> struct traits_from_ptr;
+  template <class Type> struct noconst_traits;
+  template <class Type> swig_type_info* type_info();
+  template <class Type> const char* type_name();
+  template <class Type> VALUE from(const Type& val);
+}
+
+
+
+namespace swig {  
+  /*
+    Traits that provides the from method
+  */
+  template <class Type> struct traits_from_ptr {
+    static VALUE from(Type *val, int owner = 0) {
+      return SWIG_NewPointerObj(val, type_info<Type>(), owner);
+    }
+  };
+
+  template <class Type> struct traits_from {
+    static VALUE from(const Type& val) {
+      return traits_from_ptr<Type>::from(new Type(val), 1);
+    }
+  };
+
+  template <class Type> struct traits_from<Type *> {
+    static VALUE from(Type* val) {
+      return traits_from_ptr<Type>::from(val, 0);
+    }
+  };
+
+  template <class Type> struct traits_from<const Type *> {
+    static VALUE from(const Type* val) {
+      return traits_from_ptr<Type>::from(const_cast<Type*>(val), 0);
+    }
+  };
+
+
+  template <class Type>
+  inline VALUE from(const Type& val) {
+    return traits_from<Type>::from(val);
+  }
+
+  template <class Type>
+  inline VALUE from_ptr(Type* val, int owner) {
+    return traits_from_ptr<Type>::from(val, owner);
+  }
+
+  /*
+    Traits that provides the asval/as/check method
+  */
+  template <class Type>
+  struct traits_asptr {   
+    static int asptr(VALUE obj, Type **val) {
+      Type *p = 0;
+      swig_type_info *descriptor = type_info<Type>();
+      int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+      if (SWIG_IsOK(res)) {
+	if (val) *val = p;
+      }
+      return res;
+    }
+  }; 
+
+  template <class Type>
+  inline int asptr(VALUE obj, Type **vptr) {
+    return traits_asptr<Type>::asptr(obj, vptr);
+  }
+
+  template <class Type> 
+  struct traits_asval {
+    static int asval(VALUE obj, Type *val) {
+      if (val) {
+	Type *p = 0;
+	int res = traits_asptr<Type>::asptr(obj, &p);
+	if (!SWIG_IsOK(res)) return res;	
+	if (p) {
+	  typedef typename noconst_traits<Type>::noconst_type noconst_type;
+	  *(const_cast<noconst_type*>(val)) = *p;
+	  if (SWIG_IsNewObj(res)){
+	    delete p;
+	    res = SWIG_DelNewMask(res);
+	  }
+	  return res;
+	} else {
+	  return SWIG_ERROR;
+	}
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+
+  template <class Type> struct traits_asval<Type*> {
+    static int asval(VALUE obj, Type **val) {
+      if (val) {
+        typedef typename noconst_traits<Type>::noconst_type noconst_type;
+        noconst_type *p = 0;
+        int res = traits_asptr<noconst_type>::asptr(obj,  &p);
+        if (SWIG_IsOK(res)) {
+          *(const_cast<noconst_type**>(val)) = p;
+	}
+	return res;
+      } else {
+	return traits_asptr<Type>::asptr(obj, (Type **)(0));
+      }
+    }
+  };
+  
+  template <class Type>
+  inline int asval(VALUE obj, Type *val) {
+    return traits_asval<Type>::asval(obj, val);
+  }
+
+  template <class Type> 
+  struct traits_as<Type, value_category> {
+    static Type as(VALUE obj) {
+      Type v;
+      int res = asval(obj, &v);
+      if (!SWIG_IsOK(res)) {
+	VALUE lastErr = rb_gv_get("$!");
+	if (lastErr == Qnil) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+        throw std::invalid_argument("bad type");
+      }
+      return v;
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type, pointer_category> {
+    static Type as(VALUE obj) {
+      Type *v = 0;      
+      int res = traits_asptr<Type>::asptr(obj, &v);
+      if (SWIG_IsOK(res) && v) {
+	if (SWIG_IsNewObj(res)) {
+	  Type r(*v);
+	  delete v;
+	  return r;
+	} else {
+	  return *v;
+	}
+      } else {
+	VALUE lastErr = rb_gv_get("$!");
+	if (lastErr == Qnil) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+        throw std::invalid_argument("bad type");
+      }
+    }
+  };
+
+  template <class Type> 
+  struct traits_as<Type*, pointer_category> {
+    static Type* as(VALUE obj) {
+      Type *v = 0;      
+      int res = traits_asptr<Type>::asptr(obj, &v);
+      if (SWIG_IsOK(res)) {
+	return v;
+      } else {
+	VALUE lastErr = rb_gv_get("$!");
+	if (lastErr == Qnil) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<Type>());
+	}
+        throw std::invalid_argument("bad type");
+      }
+    }
+  };
+
+  template <class Type>
+  inline Type as(VALUE obj) {
+    return traits_as< Type, typename traits< Type >::category >::as(obj);
+  }
+
+  template <class Type> 
+  struct traits_check<Type, value_category> {
+    static bool check(VALUE obj) {
+      int res = asval(obj, (Type *)(0));
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type> 
+  struct traits_check<Type, pointer_category> {
+    static bool check(VALUE obj) {
+      int res = asptr(obj, (Type **)(0));
+      return SWIG_IsOK(res) ? true : false;
+    }
+  };
+
+  template <class Type>
+  inline bool check(VALUE obj) {
+    return traits_check<Type, typename traits<Type>::category>::check(obj);
+  }
+}
+
+
+namespace swig {
+  template <> struct traits< int > {
+    typedef value_category category;
+    static const char* type_name() { return"int"; }
+  };
+  template <>  struct traits_asval< int > {
+    typedef int value_type;
+    static int asval(VALUE obj, value_type *val) {
+      return SWIG_AsVal_int (obj, val);
+    }
+  };
+  template <>  struct traits_from< int > {
+    typedef int value_type;
+    static VALUE from(const value_type& val) {
+      return SWIG_From_int  (val);
+    }
+  };
+}
+
+
+#include <functional>
+
+
+namespace swig {
+  template < class T >
+  struct yield
+  {
+    bool
+    operator()( const T& v ) const
+    { 
+      return RTEST( rb_yield( swig::from< T >(v) ) );
+    }
+  };
+
+
+  inline size_t
+  check_index(ptrdiff_t i, size_t size, bool insert = false) {
+    if ( i < 0 ) {
+      if ((size_t) (-i) <= size)
+	return (size_t) (i + size);
+    } else if ( (size_t) i < size ) {
+      return (size_t) i;
+    } else if (insert && ((size_t) i == size)) {
+      return size;
+    }
+    
+    throw std::out_of_range("index out of range");
+  }
+
+  inline size_t
+  slice_index(ptrdiff_t i, size_t size) {
+    if ( i < 0 ) {
+      if ((size_t) (-i) <= size) {
+	return (size_t) (i + size);
+      } else {
+	throw std::out_of_range("index out of range");
+      }
+    } else {
+      return ( (size_t) i < size ) ? ((size_t) i) : size;
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::iterator
+  getpos(Sequence* self, Difference i)  {
+    typename Sequence::iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence, class Difference>
+  inline typename Sequence::const_iterator
+  cgetpos(const Sequence* self, Difference i)  {
+    typename Sequence::const_iterator pos = self->begin();
+    std::advance(pos, check_index(i,self->size()));
+    return pos;
+  }
+
+  template <class Sequence>
+  inline void
+  resize(Sequence *seq, typename Sequence::size_type n, typename Sequence::value_type x) {
+    seq->resize(n, x);
+  }
+
+  template <class Sequence, class Difference>
+  inline Sequence*
+  getslice(const Sequence* self, Difference i, Difference j) {
+    typename Sequence::size_type size = self->size();
+    typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size));
+    typename Sequence::size_type jj = swig::slice_index(j, size);
+
+    if (jj > ii) {
+      typename Sequence::const_iterator vb = self->begin();
+      typename Sequence::const_iterator ve = self->begin();
+      std::advance(vb,ii);
+      std::advance(ve,jj);
+      return new Sequence(vb, ve);
+    } else {
+      return new Sequence();
+    }
+  }
+
+  template <class Sequence, class Difference, class InputSeq>
+  inline void
+  setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) {
+    typename Sequence::size_type size = self->size();
+    typename Sequence::size_type ii = swig::check_index(i, size, true);
+    typename Sequence::size_type jj = swig::slice_index(j, size);
+    if (jj < ii) jj = ii;
+    size_t ssize = jj - ii;
+    if (ssize <= v.size()) {
+      typename Sequence::iterator sb = self->begin();
+      typename InputSeq::const_iterator vmid = v.begin();
+      std::advance(sb,ii);
+      std::advance(vmid, jj - ii);
+      self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end());
+    } else {
+      typename Sequence::iterator sb = self->begin();
+      typename Sequence::iterator se = self->begin();
+      std::advance(sb,ii);
+      std::advance(se,jj);
+      self->erase(sb,se);
+      self->insert(sb, v.begin(), v.end());
+    }
+  }
+
+  template <class Sequence, class Difference>
+  inline void
+  delslice(Sequence* self, Difference i, Difference j) {
+    typename Sequence::size_type size = self->size();
+    typename Sequence::size_type ii = swig::check_index(i, size, true);
+    typename Sequence::size_type jj = swig::slice_index(j, size);
+    if (jj > ii) {
+      typename Sequence::iterator sb = self->begin();
+      typename Sequence::iterator se = self->begin();
+      std::advance(sb,ii);
+      std::advance(se,jj);
+      self->erase(sb,se);
+    }
+  }
+}
+
+
+#if defined(__SUNPRO_CC) && defined(_RWSTD_VER)
+#  if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL)
+#    define SWIG_STD_NOITERATOR_TRAITS_STL
+#  endif
+#endif
+
+#if !defined(SWIG_STD_NOITERATOR_TRAITS_STL)
+#include <iterator>
+#else
+namespace std {
+  template <class Iterator>
+  struct iterator_traits {
+    typedef ptrdiff_t difference_type;
+    typedef typename Iterator::value_type value_type;
+  };
+
+  template <class Iterator, class Category,class T, class Reference, class Pointer, class Distance>
+  struct iterator_traits<__reverse_bi_iterator<Iterator,Category,T,Reference,Pointer,Distance> > {
+    typedef Distance difference_type;
+    typedef T value_type;
+  };
+
+  template <class T>
+  struct iterator_traits<T*> {
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+  };
+
+  template<typename _InputIterator>
+  inline typename iterator_traits<_InputIterator>::difference_type
+  distance(_InputIterator __first, _InputIterator __last)
+  {
+    typename iterator_traits<_InputIterator>::difference_type __n = 0;
+    while (__first != __last) {
+      ++__first; ++__n;
+    }
+    return __n;
+  }
+}
+#endif
+
+
+namespace swig {
+
+  /** 
+   * Templated base classes for all custom const_iterators.
+   *
+   */
+  template<typename OutConstIterator>
+  class ConstIterator_T :  public ConstIterator
+  {
+  public:
+    typedef OutConstIterator const_iter;
+    typedef typename std::iterator_traits<const_iter>::value_type value_type;    
+    typedef ConstIterator_T<const_iter> self_type;
+
+  protected:
+
+    
+    virtual bool equal (const ConstIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return (current == iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+    
+    virtual ptrdiff_t distance(const ConstIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return std::distance(current, iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+
+    virtual ConstIterator* advance(ptrdiff_t n)
+    {
+      std::advance( current, n );
+      return this;
+    }
+
+  public:
+    ConstIterator_T() : ConstIterator(Qnil)
+    {
+    }
+
+    ConstIterator_T(const_iter curr, VALUE seq = Qnil)
+      : ConstIterator(seq), current(curr)
+    {
+    }
+
+    const const_iter& get_current() const
+    {
+      return current;
+    }
+
+    const value_type& operator*() const
+    {
+      return *current;
+    }
+
+    virtual VALUE inspect() const
+    {
+      VALUE ret = rb_str_new2("#<");
+      ret = rb_str_cat2( ret, rb_obj_classname(_seq) );
+      ret = rb_str_cat2( ret, "::const_iterator " );
+      VALUE cur = value();
+      ret = rb_str_concat( ret, rb_inspect(cur) );
+      ret = rb_str_cat2( ret, ">" );
+      return ret;
+    }
+
+    virtual VALUE to_s()    const
+    {
+      VALUE ret = rb_str_new2( rb_obj_classname(_seq) );
+      ret = rb_str_cat2( ret, "::const_iterator " );
+      VALUE cur = value();
+      ret = rb_str_concat( ret, rb_obj_as_string(cur) );
+      return ret;
+    }
+
+  protected:
+    const_iter current;
+  };
+
+
+  /** 
+   * Templated base classes for all custom non-const iterators.
+   *
+   */
+  template<typename InOutIterator>
+  class Iterator_T :  public Iterator
+  {
+  public:
+    typedef InOutIterator nonconst_iter;
+
+    // Make this class iterator STL compatible, by using iterator_traits
+    typedef typename std::iterator_traits<nonconst_iter >::iterator_category iterator_category;
+    typedef typename std::iterator_traits<nonconst_iter >::value_type        value_type;
+    typedef typename std::iterator_traits<nonconst_iter >::difference_type   difference_type;
+    typedef typename std::iterator_traits<nonconst_iter >::pointer           pointer;
+    typedef typename std::iterator_traits<nonconst_iter >::reference         reference;
+
+    typedef Iterator                         base;
+    typedef Iterator_T< nonconst_iter > self_type;
+
+  protected:
+
+    virtual bool equal (const ConstIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return (current == iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+    
+    virtual ptrdiff_t distance(const ConstIterator &iter) const
+    {
+      const self_type *iters = dynamic_cast<const self_type *>(&iter);
+      if (iters) {
+	return std::distance(current, iters->get_current());
+      } else {
+	throw std::invalid_argument("bad iterator type");
+      }
+    }
+
+    virtual Iterator* advance(ptrdiff_t n)
+    {
+      std::advance( current, n );
+      return this;
+    }
+
+  public:
+
+    Iterator_T(nonconst_iter curr, VALUE seq = Qnil)
+      : Iterator(seq), current(curr)
+    {
+    }
+
+    const nonconst_iter& get_current() const
+    {
+      return current;
+    }
+
+    self_type& operator=( const self_type& b )
+    {
+      base::operator=( b );
+      return *this;
+    }
+    
+    self_type& operator=( const value_type& b )
+    {
+      *current = b;
+      return *this;
+    }
+
+    const value_type& operator*() const
+    {
+      return *current;
+    }
+
+    value_type& operator*()
+    {
+      return *current;
+    }
+    
+    virtual VALUE inspect() const
+    {
+      VALUE ret = rb_str_new2("#<");
+      ret = rb_str_cat2( ret, rb_obj_classname(_seq) );
+      ret = rb_str_cat2( ret, "::iterator " );
+      VALUE cur = value();
+      ret = rb_str_concat( ret, rb_inspect(cur) );
+      ret = rb_str_cat2( ret, ">" );
+      return ret;
+    }
+
+    virtual VALUE to_s()    const
+    {
+      VALUE ret = rb_str_new2( rb_obj_classname(_seq) );
+      ret = rb_str_cat2( ret, "::iterator " );
+      VALUE cur = value();
+      ret = rb_str_concat( ret, rb_obj_as_string(cur) );
+      return ret;
+    }
+
+  protected:
+    nonconst_iter current;
+  };
+
+
+  /**
+   * Auxiliary functor to store the value of a ruby object inside
+   * a reference of a compatible C++ type.  ie: Ruby -> C++
+   * 
+   */
+  template <class ValueType>
+  struct asval_oper 
+  {
+    typedef ValueType    value_type;
+    typedef bool        result_type;
+    bool operator()(VALUE obj, value_type& v) const
+    {
+      return ( swig::asval< value_type >(obj, &v) == SWIG_OK );
+    }
+  };
+
+  /**
+   * Auxiliary functor to return a ruby object from a C++ type. 
+   * ie: C++ -> Ruby
+   * 
+   */
+  template <class ValueType>
+  struct from_oper 
+  {
+    typedef const ValueType& argument_type;
+    typedef VALUE result_type;
+    result_type operator()(argument_type v) const
+    {
+      return swig::from(v);
+    }
+  };
+
+
+  /** 
+   * ConstIterator class for a const_iterator with no end() boundaries.
+   *
+   */
+  template<typename OutConstIterator, 
+	   typename ValueType = typename std::iterator_traits<OutConstIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class ConstIteratorOpen_T :  public ConstIterator_T<OutConstIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutConstIterator const_iter;
+    typedef ValueType value_type;
+    typedef ConstIterator_T<const_iter>  base;
+    typedef ConstIteratorOpen_T<OutConstIterator, ValueType, FromOper> self_type;
+    
+    ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil)
+      : ConstIterator_T<OutConstIterator>(curr, seq)
+    {
+    }
+    
+    virtual VALUE value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+    
+    ConstIterator *dup() const
+    {
+      return new self_type(*this);
+    }
+  };
+
+  /** 
+   * Iterator class for an iterator with no end() boundaries.
+   *
+   */
+  template<typename InOutIterator, 
+	   typename ValueType = typename std::iterator_traits<InOutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType>,
+	   typename AsvalOper = asval_oper<ValueType> >
+  class IteratorOpen_T :  public Iterator_T<InOutIterator>
+  {
+  public:
+    FromOper  from;
+    AsvalOper asval;
+    typedef InOutIterator nonconst_iter;
+    typedef ValueType value_type;
+    typedef Iterator_T<nonconst_iter>  base;
+    typedef IteratorOpen_T<InOutIterator, ValueType, FromOper, AsvalOper> self_type;
+
+  public:
+    IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil)
+      : Iterator_T<InOutIterator>(curr, seq)
+    {
+    }
+    
+    virtual VALUE value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+
+    virtual VALUE setValue( const VALUE& v )
+    {
+      value_type& dst = *base::current;
+      if ( asval(v, dst) ) return v;
+      return Qnil;
+    }
+    
+    Iterator *dup() const
+    {
+      return new self_type(*this);
+    }
+  };
+
+  /** 
+   * ConstIterator class for a const_iterator where begin() and end() boundaries are known.
+   *
+   */
+  template<typename OutConstIterator, 
+	   typename ValueType = typename std::iterator_traits<OutConstIterator>::value_type,
+	   typename FromOper = from_oper<ValueType> >
+  class ConstIteratorClosed_T :  public ConstIterator_T<OutConstIterator>
+  {
+  public:
+    FromOper from;
+    typedef OutConstIterator const_iter;
+    typedef ValueType value_type;
+    typedef ConstIterator_T<const_iter>  base;    
+    typedef ConstIteratorClosed_T<OutConstIterator, ValueType, FromOper> self_type;
+    
+  protected:
+    virtual ConstIterator* advance(ptrdiff_t n)
+    {
+      std::advance( base::current, n );
+      if ( base::current == end )
+	throw stop_iteration();
+      return this;
+    }
+
+  public:
+    ConstIteratorClosed_T(const_iter curr, const_iter first, 
+			  const_iter last, VALUE seq = Qnil)
+      : ConstIterator_T<OutConstIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+    
+    virtual VALUE value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+    
+    ConstIterator *dup() const
+    {
+      return new self_type(*this);
+    }
+
+
+  private:
+    const_iter begin;
+    const_iter end;
+  };
+
+  /** 
+   * Iterator class for a iterator where begin() and end() boundaries are known.
+   *
+   */
+  template<typename InOutIterator, 
+	   typename ValueType = typename std::iterator_traits<InOutIterator>::value_type,
+	   typename FromOper = from_oper<ValueType>,
+	   typename AsvalOper = asval_oper<ValueType> >
+  class IteratorClosed_T :  public Iterator_T<InOutIterator>
+  {
+  public:
+    FromOper   from;
+    AsvalOper asval;
+    typedef InOutIterator nonconst_iter;
+    typedef ValueType value_type;
+    typedef Iterator_T<nonconst_iter>  base;
+    typedef IteratorClosed_T<InOutIterator, ValueType, FromOper, AsvalOper> self_type;
+    
+  protected:
+    virtual Iterator* advance(ptrdiff_t n)
+    {
+      std::advance( base::current, n );
+      if ( base::current == end )
+	throw stop_iteration();
+      return this;
+    }
+
+  public:
+    IteratorClosed_T(nonconst_iter curr, nonconst_iter first, 
+		     nonconst_iter last, VALUE seq = Qnil)
+      : Iterator_T<InOutIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+    
+    virtual VALUE value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+    
+    // Iterator setter method, required by Ruby
+    virtual VALUE setValue( const VALUE& v )
+    {
+      if (base::current == end)
+	throw stop_iteration();
+
+      value_type& dst = *base::current;
+      if ( asval( v, dst ) ) return v;
+      return Qnil;
+    }
+    
+    Iterator *dup() const
+    {
+      return new self_type(*this);
+    }
+
+  private:
+    nonconst_iter begin;
+    nonconst_iter end;
+  };
+
+  /* Partial specialization for bools which don't allow de-referencing */
+  template< typename InOutIterator, typename FromOper, typename AsvalOper >
+  class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > : 
+    public Iterator_T<InOutIterator>
+  {
+  public:
+    FromOper   from;
+    AsvalOper asval;
+    typedef InOutIterator nonconst_iter;
+    typedef bool value_type;
+    typedef Iterator_T<nonconst_iter>  base;
+    typedef IteratorOpen_T<InOutIterator, bool, FromOper, AsvalOper> self_type;
+
+    IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil)
+      : Iterator_T<InOutIterator>(curr, seq)
+    {
+    }
+
+    virtual VALUE value() const {
+      return from(static_cast<const value_type&>(*(base::current)));
+    }
+    
+    virtual VALUE setValue( const VALUE& v )
+    {
+      bool tmp = *base::current;
+      if ( asval( v, tmp ) )
+	{
+	  *base::current = tmp;
+	  return v;
+	}
+      return Qnil;
+    }    
+    
+    Iterator *dup() const
+    {
+      return new self_type(*this);
+    }
+    
+  };
+
+  /* Partial specialization for bools which don't allow de-referencing */
+  template< typename InOutIterator, typename FromOper, typename AsvalOper >
+  class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > : 
+    public Iterator_T<InOutIterator>
+  {
+  public:
+    FromOper   from;
+    AsvalOper asval;
+    typedef InOutIterator nonconst_iter;
+    typedef bool value_type;
+    typedef Iterator_T<nonconst_iter>  base;
+    typedef IteratorClosed_T<InOutIterator, bool, FromOper, AsvalOper> self_type;
+    
+  protected:
+    virtual Iterator* advance(ptrdiff_t n)
+    {
+      std::advance( base::current, n );
+      if ( base::current == end )
+	throw stop_iteration();
+      return this;
+    }
+
+  public:
+    IteratorClosed_T(nonconst_iter curr, nonconst_iter first, 
+		     nonconst_iter last, VALUE seq = Qnil)
+      : Iterator_T<InOutIterator>(curr, seq), begin(first), end(last)
+    {
+    }
+
+    virtual VALUE value() const {
+      if (base::current == end) {
+	throw stop_iteration();
+      } else {
+	return from(static_cast<const value_type&>(*(base::current)));
+      }
+    }
+
+    virtual VALUE setValue( const VALUE& v )
+    {
+      if (base::current == end)
+	throw stop_iteration();
+
+      bool tmp = *base::current;
+      if ( asval( v, tmp ) )
+	{
+	  *base::current = tmp;
+	  return v;
+	}
+      return Qnil;
+    }
+    
+    Iterator *dup() const
+    {
+      return new self_type(*this);
+    }
+
+  private:
+    nonconst_iter begin;
+    nonconst_iter end;
+  };
+
+
+  /** 
+   * Helper function used to wrap a bounded const_iterator.  This is to be used in
+   * a %typemap(out), for example.
+   *
+   */
+  template<typename InOutIter>
+  inline Iterator*
+  make_nonconst_iterator(const InOutIter& current, const InOutIter& begin,
+			 const InOutIter& end, VALUE seq = Qnil)
+  {
+    return new IteratorClosed_T<InOutIter>(current, begin, end, seq);
+  }
+
+  /** 
+   * Helper function used to wrap an unbounded const_iterator.  This is to be used in
+   * a %typemap(out), for example.
+   *
+   */
+  template<typename InOutIter>
+  inline Iterator*
+  make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil)
+  {
+    return new IteratorOpen_T<InOutIter>(current, seq);
+  }
+
+  /** 
+   * Helper function used to wrap a bounded const_iterator.  This is to be used in
+   * a %typemap(out), for example.
+   *
+   */
+  template<typename OutIter>
+  inline ConstIterator*
+  make_const_iterator(const OutIter& current, const OutIter& begin,
+                       const OutIter& end, VALUE seq = Qnil)
+  {
+    return new ConstIteratorClosed_T<OutIter>(current, begin, end, seq);
+  }
+
+  /** 
+   * Helper function used to wrap an unbounded const_iterator.  This is to be used in
+   * a %typemap(out), for example.
+   *
+   */
+  template<typename OutIter>
+  inline ConstIterator*
+  make_const_iterator(const OutIter& current, VALUE seq = Qnil)
+  {
+    return new ConstIteratorOpen_T<OutIter>(current, seq);
+  }
+}
+
+
+namespace swig
+{
+
+  /**
+   * This class is a proxy class for references, used to return and set values
+   * of an element of a Ruby Array of stuff.
+   * It can be used by RubySequence_InputIterator to make it work with STL
+   * algorithms.
+   */
+  template <class T>
+  struct RubySequence_Ref
+  {
+    RubySequence_Ref(VALUE  seq, int index)
+      : _seq(seq), _index(index)
+    {
+    }
+    
+    operator T () const
+    {
+      VALUE item = rb_ary_entry(_seq, _index );
+      try {
+	return swig::as<T>(item);
+      } catch (const std::invalid_argument& e) {
+	char msg[1024];
+	sprintf(msg, "in sequence element %d ", _index);
+	VALUE lastErr = rb_gv_get("$!");
+	if ( lastErr == Qnil ) {
+	  SWIG_Error(SWIG_TypeError,  swig::type_name<T>());
+	}
+	VALUE str = rb_str_new2(msg);
+	str = rb_str_cat2( str, e.what() );
+	SWIG_Ruby_ExceptionType( NULL, str );
+	throw;
+      }
+    }
+
+    RubySequence_Ref& operator=(const T& v)
+    {
+      rb_ary_set(_seq, _index, swig::from< T >(v));
+      return *this;
+    }
+
+  private:
+    VALUE  _seq;
+    int _index;
+  };
+
+
+  /**
+   * This class is a proxy to return a pointer to a class, usually
+   * RubySequence_Ref. 
+   * It can be used by RubySequence_InputIterator to make it work with STL
+   * algorithms.
+   */
+  template <class T>
+  struct RubySequence_ArrowProxy
+  {
+    RubySequence_ArrowProxy(const T& x): m_value(x) {}
+    const T* operator->() const { return &m_value; }
+    operator const T*() const { return &m_value; }
+    T m_value;
+  };
+
+
+  /**
+   * Input Iterator.  This adapator class is a random access iterator that 
+   * allows you to use STL algorithms with a Ruby class (a Ruby Array by default).
+   */
+  template <class T, class Reference = RubySequence_Ref< T > >
+  struct RubySequence_InputIterator
+  {
+    typedef RubySequence_InputIterator<T, Reference > self;
+
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef Reference reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef ptrdiff_t difference_type;
+
+    RubySequence_InputIterator()
+    {
+    }
+
+    RubySequence_InputIterator(VALUE  seq, int index)
+      : _seq(seq), _index(index)
+    {
+    }
+
+    reference operator*() const
+    {
+      return reference(_seq, _index);
+    }
+
+    RubySequence_ArrowProxy<T>
+    operator->() const {
+      return RubySequence_ArrowProxy<T>(operator*());
+    }
+
+    bool operator==(const self& ri) const
+    {
+      return (_index == ri._index) && (_seq == ri._seq);
+    }
+
+    bool operator!=(const self& ri) const
+    {
+      return !(operator==(ri));
+    }
+
+    self& operator ++ ()
+    {
+      ++_index;
+      return *this;
+    }
+
+    self& operator -- ()
+    {
+      --_index;
+      return *this;
+    }
+
+    self& operator += (difference_type n)
+    {
+      _index += n;
+      return *this;
+    }
+
+    self operator +(difference_type n) const
+    {
+      return self(_seq, _index + n);
+    }
+
+    self& operator -= (difference_type n)
+    {
+      _index -= n;
+      return *this;
+    }
+
+    self operator -(difference_type n) const
+    {
+      return self(_seq, _index - n);
+    }
+
+    difference_type operator - (const self& ri) const
+    {
+      return _index - ri._index;
+    }
+
+    bool operator < (const self& ri) const
+    {
+      return _index < ri._index;
+    }
+
+    reference
+    operator[](difference_type n) const
+    {
+      return reference(_seq, _index + n);
+    }
+
+  private:
+    VALUE  _seq;
+    difference_type _index;
+  };
+
+
+  /**
+   * This adaptor class allows you to use a Ruby Array as if it was an STL
+   * container, giving it begin(), end(), and iterators.
+   */
+  template <class T>
+  struct RubySequence_Cont
+  {
+    typedef RubySequence_Ref<T> reference;
+    typedef const RubySequence_Ref<T> const_reference;
+    typedef T value_type;
+    typedef T* pointer;
+    typedef int difference_type;
+    typedef int size_type;
+    typedef const pointer const_pointer;
+    typedef RubySequence_InputIterator<T, reference> iterator;
+    typedef RubySequence_InputIterator<T, const_reference> const_iterator;
+
+    RubySequence_Cont(VALUE  seq) : _seq(0)
+    {
+      if (!rb_obj_is_kind_of(seq, rb_cArray)) {
+	throw std::invalid_argument("an Array is expected");
+      }
+      _seq = seq;
+    }
+
+    ~RubySequence_Cont()
+    {
+    }
+
+    size_type size() const
+    {
+      return RARRAY_LEN(_seq);
+    }
+
+    bool empty() const
+    {
+      return size() == 0;
+    }
+
+    iterator begin()
+    {
+      return iterator(_seq, 0);
+    }
+
+    const_iterator begin() const
+    {
+      return const_iterator(_seq, 0);
+    }
+
+    iterator end()
+    {
+      return iterator(_seq, size());
+    }
+
+    const_iterator end() const
+    {
+      return const_iterator(_seq, size());
+    }
+
+    reference operator[](difference_type n)
+    {
+      return reference(_seq, n);
+    }
+
+    const_reference operator[](difference_type n)  const
+    {
+      return const_reference(_seq, n);
+    }
+
+    bool check() const
+    {
+      int s = (int) size();
+      for (int i = 0; i < s; ++i) {
+	VALUE item = rb_ary_entry(_seq, i );
+	if (!swig::check<value_type>(item))
+	  return false;
+      }
+      return true;
+    }
+
+  private:
+    VALUE  _seq;
+  };
+
+}
+
+
+namespace swig {
+  template <class RubySeq, class Seq>
+  inline void
+  assign(const RubySeq& rubyseq, Seq* seq) {
+    // seq->assign(rubyseq.begin(), rubyseq.end()); // not used as not always implemented
+    typedef typename RubySeq::value_type value_type;
+    typename RubySeq::const_iterator it = rubyseq.begin();
+    for (;it != rubyseq.end(); ++it) {
+      seq->insert(seq->end(),(value_type)(*it));
+    }
+  }
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_asptr_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+
+    static int asptr(VALUE obj, sequence **seq) {
+      if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) {
+	try {
+	  RubySequence_Cont<value_type> rubyseq(obj);
+	  if (seq) {
+	    sequence *pseq = new sequence();
+	    assign(rubyseq, pseq);
+	    *seq = pseq;
+	    return SWIG_NEWOBJ;
+	  } else {
+	    return rubyseq.check() ? SWIG_OK : SWIG_ERROR;
+	  }
+	} catch (const std::exception& e) {
+	  if (seq) {
+	    VALUE lastErr = rb_gv_get("$!");
+	    if (lastErr == Qnil) {
+	      rb_raise(rb_eTypeError, "%s", e.what());
+	    }
+	  }
+	  return SWIG_ERROR;
+	}
+      } else {
+	sequence *p;
+	swig_type_info *descriptor = swig::type_info<sequence>();
+	if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) {
+	  if (seq) *seq = p;
+	  return SWIG_OLDOBJ;
+	}
+      }
+      return SWIG_ERROR;
+    }
+  };
+
+  // Partial specialization for GC_VALUE's.  No need to typecheck each
+  // element.
+  template< class Seq >
+  struct traits_asptr_stdseq< Seq, swig::GC_VALUE > {
+    typedef Seq sequence;
+    typedef swig::GC_VALUE value_type;
+
+    static int asptr(VALUE obj, sequence **seq) {
+      if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) {
+	try {
+	  if (seq) {
+	    RubySequence_Cont<value_type> rubyseq(obj);
+	    sequence *pseq = new sequence();
+	    assign(rubyseq, pseq);
+	    *seq = pseq;
+	    return SWIG_NEWOBJ;
+	  } else {
+	    return true;
+	  }
+	} catch (const std::exception& e) {
+	  if (seq) {
+	    VALUE lastErr = rb_gv_get("$!");
+	    if (lastErr == Qnil) {
+	      rb_raise(rb_eTypeError, "%s", e.what());
+	    }
+	  }
+	  return SWIG_ERROR;
+	}
+      } else {
+	sequence *p;
+	swig_type_info *descriptor = swig::type_info<sequence>();
+	if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) {
+	  if (seq) *seq = p;
+	  return SWIG_OLDOBJ;
+	}
+      }
+      return SWIG_ERROR;
+    }
+  };
+
+  template <class Seq, class T = typename Seq::value_type >
+  struct traits_from_stdseq {
+    typedef Seq sequence;
+    typedef T value_type;
+    typedef typename Seq::size_type size_type;
+    typedef typename sequence::const_iterator const_iterator;
+
+    static VALUE from(const sequence& seq) {
+
+
+
+
+
+
+      size_type size = seq.size();
+      if (size <= (size_type)INT_MAX) {
+	VALUE obj = rb_ary_new2((int)size);
+	int i = 0;
+	for (const_iterator it = seq.begin();
+	     it != seq.end(); ++it, ++i) {
+	  rb_ary_push(obj, swig::from< value_type >(*it));
+	}
+	rb_obj_freeze(obj);  // treat as immutable result
+	return obj;
+      } else {
+	rb_raise(rb_eRangeError,"sequence size not valid in ruby");
+	return Qnil;
+      }
+    }
+  };
+}
+
+
+  namespace swig {
+    template <class T>
+    struct traits_asptr<std::vector<T> >  {
+      static int asptr(VALUE obj, std::vector<T> **vec) {
+	return traits_asptr_stdseq<std::vector<T> >::asptr(obj, vec);
+      }
+    };
+    
+    template <class T>
+    struct traits_from<std::vector<T> > {
+      static VALUE from(const std::vector<T>& vec) {
+	return traits_from_stdseq<std::vector<T> >::from(vec);
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< int, std::allocator< int > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "int" "," "std::allocator< int >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__dup(std::vector< int > *self){
+      return new std::vector< int,std::allocator< int > >(*self);
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__inspect(std::vector< int > *self){
+      std::vector< int,std::allocator< int > >::const_iterator i = self->begin();
+      std::vector< int,std::allocator< int > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::vector< int,std::allocator< int > > >();
+      VALUE str = rb_str_new2(type_name);
+      str = rb_str_cat2( str, " [" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "]" );
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__to_a(std::vector< int > *self){
+      std::vector< int,std::allocator< int > >::const_iterator i = self->begin();
+      std::vector< int,std::allocator< int > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__to_s(std::vector< int > *self){
+      std::vector< int,std::allocator< int > >::iterator i = self->begin();
+      std::vector< int,std::allocator< int > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__slice(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< int,std::allocator< int > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< int,std::allocator< int > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__each(std::vector< int > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::vector< int,std::allocator< int > >::const_iterator i = self->begin();
+	std::vector< int,std::allocator< int > >::const_iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from< std::vector< int,std::allocator< int > >::value_type >(*i);
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____delete2__(std::vector< int > *self,std::vector< int >::value_type const &i){
+      VALUE r = Qnil;
+      return r;
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__select(std::vector< int > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< int,std::allocator< int > >* r = new std::vector< int,std::allocator< int > >();
+      std::vector< int,std::allocator< int > >::const_iterator i = self->begin();
+      std::vector< int,std::allocator< int > >::const_iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE v = swig::from< std::vector< int,std::allocator< int > >::value_type >(*i);
+	  if ( RTEST( rb_yield(v) ) )
+	    self->insert( r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__delete_at(std::vector< int > *self,std::vector< int >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	std::vector< int,std::allocator< int > >::iterator at = swig::getpos(self, i);
+	r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(at) );
+	self->erase(at); 
+      }
+      catch (const std::out_of_range&) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__at(std::vector< int > const *self,std::vector< int >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > const *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< int,std::allocator< int > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< int,std::allocator< int > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_2(std::vector< int > const *self,VALUE i){
+      if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) {
+        rb_raise( rb_eTypeError, "not a valid index or range" );
+      }
+
+      static ID id_end   = rb_intern("end");
+      static ID id_start = rb_intern("begin");
+      static ID id_noend = rb_intern("exclude_end?");
+
+      VALUE start = rb_funcall( i, id_start, 0 );
+      VALUE end   = rb_funcall( i, id_end, 0 );
+      bool  noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue );
+
+      int len = self->size();
+
+      int s = NUM2INT( start );
+      if ( s < 0 ) {
+        s = len + s;
+        if ( s < 0 )
+          return Qnil;
+      } else if ( s > len )
+        return Qnil;
+
+      int e = NUM2INT( end );
+      if ( e < 0 ) e = len + e;
+      if ( noend ) e -= 1;
+      if ( e < 0 ) e = -1;
+      if ( e >= len ) e = len - 1;
+      if ( s == len ) e = len - 1;
+
+      return swig::from< std::vector< int,std::allocator< int > >* >( swig::getslice(self, s, e+1) );
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){
+	if ( i >= static_cast<std::vector< int,std::allocator< int > >::difference_type>( self->size()) )
+          swig::resize( self, i+1, x );
+        else
+          *(swig::getpos(self, i)) = x;
+
+	return swig::from< std::vector< int,std::allocator< int > >::value_type >( x );
+      }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length,std::vector< int,std::allocator< int > > const &v){
+
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< int,std::allocator< int > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< int,std::allocator< int > >::difference_type>(len) ) {
+        swig::resize( self, j, *(v.begin()) );
+      }
+
+      VALUE r = Qnil;
+      swig::setslice(self, i, j, v);
+      r = swig::from< const std::vector< int,std::allocator< int > >* >( &v );
+      return r;
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__reject_bang(std::vector< int > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      self->erase( std::remove_if( self->begin(), self->end(),
+            swig::yield< std::vector< int,std::allocator< int > >::value_type >() ), self->end() );
+      return self;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__pop(std::vector< int > *self){
+      if (self->empty()) return Qnil;
+      std::vector< int,std::allocator< int > >::value_type x = self->back();
+      self->pop_back();
+      return swig::from< std::vector< int,std::allocator< int > >::value_type >( x );
+    }
+SWIGINTERN std::vector< int >::value_type const std_vector_Sl_int_Sg__push(std::vector< int > *self,std::vector< int >::value_type const &e){
+      self->push_back( e );
+      return e;
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__reject(std::vector< int > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< int,std::allocator< int > >* r = new std::vector< int,std::allocator< int > >();
+      std::remove_copy_if( self->begin(), self->end(),              
+			   std::back_inserter(*r),
+			   swig::yield< std::vector< int,std::allocator< int > >::value_type >() );
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_int_Sg__shift(std::vector< int > *self){
+      if (self->empty()) return Qnil;
+      std::vector< int,std::allocator< int > >::value_type x = self->front();
+      self->erase( self->begin() );
+      return swig::from< std::vector< int,std::allocator< int > >::value_type >( x );
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::difference_type pos,int argc,VALUE *argv,...){
+      std::size_t len = self->size();
+      std::size_t   i = swig::check_index( pos, len, true );
+      std::vector< int,std::allocator< int > >::iterator start;
+
+      VALUE elem = argv[0];
+      int idx = 0;
+      try {
+	std::vector< int,std::allocator< int > >::value_type val = swig::as<std::vector< int,std::allocator< int > >::value_type>( elem );
+	if ( i >= len ) {
+	  self->resize(i-1, val);
+	  return self;
+	}
+	start = self->begin();
+	std::advance( start, i );
+	self->insert( start++, val );
+
+	for ( ++idx; idx < argc; ++idx )
+	  {
+	    elem = argv[idx];
+	    val = swig::as<std::vector< int,std::allocator< int > >::value_type>( elem );
+	    self->insert( start++, val );
+	  }
+
+      } 
+      catch(const std::invalid_argument &)
+	{
+	  rb_raise( rb_eArgError, "%s",
+		    Ruby_Format_TypeError( "", 
+					   swig::type_name<std::vector< int,std::allocator< int > >::value_type>(),
+					   __FUNCTION__, idx+2, elem ));
+	}
+
+
+      return self;
+    }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__unshift(std::vector< int > *self,int argc,VALUE *argv,...){
+      for ( int idx = argc-1; idx >= 0; --idx )
+	{
+	  std::vector< int,std::allocator< int > >::iterator start = self->begin();
+	  VALUE elem = argv[idx];
+	  try {
+	    std::vector< int,std::allocator< int > >::value_type val = swig::as<std::vector< int,std::allocator< int > >::value_type>( elem );
+	    self->insert( start, val );
+	  }
+	  catch(const std::invalid_argument &)
+	    {
+	      rb_raise( rb_eArgError, "%s",
+			Ruby_Format_TypeError( "", 
+					       swig::type_name<std::vector< int,std::allocator< int > >::value_type>(),
+					       __FUNCTION__, idx+2, elem ));
+	    }
+	}
+
+      return self;
+    }
+
+SWIGINTERNINLINE VALUE
+SWIG_From_unsigned_SS_long  (unsigned long value)
+{
+  return ULONG2NUM(value); 
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE VALUE 
+SWIG_From_unsigned_SS_long_SS_long  (unsigned long long value)
+{
+  return ULL2NUM(value);
+}
+#endif
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_size_t  (size_t value)
+{    
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(size_t) <= sizeof(unsigned long long) */
+    return SWIG_From_unsigned_SS_long_SS_long  (static_cast< unsigned long long >(value));
+  }
+#endif
+}
+
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_2(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); }
+SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__map_bang(std::vector< int > *self){
+
+    if ( !rb_block_given_p() )
+      rb_raise( rb_eArgError, "No block given" );
+
+    VALUE r = Qnil;
+    std::vector< int >::iterator i = self->begin();
+    std::vector< int >::iterator e = self->end();
+
+    try {
+      for ( ; i != e; ++i )
+	{
+	  r = swig::from< int >( *i );
+	  r = rb_yield( r );
+	  *i = swig::as< int >( r );
+	}
+    }
+    catch (const std::invalid_argument&)
+      {
+	rb_raise(rb_eTypeError,
+		 "Yield block did not return a valid element for " "std::vector");
+      }
+    
+    return self;
+  }
+SWIGINTERN VALUE std_vector_Sl_int_Sg____delete__(std::vector< int > *self,int const &val){
+    VALUE r = Qnil;
+    std::vector<int >::iterator e = self->end();
+    std::vector<int >::iterator i = std::remove( self->begin(), e, val );
+    // remove dangling elements now
+    self->erase( i, e );
+    
+    if ( i != e )
+      r = swig::from< int >( val );
+    else if ( rb_block_given_p() )
+      r = rb_yield(Qnil);
+    return r;
+  }
+
+/*@SWIG:/sw/spack-levante/swig-4.0.2-2xopcb/share/swig/4.0.2/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/
+SWIGINTERN VALUE SWIG_AUX_NUM2DBL(VALUE arg)
+{
+  VALUE *args = (VALUE *)arg;
+  VALUE obj = args[0];
+  VALUE type = TYPE(obj);
+  double *res = (double *)(args[1]);
+  *res = NUM2DBL(obj); (void)type;
+  return obj;
+}
+/*@SWIG@*/
+
+SWIGINTERN int
+SWIG_AsVal_double (VALUE obj, double *val)
+{
+  VALUE type = TYPE(obj);
+  if ((type == T_FLOAT) || (type == T_FIXNUM) || (type == T_BIGNUM)) {
+    double v;
+    VALUE a[2];
+    a[0] = obj;
+    a[1] = (VALUE)(&v);
+    if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2DBL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) {
+      if (val) *val = v;
+      return SWIG_OK;
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+  #define SWIG_From_double   rb_float_new 
+
+
+namespace swig {
+  template <> struct traits< double > {
+    typedef value_category category;
+    static const char* type_name() { return"double"; }
+  };
+  template <>  struct traits_asval< double > {
+    typedef double value_type;
+    static int asval(VALUE obj, value_type *val) {
+      return SWIG_AsVal_double (obj, val);
+    }
+  };
+  template <>  struct traits_from< double > {
+    typedef double value_type;
+    static VALUE from(const value_type& val) {
+      return SWIG_From_double  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< double, std::allocator< double > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "double" "," "std::allocator< double >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__dup(std::vector< double > *self){
+      return new std::vector< double,std::allocator< double > >(*self);
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__inspect(std::vector< double > *self){
+      std::vector< double,std::allocator< double > >::const_iterator i = self->begin();
+      std::vector< double,std::allocator< double > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::vector< double,std::allocator< double > > >();
+      VALUE str = rb_str_new2(type_name);
+      str = rb_str_cat2( str, " [" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "]" );
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__to_a(std::vector< double > *self){
+      std::vector< double,std::allocator< double > >::const_iterator i = self->begin();
+      std::vector< double,std::allocator< double > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__to_s(std::vector< double > *self){
+      std::vector< double,std::allocator< double > >::iterator i = self->begin();
+      std::vector< double,std::allocator< double > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__slice(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< double,std::allocator< double > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< double,std::allocator< double > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__each(std::vector< double > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::vector< double,std::allocator< double > >::const_iterator i = self->begin();
+	std::vector< double,std::allocator< double > >::const_iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from< std::vector< double,std::allocator< double > >::value_type >(*i);
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____delete2__(std::vector< double > *self,std::vector< double >::value_type const &i){
+      VALUE r = Qnil;
+      return r;
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__select(std::vector< double > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< double,std::allocator< double > >* r = new std::vector< double,std::allocator< double > >();
+      std::vector< double,std::allocator< double > >::const_iterator i = self->begin();
+      std::vector< double,std::allocator< double > >::const_iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE v = swig::from< std::vector< double,std::allocator< double > >::value_type >(*i);
+	  if ( RTEST( rb_yield(v) ) )
+	    self->insert( r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__delete_at(std::vector< double > *self,std::vector< double >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	std::vector< double,std::allocator< double > >::iterator at = swig::getpos(self, i);
+	r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(at) );
+	self->erase(at); 
+      }
+      catch (const std::out_of_range&) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__at(std::vector< double > const *self,std::vector< double >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > const *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< double,std::allocator< double > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< double,std::allocator< double > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_2(std::vector< double > const *self,VALUE i){
+      if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) {
+        rb_raise( rb_eTypeError, "not a valid index or range" );
+      }
+
+      static ID id_end   = rb_intern("end");
+      static ID id_start = rb_intern("begin");
+      static ID id_noend = rb_intern("exclude_end?");
+
+      VALUE start = rb_funcall( i, id_start, 0 );
+      VALUE end   = rb_funcall( i, id_end, 0 );
+      bool  noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue );
+
+      int len = self->size();
+
+      int s = NUM2INT( start );
+      if ( s < 0 ) {
+        s = len + s;
+        if ( s < 0 )
+          return Qnil;
+      } else if ( s > len )
+        return Qnil;
+
+      int e = NUM2INT( end );
+      if ( e < 0 ) e = len + e;
+      if ( noend ) e -= 1;
+      if ( e < 0 ) e = -1;
+      if ( e >= len ) e = len - 1;
+      if ( s == len ) e = len - 1;
+
+      return swig::from< std::vector< double,std::allocator< double > >* >( swig::getslice(self, s, e+1) );
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){
+	if ( i >= static_cast<std::vector< double,std::allocator< double > >::difference_type>( self->size()) )
+          swig::resize( self, i+1, x );
+        else
+          *(swig::getpos(self, i)) = x;
+
+	return swig::from< std::vector< double,std::allocator< double > >::value_type >( x );
+      }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length,std::vector< double,std::allocator< double > > const &v){
+
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< double,std::allocator< double > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< double,std::allocator< double > >::difference_type>(len) ) {
+        swig::resize( self, j, *(v.begin()) );
+      }
+
+      VALUE r = Qnil;
+      swig::setslice(self, i, j, v);
+      r = swig::from< const std::vector< double,std::allocator< double > >* >( &v );
+      return r;
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__reject_bang(std::vector< double > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      self->erase( std::remove_if( self->begin(), self->end(),
+            swig::yield< std::vector< double,std::allocator< double > >::value_type >() ), self->end() );
+      return self;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__pop(std::vector< double > *self){
+      if (self->empty()) return Qnil;
+      std::vector< double,std::allocator< double > >::value_type x = self->back();
+      self->pop_back();
+      return swig::from< std::vector< double,std::allocator< double > >::value_type >( x );
+    }
+SWIGINTERN std::vector< double >::value_type const std_vector_Sl_double_Sg__push(std::vector< double > *self,std::vector< double >::value_type const &e){
+      self->push_back( e );
+      return e;
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__reject(std::vector< double > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< double,std::allocator< double > >* r = new std::vector< double,std::allocator< double > >();
+      std::remove_copy_if( self->begin(), self->end(),              
+			   std::back_inserter(*r),
+			   swig::yield< std::vector< double,std::allocator< double > >::value_type >() );
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_double_Sg__shift(std::vector< double > *self){
+      if (self->empty()) return Qnil;
+      std::vector< double,std::allocator< double > >::value_type x = self->front();
+      self->erase( self->begin() );
+      return swig::from< std::vector< double,std::allocator< double > >::value_type >( x );
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::difference_type pos,int argc,VALUE *argv,...){
+      std::size_t len = self->size();
+      std::size_t   i = swig::check_index( pos, len, true );
+      std::vector< double,std::allocator< double > >::iterator start;
+
+      VALUE elem = argv[0];
+      int idx = 0;
+      try {
+	std::vector< double,std::allocator< double > >::value_type val = swig::as<std::vector< double,std::allocator< double > >::value_type>( elem );
+	if ( i >= len ) {
+	  self->resize(i-1, val);
+	  return self;
+	}
+	start = self->begin();
+	std::advance( start, i );
+	self->insert( start++, val );
+
+	for ( ++idx; idx < argc; ++idx )
+	  {
+	    elem = argv[idx];
+	    val = swig::as<std::vector< double,std::allocator< double > >::value_type>( elem );
+	    self->insert( start++, val );
+	  }
+
+      } 
+      catch(const std::invalid_argument &)
+	{
+	  rb_raise( rb_eArgError, "%s",
+		    Ruby_Format_TypeError( "", 
+					   swig::type_name<std::vector< double,std::allocator< double > >::value_type>(),
+					   __FUNCTION__, idx+2, elem ));
+	}
+
+
+      return self;
+    }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__unshift(std::vector< double > *self,int argc,VALUE *argv,...){
+      for ( int idx = argc-1; idx >= 0; --idx )
+	{
+	  std::vector< double,std::allocator< double > >::iterator start = self->begin();
+	  VALUE elem = argv[idx];
+	  try {
+	    std::vector< double,std::allocator< double > >::value_type val = swig::as<std::vector< double,std::allocator< double > >::value_type>( elem );
+	    self->insert( start, val );
+	  }
+	  catch(const std::invalid_argument &)
+	    {
+	      rb_raise( rb_eArgError, "%s",
+			Ruby_Format_TypeError( "", 
+					       swig::type_name<std::vector< double,std::allocator< double > >::value_type>(),
+					       __FUNCTION__, idx+2, elem ));
+	    }
+	}
+
+      return self;
+    }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_2(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); }
+SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__map_bang(std::vector< double > *self){
+
+    if ( !rb_block_given_p() )
+      rb_raise( rb_eArgError, "No block given" );
+
+    VALUE r = Qnil;
+    std::vector< double >::iterator i = self->begin();
+    std::vector< double >::iterator e = self->end();
+
+    try {
+      for ( ; i != e; ++i )
+	{
+	  r = swig::from< double >( *i );
+	  r = rb_yield( r );
+	  *i = swig::as< double >( r );
+	}
+    }
+    catch (const std::invalid_argument&)
+      {
+	rb_raise(rb_eTypeError,
+		 "Yield block did not return a valid element for " "std::vector");
+      }
+    
+    return self;
+  }
+SWIGINTERN VALUE std_vector_Sl_double_Sg____delete__(std::vector< double > *self,double const &val){
+    VALUE r = Qnil;
+    std::vector<double >::iterator e = self->end();
+    std::vector<double >::iterator i = std::remove( self->begin(), e, val );
+    // remove dangling elements now
+    self->erase( i, e );
+    
+    if ( i != e )
+      r = swig::from< double >( val );
+    else if ( rb_block_given_p() )
+      r = rb_yield(Qnil);
+    return r;
+  }
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::vector< double,std::allocator< double > >, std::allocator< std::vector< double,std::allocator< double > > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__dup(std::vector< std::vector< double > > *self){
+      return new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >(*self);
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__inspect(std::vector< std::vector< double > > *self){
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin();
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > >();
+      VALUE str = rb_str_new2(type_name);
+      str = rb_str_cat2( str, " [" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "]" );
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_a(std::vector< std::vector< double > > *self){
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin();
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_s(std::vector< std::vector< double > > *self){
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator i = self->begin();
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__slice(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__each(std::vector< std::vector< double > > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin();
+	std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >(*i);
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____delete2__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &i){
+      VALUE r = Qnil;
+      return r;
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__select(std::vector< std::vector< double > > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* r = new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >();
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin();
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE v = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >(*i);
+	  if ( RTEST( rb_yield(v) ) )
+	    self->insert( r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__delete_at(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator at = swig::getpos(self, i);
+	r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(at) );
+	self->erase(at); 
+      }
+      catch (const std::out_of_range&) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__at(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_2(std::vector< std::vector< double > > const *self,VALUE i){
+      if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) {
+        rb_raise( rb_eTypeError, "not a valid index or range" );
+      }
+
+      static ID id_end   = rb_intern("end");
+      static ID id_start = rb_intern("begin");
+      static ID id_noend = rb_intern("exclude_end?");
+
+      VALUE start = rb_funcall( i, id_start, 0 );
+      VALUE end   = rb_funcall( i, id_end, 0 );
+      bool  noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue );
+
+      int len = self->size();
+
+      int s = NUM2INT( start );
+      if ( s < 0 ) {
+        s = len + s;
+        if ( s < 0 )
+          return Qnil;
+      } else if ( s > len )
+        return Qnil;
+
+      int e = NUM2INT( end );
+      if ( e < 0 ) e = len + e;
+      if ( noend ) e -= 1;
+      if ( e < 0 ) e = -1;
+      if ( e >= len ) e = len - 1;
+      if ( s == len ) e = len - 1;
+
+      return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, s, e+1) );
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){
+	if ( i >= static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>( self->size()) )
+          swig::resize( self, i+1, x );
+        else
+          *(swig::getpos(self, i)) = x;
+
+	return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x );
+      }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){
+
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) ) {
+        swig::resize( self, j, *(v.begin()) );
+      }
+
+      VALUE r = Qnil;
+      swig::setslice(self, i, j, v);
+      r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( &v );
+      return r;
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject_bang(std::vector< std::vector< double > > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      self->erase( std::remove_if( self->begin(), self->end(),
+            swig::yield< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >() ), self->end() );
+      return self;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){
+      if (self->empty()) return Qnil;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back();
+      self->pop_back();
+      return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x );
+    }
+SWIGINTERN std::vector< std::vector< double > >::value_type const std_vector_Sl_std_vector_Sl_double_Sg__Sg__push(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &e){
+      self->push_back( e );
+      return e;
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject(std::vector< std::vector< double > > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* r = new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >();
+      std::remove_copy_if( self->begin(), self->end(),              
+			   std::back_inserter(*r),
+			   swig::yield< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >() );
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__shift(std::vector< std::vector< double > > *self){
+      if (self->empty()) return Qnil;
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->front();
+      self->erase( self->begin() );
+      return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x );
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type pos,int argc,VALUE *argv,...){
+      std::size_t len = self->size();
+      std::size_t   i = swig::check_index( pos, len, true );
+      std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator start;
+
+      VALUE elem = argv[0];
+      int idx = 0;
+      try {
+	std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type val = swig::as<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem );
+	if ( i >= len ) {
+	  self->resize(i-1, val);
+	  return self;
+	}
+	start = self->begin();
+	std::advance( start, i );
+	self->insert( start++, val );
+
+	for ( ++idx; idx < argc; ++idx )
+	  {
+	    elem = argv[idx];
+	    val = swig::as<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem );
+	    self->insert( start++, val );
+	  }
+
+      } 
+      catch(const std::invalid_argument &)
+	{
+	  rb_raise( rb_eArgError, "%s",
+		    Ruby_Format_TypeError( "", 
+					   swig::type_name<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>(),
+					   __FUNCTION__, idx+2, elem ));
+	}
+
+
+      return self;
+    }
+SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__unshift(std::vector< std::vector< double > > *self,int argc,VALUE *argv,...){
+      for ( int idx = argc-1; idx >= 0; --idx )
+	{
+	  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator start = self->begin();
+	  VALUE elem = argv[idx];
+	  try {
+	    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type val = swig::as<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem );
+	    self->insert( start, val );
+	  }
+	  catch(const std::invalid_argument &)
+	    {
+	      rb_raise( rb_eArgError, "%s",
+			Ruby_Format_TypeError( "", 
+					       swig::type_name<std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>(),
+					       __FUNCTION__, idx+2, elem ));
+	    }
+	}
+
+      return self;
+    }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); }
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc)
+{
+  if (TYPE(obj) == T_STRING) {
+    char *cstr = StringValuePtr(obj); 
+    size_t size = RSTRING_LEN(obj) + 1;
+    if (cptr)  {
+      if (alloc) {
+	if (*alloc == SWIG_NEWOBJ) {
+	  *cptr = reinterpret_cast< char* >(memcpy(new char[size], cstr, sizeof(char)*(size)));
+	} else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      }
+    }
+    if (psize) *psize = size;
+    return SWIG_OK;
+  } else {
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *)vptr;
+	if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }  
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN int
+SWIG_AsPtr_std_string (VALUE obj, std::string **val) 
+{
+  char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ;
+  if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) {
+    if (buf) {
+      if (val) *val = new std::string(buf, size - 1);
+      if (alloc == SWIG_NEWOBJ) delete[] buf;
+      return SWIG_NEWOBJ;
+    } else {
+      if (val) *val = 0;
+      return SWIG_OLDOBJ;
+    }
+  } else {
+    static int init = 0;
+    static swig_type_info* descriptor = 0;
+    if (!init) {
+      descriptor = SWIG_TypeQuery("std::string" " *");
+      init = 1;
+    }
+    if (descriptor) {
+      std::string *vptr;
+      int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0);
+      if (SWIG_IsOK(res) && val) *val = vptr;
+      return res;
+    }
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_std_string (VALUE obj, std::string *val)
+{
+  std::string* v = (std::string *) 0;
+  int res = SWIG_AsPtr_std_string (obj, &v);
+  if (!SWIG_IsOK(res)) return res;
+  if (v) {
+    if (val) *val = *v;
+    if (SWIG_IsNewObj(res)) {
+      delete v;
+      res = SWIG_DelNewMask(res);
+    }
+    return res;
+  }
+  return SWIG_ERROR;
+}
+
+
+SWIGINTERNINLINE VALUE 
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > LONG_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : Qnil;
+    } else {
+      return rb_str_new(carray, static_cast< long >(size));
+    }
+  } else {
+    return Qnil;
+  }
+}
+
+
+SWIGINTERNINLINE VALUE
+SWIG_From_std_string  (const std::string& s)
+{
+  return SWIG_FromCharPtrAndSize(s.data(), s.size());
+}
+
+
+namespace swig {
+  template <> struct traits< std::string > {
+    typedef value_category category;
+    static const char* type_name() { return"std::string"; }
+  };
+  template <>  struct traits_asval< std::string > {
+    typedef std::string value_type;
+    static int asval(VALUE obj, value_type *val) {
+      return SWIG_AsVal_std_string (obj, val);
+    }
+  };
+  template <>  struct traits_from< std::string > {
+    typedef std::string value_type;
+    static VALUE from(const value_type& val) {
+      return SWIG_From_std_string  (val);
+    }
+  };
+}
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< std::string, std::allocator< std::string > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "std::string" "," "std::allocator< std::string >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__dup(std::vector< std::string > *self){
+      return new std::vector< std::string,std::allocator< std::string > >(*self);
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__inspect(std::vector< std::string > *self){
+      std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin();
+      std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::vector< std::string,std::allocator< std::string > > >();
+      VALUE str = rb_str_new2(type_name);
+      str = rb_str_cat2( str, " [" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "]" );
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__to_a(std::vector< std::string > *self){
+      std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin();
+      std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__to_s(std::vector< std::string > *self){
+      std::vector< std::string,std::allocator< std::string > >::iterator i = self->begin();
+      std::vector< std::string,std::allocator< std::string > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__slice(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__each(std::vector< std::string > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin();
+	std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >(*i);
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____delete2__(std::vector< std::string > *self,std::vector< std::string >::value_type const &i){
+      VALUE r = Qnil;
+      return r;
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__select(std::vector< std::string > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< std::string,std::allocator< std::string > >* r = new std::vector< std::string,std::allocator< std::string > >();
+      std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin();
+      std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE v = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >(*i);
+	  if ( RTEST( rb_yield(v) ) )
+	    self->insert( r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__delete_at(std::vector< std::string > *self,std::vector< std::string >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	std::vector< std::string,std::allocator< std::string > >::iterator at = swig::getpos(self, i);
+	r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(at) );
+	self->erase(at); 
+      }
+      catch (const std::out_of_range&) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__at(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > const *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_2(std::vector< std::string > const *self,VALUE i){
+      if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) {
+        rb_raise( rb_eTypeError, "not a valid index or range" );
+      }
+
+      static ID id_end   = rb_intern("end");
+      static ID id_start = rb_intern("begin");
+      static ID id_noend = rb_intern("exclude_end?");
+
+      VALUE start = rb_funcall( i, id_start, 0 );
+      VALUE end   = rb_funcall( i, id_end, 0 );
+      bool  noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue );
+
+      int len = self->size();
+
+      int s = NUM2INT( start );
+      if ( s < 0 ) {
+        s = len + s;
+        if ( s < 0 )
+          return Qnil;
+      } else if ( s > len )
+        return Qnil;
+
+      int e = NUM2INT( end );
+      if ( e < 0 ) e = len + e;
+      if ( noend ) e -= 1;
+      if ( e < 0 ) e = -1;
+      if ( e >= len ) e = len - 1;
+      if ( s == len ) e = len - 1;
+
+      return swig::from< std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, s, e+1) );
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){
+	if ( i >= static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>( self->size()) )
+          swig::resize( self, i+1, x );
+        else
+          *(swig::getpos(self, i)) = x;
+
+	return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x );
+      }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length,std::vector< std::string,std::allocator< std::string > > const &v){
+
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< std::string,std::allocator< std::string > >::difference_type>(len) ) {
+        swig::resize( self, j, *(v.begin()) );
+      }
+
+      VALUE r = Qnil;
+      swig::setslice(self, i, j, v);
+      r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( &v );
+      return r;
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__reject_bang(std::vector< std::string > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      self->erase( std::remove_if( self->begin(), self->end(),
+            swig::yield< std::vector< std::string,std::allocator< std::string > >::value_type >() ), self->end() );
+      return self;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){
+      if (self->empty()) return Qnil;
+      std::vector< std::string,std::allocator< std::string > >::value_type x = self->back();
+      self->pop_back();
+      return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x );
+    }
+SWIGINTERN std::vector< std::string >::value_type const std_vector_Sl_std_string_Sg__push(std::vector< std::string > *self,std::vector< std::string >::value_type const &e){
+      self->push_back( e );
+      return e;
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__reject(std::vector< std::string > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< std::string,std::allocator< std::string > >* r = new std::vector< std::string,std::allocator< std::string > >();
+      std::remove_copy_if( self->begin(), self->end(),              
+			   std::back_inserter(*r),
+			   swig::yield< std::vector< std::string,std::allocator< std::string > >::value_type >() );
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg__shift(std::vector< std::string > *self){
+      if (self->empty()) return Qnil;
+      std::vector< std::string,std::allocator< std::string > >::value_type x = self->front();
+      self->erase( self->begin() );
+      return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x );
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type pos,int argc,VALUE *argv,...){
+      std::size_t len = self->size();
+      std::size_t   i = swig::check_index( pos, len, true );
+      std::vector< std::string,std::allocator< std::string > >::iterator start;
+
+      VALUE elem = argv[0];
+      int idx = 0;
+      try {
+	std::vector< std::string,std::allocator< std::string > >::value_type val = swig::as<std::vector< std::string,std::allocator< std::string > >::value_type>( elem );
+	if ( i >= len ) {
+	  self->resize(i-1, val);
+	  return self;
+	}
+	start = self->begin();
+	std::advance( start, i );
+	self->insert( start++, val );
+
+	for ( ++idx; idx < argc; ++idx )
+	  {
+	    elem = argv[idx];
+	    val = swig::as<std::vector< std::string,std::allocator< std::string > >::value_type>( elem );
+	    self->insert( start++, val );
+	  }
+
+      } 
+      catch(const std::invalid_argument &)
+	{
+	  rb_raise( rb_eArgError, "%s",
+		    Ruby_Format_TypeError( "", 
+					   swig::type_name<std::vector< std::string,std::allocator< std::string > >::value_type>(),
+					   __FUNCTION__, idx+2, elem ));
+	}
+
+
+      return self;
+    }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__unshift(std::vector< std::string > *self,int argc,VALUE *argv,...){
+      for ( int idx = argc-1; idx >= 0; --idx )
+	{
+	  std::vector< std::string,std::allocator< std::string > >::iterator start = self->begin();
+	  VALUE elem = argv[idx];
+	  try {
+	    std::vector< std::string,std::allocator< std::string > >::value_type val = swig::as<std::vector< std::string,std::allocator< std::string > >::value_type>( elem );
+	    self->insert( start, val );
+	  }
+	  catch(const std::invalid_argument &)
+	    {
+	      rb_raise( rb_eArgError, "%s",
+			Ruby_Format_TypeError( "", 
+					       swig::type_name<std::vector< std::string,std::allocator< std::string > >::value_type>(),
+					       __FUNCTION__, idx+2, elem ));
+	    }
+	}
+
+      return self;
+    }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_2(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); }
+SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__map_bang(std::vector< std::string > *self){
+
+    if ( !rb_block_given_p() )
+      rb_raise( rb_eArgError, "No block given" );
+
+    VALUE r = Qnil;
+    std::vector< std::string >::iterator i = self->begin();
+    std::vector< std::string >::iterator e = self->end();
+
+    try {
+      for ( ; i != e; ++i )
+	{
+	  r = swig::from< std::string >( *i );
+	  r = rb_yield( r );
+	  *i = swig::as< std::string >( r );
+	}
+    }
+    catch (const std::invalid_argument&)
+      {
+	rb_raise(rb_eTypeError,
+		 "Yield block did not return a valid element for " "std::vector");
+      }
+    
+    return self;
+  }
+SWIGINTERN VALUE std_vector_Sl_std_string_Sg____delete__(std::vector< std::string > *self,std::string const &val){
+    VALUE r = Qnil;
+    std::vector<std::string >::iterator e = self->end();
+    std::vector<std::string >::iterator i = std::remove( self->begin(), e, val );
+    // remove dangling elements now
+    self->erase( i, e );
+    
+    if ( i != e )
+      r = swig::from< std::string >( val );
+    else if ( rb_block_given_p() )
+      r = rb_yield(Qnil);
+    return r;
+  }
+
+  namespace swig {
+    template <>  struct traits< CdiVariable > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiVariable"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::vector< CdiVariable, std::allocator< CdiVariable > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::vector<" "CdiVariable" "," "std::allocator< CdiVariable >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__dup(std::vector< CdiVariable > *self){
+      return new std::vector< CdiVariable,std::allocator< CdiVariable > >(*self);
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__inspect(std::vector< CdiVariable > *self){
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin();
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::vector< CdiVariable,std::allocator< CdiVariable > > >();
+      VALUE str = rb_str_new2(type_name);
+      str = rb_str_cat2( str, " [" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "]" );
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__to_a(std::vector< CdiVariable > *self){
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin();
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__to_s(std::vector< CdiVariable > *self){
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator i = self->begin();
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__slice(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__each(std::vector< CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin();
+	std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >(*i);
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____delete2__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &i){
+      VALUE r = Qnil;
+      return r;
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__select(std::vector< CdiVariable > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< CdiVariable,std::allocator< CdiVariable > >* r = new std::vector< CdiVariable,std::allocator< CdiVariable > >();
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin();
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE v = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >(*i);
+	  if ( RTEST( rb_yield(v) ) )
+	    self->insert( r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__delete_at(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator at = swig::getpos(self, i);
+	r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(at) );
+	self->erase(at); 
+      }
+      catch (const std::out_of_range&) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__at(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length){
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) )
+        j = len;
+
+      VALUE r = Qnil;
+      try {
+	r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, i, j) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){
+      VALUE r = Qnil;
+      try {
+	r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(swig::cgetpos(self, i)) );
+      }
+      catch( const std::out_of_range& ) {
+      }
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_2(std::vector< CdiVariable > const *self,VALUE i){
+      if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) {
+        rb_raise( rb_eTypeError, "not a valid index or range" );
+      }
+
+      static ID id_end   = rb_intern("end");
+      static ID id_start = rb_intern("begin");
+      static ID id_noend = rb_intern("exclude_end?");
+
+      VALUE start = rb_funcall( i, id_start, 0 );
+      VALUE end   = rb_funcall( i, id_end, 0 );
+      bool  noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue );
+
+      int len = self->size();
+
+      int s = NUM2INT( start );
+      if ( s < 0 ) {
+        s = len + s;
+        if ( s < 0 )
+          return Qnil;
+      } else if ( s > len )
+        return Qnil;
+
+      int e = NUM2INT( end );
+      if ( e < 0 ) e = len + e;
+      if ( noend ) e -= 1;
+      if ( e < 0 ) e = -1;
+      if ( e >= len ) e = len - 1;
+      if ( s == len ) e = len - 1;
+
+      return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, s, e+1) );
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::value_type const &x){
+	if ( i >= static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>( self->size()) )
+          swig::resize( self, i+1, x );
+        else
+          *(swig::getpos(self, i)) = x;
+
+	return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x );
+      }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){
+
+      if ( length < 0 )
+        return Qnil;
+      std::size_t len = self->size();
+      if ( i < 0 ) {
+        if ( i + static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) < 0 )
+          return Qnil;
+        else
+          i = len + i;
+      }
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i;
+      if ( j > static_cast<std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type>(len) ) {
+        swig::resize( self, j, *(v.begin()) );
+      }
+
+      VALUE r = Qnil;
+      swig::setslice(self, i, j, v);
+      r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( &v );
+      return r;
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__reject_bang(std::vector< CdiVariable > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      self->erase( std::remove_if( self->begin(), self->end(),
+            swig::yield< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >() ), self->end() );
+      return self;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__pop(std::vector< CdiVariable > *self){
+      if (self->empty()) return Qnil;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->back();
+      self->pop_back();
+      return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x );
+    }
+SWIGINTERN std::vector< CdiVariable >::value_type const std_vector_Sl_CdiVariable_Sg__push(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &e){
+      self->push_back( e );
+      return e;
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__reject(std::vector< CdiVariable > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::vector< CdiVariable,std::allocator< CdiVariable > >* r = new std::vector< CdiVariable,std::allocator< CdiVariable > >();
+      std::remove_copy_if( self->begin(), self->end(),              
+			   std::back_inserter(*r),
+			   swig::yield< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >() );
+      return r;
+    }
+SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__shift(std::vector< CdiVariable > *self){
+      if (self->empty()) return Qnil;
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->front();
+      self->erase( self->begin() );
+      return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x );
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type pos,int argc,VALUE *argv,...){
+      std::size_t len = self->size();
+      std::size_t   i = swig::check_index( pos, len, true );
+      std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator start;
+
+      VALUE elem = argv[0];
+      int idx = 0;
+      try {
+	std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type val = swig::as<std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type>( elem );
+	if ( i >= len ) {
+	  self->resize(i-1, val);
+	  return self;
+	}
+	start = self->begin();
+	std::advance( start, i );
+	self->insert( start++, val );
+
+	for ( ++idx; idx < argc; ++idx )
+	  {
+	    elem = argv[idx];
+	    val = swig::as<std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type>( elem );
+	    self->insert( start++, val );
+	  }
+
+      } 
+      catch(const std::invalid_argument &)
+	{
+	  rb_raise( rb_eArgError, "%s",
+		    Ruby_Format_TypeError( "", 
+					   swig::type_name<std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type>(),
+					   __FUNCTION__, idx+2, elem ));
+	}
+
+
+      return self;
+    }
+SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__unshift(std::vector< CdiVariable > *self,int argc,VALUE *argv,...){
+      for ( int idx = argc-1; idx >= 0; --idx )
+	{
+	  std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator start = self->begin();
+	  VALUE elem = argv[idx];
+	  try {
+	    std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type val = swig::as<std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type>( elem );
+	    self->insert( start, val );
+	  }
+	  catch(const std::invalid_argument &)
+	    {
+	      rb_raise( rb_eArgError, "%s",
+			Ruby_Format_TypeError( "", 
+					       swig::type_name<std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type>(),
+					       __FUNCTION__, idx+2, elem ));
+	    }
+	}
+
+      return self;
+    }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos){ return self->erase(pos); }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator first,std::vector< CdiVariable >::iterator last){ return self->erase(first, last); }
+SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::value_type const &x){ return self->insert(pos, x); }
+SWIGINTERN void std_vector_Sl_CdiVariable_Sg__insert__SWIG_2(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::size_type n,std::vector< CdiVariable >::value_type const &x){ self->insert(pos, n, x); }
+
+  namespace swig {
+
+    template <class T, class U >
+    struct traits_asval<std::pair<T,U> >  {
+      typedef std::pair<T,U> value_type;
+
+      static int get_pair(VALUE first, VALUE second,
+			  std::pair<T,U> *val)
+      {
+	if (val) {
+	  T *pfirst = &(val->first);
+	  int res1 = swig::asval((VALUE)first, pfirst);
+	  if (!SWIG_IsOK(res1)) return res1;
+	  U *psecond = &(val->second);
+	  int res2 = swig::asval((VALUE)second, psecond);
+	  if (!SWIG_IsOK(res2)) return res2;
+	  return res1 > res2 ? res1 : res2;
+	} else {
+	  T *pfirst = 0;
+	  int res1 = swig::asval((VALUE)first, pfirst);
+	  if (!SWIG_IsOK(res1)) return res1;
+	  U *psecond = 0;
+	  int res2 = swig::asval((VALUE)second, psecond);
+	  if (!SWIG_IsOK(res2)) return res2;
+	  return res1 > res2 ? res1 : res2;
+	}
+      }
+
+      static int asval(VALUE obj, std::pair<T,U> *val) {
+	int res = SWIG_ERROR;
+	if ( TYPE(obj) == T_ARRAY ) {
+	  if (RARRAY_LEN(obj) == 2) {
+	    VALUE first = rb_ary_entry(obj,0);
+	    VALUE second = rb_ary_entry(obj,1);
+	    res = get_pair(first, second, val);
+	  }
+	} else {
+	  value_type *p;
+	  swig_type_info *descriptor = swig::type_info<value_type>();
+	  res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+	  if (SWIG_IsOK(res) && val)  *val = *p;
+	}
+	return res;
+      }
+    };
+
+    template <class T, class U >
+    struct traits_asptr<std::pair<T,U> >  {
+      typedef std::pair<T,U> value_type;
+
+      static int get_pair(VALUE first, VALUE second,
+			  std::pair<T,U> **val) 
+      {
+	if (val) {
+	  value_type *vp = (new std::pair<T,U>());
+	  T *pfirst = &(vp->first);
+	  int res1 = swig::asval((VALUE)first, pfirst);
+	  if (!SWIG_IsOK(res1)) {
+	    delete vp;
+	    return res1;
+	  }
+	  U *psecond = &(vp->second);
+	  int res2 = swig::asval((VALUE)second, psecond);
+	  if (!SWIG_IsOK(res2)) {
+	    delete vp;
+	    return res2;
+	  }
+	  *val = vp;
+	  return SWIG_AddNewMask(res1 > res2 ? res1 : res2);
+	} else {
+	  T *pfirst = 0;
+	  int res1 = swig::asval((VALUE)first, pfirst);
+	  if (!SWIG_IsOK(res1)) return res1;
+	  U *psecond = 0;
+	  int res2 = swig::asval((VALUE)second, psecond);
+	  if (!SWIG_IsOK(res2)) return res2;
+	  return res1 > res2 ? res1 : res2;
+	}
+      }
+
+      static int asptr(VALUE obj, std::pair<T,U> **val) {
+	int res = SWIG_ERROR;
+	if ( TYPE(obj) == T_ARRAY ) {
+	  if ( RARRAY_LEN(obj) == 2) {
+	    VALUE first = rb_ary_entry(obj,0);
+	    VALUE second = rb_ary_entry(obj,1);
+	    res = get_pair(first, second, val);
+	  }
+	} else {
+	  value_type *p;
+	  swig_type_info *descriptor = swig::type_info<value_type>();
+	  res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+	  if (SWIG_IsOK(res) && val)  *val = p;
+	}
+	return res;
+      }
+    };
+
+
+
+    template <class T, class U >
+    struct traits_from<std::pair<T,U> >   {
+      static VALUE _wrap_pair_second( VALUE self )
+      {
+	std::pair< typename swig::noconst_traits<T >::noconst_type,U>* p = NULL;
+	swig::asptr( self, &p );
+	return swig::from( p->second );
+      }
+
+      static VALUE _wrap_pair_second_eq( VALUE self, VALUE arg )
+      {
+	std::pair< typename swig::noconst_traits<T >::noconst_type,U>* p = NULL;
+	swig::asptr( self, &p );
+	return swig::from( p->second );
+      }
+
+      static VALUE from(const std::pair<T,U>& val) {
+	VALUE obj = rb_ary_new2(2);
+	rb_ary_push(obj, swig::from<typename swig::noconst_traits<T >::noconst_type>(val.first));
+	rb_ary_push(obj, swig::from(val.second));
+	rb_define_singleton_method(obj, "second",
+				   VALUEFUNC(_wrap_pair_second), 0 );
+	rb_define_singleton_method(obj, "second=",
+				   VALUEFUNC(_wrap_pair_second_eq), 1 );
+	rb_obj_freeze(obj); // treat as immutable tuple
+	return obj;
+      }
+    };
+
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< std::string, CdiVariable > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "std::string" "," "CdiVariable" " >";
+	  }
+	};
+      }
+    
+
+  namespace swig {
+    template <class ValueType>
+    struct from_key_oper 
+    {
+      typedef const ValueType& argument_type;
+      typedef  VALUE result_type;
+      result_type operator()(argument_type v) const
+      {
+	return swig::from(v.first);
+      }
+    };
+
+    template <class ValueType>
+    struct from_value_oper 
+    {
+      typedef const ValueType& argument_type;
+      typedef  VALUE result_type;
+      result_type operator()(argument_type v) const
+      {
+	return swig::from(v.second);
+      }
+    };
+
+    template<class OutIterator, class FromOper, 
+	     class ValueType = typename OutIterator::value_type>
+    struct MapIterator_T : ConstIteratorClosed_T<OutIterator, ValueType, FromOper>
+    {
+      MapIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq)
+	: ConstIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+
+
+    template<class OutIterator,
+	     class FromOper = from_key_oper<typename OutIterator::value_type> >
+    struct MapKeyIterator_T : MapIterator_T<OutIterator, FromOper>
+    {
+      MapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq)
+	: MapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+
+    template<typename OutIter>
+    inline ConstIterator*
+    make_output_key_iterator(const OutIter& current, const OutIter& begin, 
+			     const OutIter& end, VALUE seq = 0)
+    {
+      return new MapKeyIterator_T<OutIter>(current, begin, end, seq);
+    }
+
+    template<class OutIterator,
+	     class FromOper = from_value_oper<typename OutIterator::value_type> >
+    struct MapValueIterator_T : MapIterator_T<OutIterator, FromOper>
+    {
+      MapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq)
+	: MapIterator_T<OutIterator, FromOper>(curr, first, last, seq)
+      {
+      }
+    };
+    
+
+    template<typename OutIter>
+    inline ConstIterator*
+    make_output_value_iterator(const OutIter& current, const OutIter& begin, 
+			       const OutIter& end, VALUE seq = 0)
+    {
+      return new MapValueIterator_T<OutIter>(current, begin, end, seq);
+    }
+  }
+
+
+  namespace swig {
+    template <class RubySeq, class K, class T >
+    inline void
+    assign(const RubySeq& rubyseq, std::map<K,T > *map) {
+      typedef typename std::map<K,T>::value_type value_type;
+      typename RubySeq::const_iterator it = rubyseq.begin();
+      for (;it != rubyseq.end(); ++it) {
+	map->insert(value_type(it->first, it->second));
+      }
+    }
+
+    template <class K, class T>
+    struct traits_asptr<std::map<K,T> >  {
+      typedef std::map<K,T> map_type;
+      static int asptr(VALUE obj, map_type **val) {
+	int res = SWIG_ERROR;
+	if ( TYPE(obj) == T_HASH ) {
+	  static ID id_to_a = rb_intern("to_a");
+	  VALUE items = rb_funcall(obj, id_to_a, 0);
+	  res = traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >::asptr(items, val);
+	} else {
+	  map_type *p;
+	  swig_type_info *descriptor = swig::type_info<map_type>();
+	  res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
+	  if (SWIG_IsOK(res) && val)  *val = p;
+	}
+	return res;
+      }
+    };
+      
+    template <class K, class T >
+    struct traits_from<std::map<K,T> >  {
+      typedef std::map<K,T> map_type;
+      typedef typename map_type::const_iterator const_iterator;
+      typedef typename map_type::size_type size_type;
+            
+      static VALUE from(const map_type& map) {
+	swig_type_info *desc = swig::type_info<map_type>();
+	if (desc && desc->clientdata) {
+	  return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN);
+	} else {
+	  size_type size = map.size();
+	  int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
+	  if (rubysize < 0) {
+	    SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	    rb_raise( rb_eRuntimeError, "map size not valid in Ruby");
+	    SWIG_RUBY_THREAD_END_BLOCK;
+	    return Qnil;
+	  }
+	  VALUE obj = rb_hash_new();
+	  for (const_iterator i= map.begin(); i!= map.end(); ++i) {
+	    VALUE key = swig::from(i->first);
+	    VALUE val = swig::from(i->second);
+	    rb_hash_aset(obj, key, val);
+	  }
+	  return obj;
+	}
+      }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::map< std::string, CdiVariable, std::less< std::string >, std::allocator< std::pair< std::string const,CdiVariable > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "std::string" "," "CdiVariable" "," "std::less< std::string >" "," "std::allocator< std::pair< std::string const,CdiVariable > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__dup(std::map< std::string,CdiVariable > *self){
+      return new std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >(*self);
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg____delete__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->find(key);
+      if (i != self->end()) {
+	self->erase(i);
+	return swig::from( key );
+      }
+      else {
+	return Qnil;
+      }
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->first) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each(std::map< std::string,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE k, v;
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin();
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    const std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type&    key = i->first;
+	    const std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type& val = i->second;
+
+	    k = swig::from<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type>(key);
+	    v = swig::from<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>(val);
+	    rb_yield_values(2, k, v);
+	  }
+	
+	return self;
+      }
+SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__select(std::map< std::string,CdiVariable > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >* r = new std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >;
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE k = swig::from<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type>(i->first);
+	  VALUE v = swig::from<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>(i->second);
+	  if ( RTEST( rb_yield_values(2, k, v) ) )
+	    self->insert(r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__values_at(std::map< std::string,CdiVariable > *self,int argc,VALUE *argv,...){
+    
+    VALUE r = rb_ary_new();
+    ID   id = rb_intern("[]");
+    swig_type_info* type = swig::type_info< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >();
+    VALUE me = SWIG_NewPointerObj( self, type, 0 );
+    for ( int i = 0; i < argc; ++i )
+      {
+	VALUE key = argv[i];
+	VALUE tmp = rb_funcall( me, id, 1, key );
+	rb_ary_push( r, tmp );
+      }
+    
+    return r;
+  }
+SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each_key(std::map< std::string,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin();
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->first );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__values(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->second) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each_value(std::map< std::string,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin();
+	std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->second );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__entries(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from<std::pair<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, 
+		     std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >(*i) );
+      }
+      return ary;
+    }
+SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(std::map< std::string,CdiVariable > *self,VALUE *RUBY_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), 
+					    self->end(), *RUBY_SELF);
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(std::map< std::string,CdiVariable > *self,VALUE *RUBY_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), 
+					      self->end(), *RUBY_SELF);
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key);
+      if ( i != self->end() )
+	return swig::from<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>( i->second );
+      else
+	return Qnil;
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key,std::map< std::string,CdiVariable >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__inspect(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >();
+      VALUE str = rb_str_new2( type_name );
+      str = rb_str_cat2( str, " {" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type >( i->first );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	  str = rb_str_cat2( str, "=>" );
+	  tmp = swig::from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type >( i->second );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "}" );
+      return str;
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__to_a(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, 
+	    std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__to_s(std::map< std::string,CdiVariable > *self){
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin();
+      std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, 
+	    std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator first,std::map< std::string,CdiVariable >::iterator last){ self->erase(first, last); }
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiVariable > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiVariable" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiVariable, std::less< int >, std::allocator< std::pair< int const,CdiVariable > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiVariable" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiVariable > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__dup(std::map< int,CdiVariable > *self){
+      return new std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >(*self);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg____delete__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->find(key);
+      if (i != self->end()) {
+	self->erase(i);
+	return swig::from( key );
+      }
+      else {
+	return Qnil;
+      }
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg__has_key(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__keys(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->first) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each(std::map< int,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE k, v;
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin();
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    const std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type&    key = i->first;
+	    const std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type& val = i->second;
+
+	    k = swig::from<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type>(key);
+	    v = swig::from<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>(val);
+	    rb_yield_values(2, k, v);
+	  }
+	
+	return self;
+      }
+SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__select(std::map< int,CdiVariable > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >* r = new std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >;
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE k = swig::from<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type>(i->first);
+	  VALUE v = swig::from<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>(i->second);
+	  if ( RTEST( rb_yield_values(2, k, v) ) )
+	    self->insert(r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__values_at(std::map< int,CdiVariable > *self,int argc,VALUE *argv,...){
+    
+    VALUE r = rb_ary_new();
+    ID   id = rb_intern("[]");
+    swig_type_info* type = swig::type_info< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >();
+    VALUE me = SWIG_NewPointerObj( self, type, 0 );
+    for ( int i = 0; i < argc; ++i )
+      {
+	VALUE key = argv[i];
+	VALUE tmp = rb_funcall( me, id, 1, key );
+	rb_ary_push( r, tmp );
+      }
+    
+    return r;
+  }
+SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each_key(std::map< int,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin();
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->first );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__values(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->second) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each_value(std::map< int,CdiVariable > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin();
+	std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->second );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__entries(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from<std::pair<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type, 
+		     std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >(*i) );
+      }
+      return ary;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____contains__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(std::map< int,CdiVariable > *self,VALUE *RUBY_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), 
+					    self->end(), *RUBY_SELF);
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(std::map< int,CdiVariable > *self,VALUE *RUBY_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), 
+					      self->end(), *RUBY_SELF);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key);
+      if ( i != self->end() )
+	return swig::from<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>( i->second );
+      else
+	return Qnil;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key,std::map< int,CdiVariable >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__inspect(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >();
+      VALUE str = rb_str_new2( type_name );
+      str = rb_str_cat2( str, " {" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type >( i->first );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	  str = rb_str_cat2( str, "=>" );
+	  tmp = swig::from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type >( i->second );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "}" );
+      return str;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__to_a(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type, 
+	    std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__to_s(std::map< int,CdiVariable > *self){
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin();
+      std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type, 
+	    std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator first,std::map< int,CdiVariable >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiTaxis > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiTaxis"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiTaxis > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiTaxis" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiTaxis, std::less< int >, std::allocator< std::pair< int const,CdiTaxis > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiTaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiTaxis > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__dup(std::map< int,CdiTaxis > *self){
+      return new std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >(*self);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg____delete__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->find(key);
+      if (i != self->end()) {
+	self->erase(i);
+	return swig::from( key );
+      }
+      else {
+	return Qnil;
+      }
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg__has_key(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__keys(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->first) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each(std::map< int,CdiTaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE k, v;
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin();
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    const std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type&    key = i->first;
+	    const std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type& val = i->second;
+
+	    k = swig::from<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type>(key);
+	    v = swig::from<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>(val);
+	    rb_yield_values(2, k, v);
+	  }
+	
+	return self;
+      }
+SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__select(std::map< int,CdiTaxis > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >* r = new std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >;
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE k = swig::from<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type>(i->first);
+	  VALUE v = swig::from<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>(i->second);
+	  if ( RTEST( rb_yield_values(2, k, v) ) )
+	    self->insert(r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__values_at(std::map< int,CdiTaxis > *self,int argc,VALUE *argv,...){
+    
+    VALUE r = rb_ary_new();
+    ID   id = rb_intern("[]");
+    swig_type_info* type = swig::type_info< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >();
+    VALUE me = SWIG_NewPointerObj( self, type, 0 );
+    for ( int i = 0; i < argc; ++i )
+      {
+	VALUE key = argv[i];
+	VALUE tmp = rb_funcall( me, id, 1, key );
+	rb_ary_push( r, tmp );
+      }
+    
+    return r;
+  }
+SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each_key(std::map< int,CdiTaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin();
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->first );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__values(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->second) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each_value(std::map< int,CdiTaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin();
+	std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->second );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__entries(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from<std::pair<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, 
+		     std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >(*i) );
+      }
+      return ary;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(std::map< int,CdiTaxis > *self,VALUE *RUBY_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), 
+					    self->end(), *RUBY_SELF);
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(std::map< int,CdiTaxis > *self,VALUE *RUBY_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), 
+					      self->end(), *RUBY_SELF);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key);
+      if ( i != self->end() )
+	return swig::from<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>( i->second );
+      else
+	return Qnil;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key,std::map< int,CdiTaxis >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__inspect(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >();
+      VALUE str = rb_str_new2( type_name );
+      str = rb_str_cat2( str, " {" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type >( i->first );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	  str = rb_str_cat2( str, "=>" );
+	  tmp = swig::from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type >( i->second );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "}" );
+      return str;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__to_a(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, 
+	    std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__to_s(std::map< int,CdiTaxis > *self){
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin();
+      std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, 
+	    std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator first,std::map< int,CdiTaxis >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiZaxis > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiZaxis"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiZaxis > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiZaxis" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiZaxis, std::less< int >, std::allocator< std::pair< int const,CdiZaxis > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiZaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiZaxis > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__dup(std::map< int,CdiZaxis > *self){
+      return new std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >(*self);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg____delete__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->find(key);
+      if (i != self->end()) {
+	self->erase(i);
+	return swig::from( key );
+      }
+      else {
+	return Qnil;
+      }
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg__has_key(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__keys(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->first) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each(std::map< int,CdiZaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE k, v;
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin();
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    const std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type&    key = i->first;
+	    const std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type& val = i->second;
+
+	    k = swig::from<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type>(key);
+	    v = swig::from<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>(val);
+	    rb_yield_values(2, k, v);
+	  }
+	
+	return self;
+      }
+SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__select(std::map< int,CdiZaxis > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >* r = new std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >;
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE k = swig::from<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type>(i->first);
+	  VALUE v = swig::from<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>(i->second);
+	  if ( RTEST( rb_yield_values(2, k, v) ) )
+	    self->insert(r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__values_at(std::map< int,CdiZaxis > *self,int argc,VALUE *argv,...){
+    
+    VALUE r = rb_ary_new();
+    ID   id = rb_intern("[]");
+    swig_type_info* type = swig::type_info< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >();
+    VALUE me = SWIG_NewPointerObj( self, type, 0 );
+    for ( int i = 0; i < argc; ++i )
+      {
+	VALUE key = argv[i];
+	VALUE tmp = rb_funcall( me, id, 1, key );
+	rb_ary_push( r, tmp );
+      }
+    
+    return r;
+  }
+SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each_key(std::map< int,CdiZaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin();
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->first );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__values(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->second) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each_value(std::map< int,CdiZaxis > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin();
+	std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->second );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__entries(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from<std::pair<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, 
+		     std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >(*i) );
+      }
+      return ary;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(std::map< int,CdiZaxis > *self,VALUE *RUBY_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), 
+					    self->end(), *RUBY_SELF);
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(std::map< int,CdiZaxis > *self,VALUE *RUBY_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), 
+					      self->end(), *RUBY_SELF);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key);
+      if ( i != self->end() )
+	return swig::from<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>( i->second );
+      else
+	return Qnil;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key,std::map< int,CdiZaxis >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__inspect(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >();
+      VALUE str = rb_str_new2( type_name );
+      str = rb_str_cat2( str, " {" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type >( i->first );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	  str = rb_str_cat2( str, "=>" );
+	  tmp = swig::from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type >( i->second );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "}" );
+      return str;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__to_a(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, 
+	    std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__to_s(std::map< int,CdiZaxis > *self){
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin();
+      std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, 
+	    std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator first,std::map< int,CdiZaxis >::iterator last){ self->erase(first, last); }
+
+  namespace swig {
+    template <>  struct traits< CdiGrid > {
+      typedef pointer_category category;
+      static const char* type_name() { return"CdiGrid"; }
+    };
+  }
+
+
+      namespace swig {
+	template <>  struct traits<std::pair< int, CdiGrid > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::pair<" "int" "," "CdiGrid" " >";
+	  }
+	};
+      }
+    
+
+      namespace swig {
+	template <>  struct traits<std::map< int, CdiGrid, std::less< int >, std::allocator< std::pair< int const,CdiGrid > > > > {
+	  typedef pointer_category category;
+	  static const char* type_name() {
+	    return "std::map<" "int" "," "CdiGrid" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiGrid > >" " >";
+	  }
+	};
+      }
+    
+SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__dup(std::map< int,CdiGrid > *self){
+      return new std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >(*self);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg____delete__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->find(key);
+      if (i != self->end()) {
+	self->erase(i);
+	return swig::from( key );
+      }
+      else {
+	return Qnil;
+      }
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg__has_key(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key);
+      return i != self->end();
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__keys(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->first) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each(std::map< int,CdiGrid > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE k, v;
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin();
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    const std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type&    key = i->first;
+	    const std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type& val = i->second;
+
+	    k = swig::from<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type>(key);
+	    v = swig::from<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>(val);
+	    rb_yield_values(2, k, v);
+	  }
+	
+	return self;
+      }
+SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__select(std::map< int,CdiGrid > *self){
+      if ( !rb_block_given_p() )
+	rb_raise( rb_eArgError, "no block given" );
+
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >* r = new std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >;
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end();
+      for ( ; i != e; ++i )
+	{
+	  VALUE k = swig::from<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type>(i->first);
+	  VALUE v = swig::from<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>(i->second);
+	  if ( RTEST( rb_yield_values(2, k, v) ) )
+	    self->insert(r->end(), *i);
+	}
+	
+      return r;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__values_at(std::map< int,CdiGrid > *self,int argc,VALUE *argv,...){
+    
+    VALUE r = rb_ary_new();
+    ID   id = rb_intern("[]");
+    swig_type_info* type = swig::type_info< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >();
+    VALUE me = SWIG_NewPointerObj( self, type, 0 );
+    for ( int i = 0; i < argc; ++i )
+      {
+	VALUE key = argv[i];
+	VALUE tmp = rb_funcall( me, id, 1, key );
+	rb_ary_push( r, tmp );
+      }
+    
+    return r;
+  }
+SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each_key(std::map< int,CdiGrid > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin();
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->first );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__values(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from(i->second) );
+      }
+      return ary;
+    }
+SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each_value(std::map< int,CdiGrid > *self){
+	if ( !rb_block_given_p() )
+	  rb_raise( rb_eArgError, "no block given");
+
+	VALUE r;
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin();
+	std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end();
+	for ( ; i != e; ++i )
+	  {
+	    r = swig::from( i->second );
+	    rb_yield(r);
+	  }
+	
+	return self;
+      }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__entries(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size();
+      int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1;
+      if (rubysize < 0) {
+	SWIG_RUBY_THREAD_BEGIN_BLOCK;
+	rb_raise(rb_eRuntimeError, "map size not valid in Ruby");
+	SWIG_RUBY_THREAD_END_BLOCK;
+	return Qnil;
+      }
+      VALUE ary = rb_ary_new2(rubysize);
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end();
+      for ( ; i != e; ++i ) {
+	rb_ary_push( ary, swig::from<std::pair<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type, 
+		     std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >(*i) );
+      }
+      return ary;
+    }
+SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____contains__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){
+      return self->find(key) != self->end();
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(std::map< int,CdiGrid > *self,VALUE *RUBY_SELF){
+      return swig::make_output_key_iterator(self->begin(), self->begin(), 
+					    self->end(), *RUBY_SELF);
+    }
+SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(std::map< int,CdiGrid > *self,VALUE *RUBY_SELF){
+      return swig::make_output_value_iterator(self->begin(), self->begin(), 
+					      self->end(), *RUBY_SELF);
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key);
+      if ( i != self->end() )
+	return swig::from<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>( i->second );
+      else
+	return Qnil;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key,std::map< int,CdiGrid >::mapped_type const &x){
+      (*self)[key] = x;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__inspect(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end();
+      const char *type_name = swig::type_name< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >();
+      VALUE str = rb_str_new2( type_name );
+      str = rb_str_cat2( str, " {" );
+      bool comma = false;
+      VALUE tmp;
+      for ( ; i != e; ++i, comma = true )
+	{
+	  if (comma) str = rb_str_cat2( str, "," );
+	  tmp = swig::from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type >( i->first );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	  str = rb_str_cat2( str, "=>" );
+	  tmp = swig::from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type >( i->second );
+	  tmp = rb_inspect( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      str = rb_str_cat2( str, "}" );
+      return str;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__to_a(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end();
+      VALUE ary = rb_ary_new2( std::distance( i, e ) );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type, 
+	    std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >( *i );
+	  rb_ary_push( ary, tmp );
+	}
+      return ary;
+    }
+SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__to_s(std::map< int,CdiGrid > *self){
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin();
+      std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end();
+      VALUE str = rb_str_new2( "" );
+      VALUE tmp;
+      for ( ; i != e; ++i )
+	{
+	  // @todo: improve -- this should just be swig::from(*i)
+	  tmp = swig::from< std::pair<std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type, 
+	    std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >( *i );
+	  tmp = rb_obj_as_string( tmp );
+	  str = rb_str_buf_append( str, tmp );
+	}
+      return str;
+    }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator position){ self->erase(position); }
+SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator first,std::map< int,CdiGrid >::iterator last){ self->erase(first, last); }
+
+SWIGINTERN int
+SWIG_AsVal_bool (VALUE obj, bool *val)
+{
+  if (obj == Qtrue) {
+    if (val) *val = true;
+    return SWIG_OK;
+  } else if (obj == Qfalse) {
+    if (val) *val = false;
+    return SWIG_OK;
+  } else {
+    int res = 0;
+    if (SWIG_AsVal_int (obj, &res) == SWIG_OK) {    
+      if (val) *val = res ? true : false;
+      return SWIG_OK;
+    }
+  }  
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharArray(VALUE obj, char *val, size_t size)
+{ 
+  char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ;
+  int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc);
+  if (SWIG_IsOK(res)) {
+    /* special case of single char conversion when we don't need space for NUL */
+    if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize;
+    if (csize <= size) {
+      if (val) {
+	if (csize) memcpy(val, cptr, csize*sizeof(char));
+	if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char));
+      }
+      if (alloc == SWIG_NEWOBJ) {
+	delete[] cptr;
+	res = SWIG_DelNewMask(res);
+      }      
+      return res;
+    }
+    if (alloc == SWIG_NEWOBJ) delete[] cptr;
+  }
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERN size_t
+SWIG_strnlen(const char* s, size_t maxlen)
+{
+  const char *p;
+  for (p = s; maxlen-- && *p; p++)
+    ;
+  return p - s;
+}
+
+
+
+
+
+SWIGINTERNINLINE VALUE 
+SWIG_FromCharPtr(const char *cptr)
+{ 
+  return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
+}
+
+static swig_class SwigClassGC_VALUE;
+
+/*
+  Document-method: Cdi::GC_VALUE.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_GC_VALUE_inspect(int argc, VALUE *argv, VALUE self) {
+  swig::GC_VALUE *arg1 = (swig::GC_VALUE *) 0 ;
+  swig::GC_VALUE r1 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  r1 = self; arg1 = &r1;
+  result = (VALUE)((swig::GC_VALUE const *)arg1)->inspect();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GC_VALUE.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_GC_VALUE_to_s(int argc, VALUE *argv, VALUE self) {
+  swig::GC_VALUE *arg1 = (swig::GC_VALUE *) 0 ;
+  swig::GC_VALUE r1 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  r1 = self; arg1 = &r1;
+  result = (VALUE)((swig::GC_VALUE const *)arg1)->to_s();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+static swig_class SwigClassConstIterator;
+
+SWIGINTERN void
+free_swig_ConstIterator(void *self) {
+    swig::ConstIterator *arg1 = (swig::ConstIterator *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_ConstIterator_value(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  try {
+    result = (VALUE)((swig::ConstIterator const *)arg1)->value();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.dup
+
+  call-seq:
+    dup -> ConstIterator
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator_dup(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->dup();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator_inspect(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  result = (VALUE)((swig::ConstIterator const *)arg1)->inspect();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator_to_s(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  result = (VALUE)((swig::ConstIterator const *)arg1)->to_s();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ConstIterator_next__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","next", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","next", 2, argv[0] ));
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (swig::ConstIterator *)(arg1)->next(arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ConstIterator_next__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","next", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  try {
+    result = (swig::ConstIterator *)(arg1)->next();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_ConstIterator_next(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_ConstIterator_next__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ConstIterator_next__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "ConstIterator.next", 
+    "    swig::ConstIterator ConstIterator.next(size_t n)\n"
+    "    swig::ConstIterator * ConstIterator.next()\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ConstIterator_previous__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","previous", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","previous", 2, argv[0] ));
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (swig::ConstIterator *)(arg1)->previous(arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ConstIterator_previous__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","previous", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  try {
+    result = (swig::ConstIterator *)(arg1)->previous();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_ConstIterator_previous(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_ConstIterator_previous__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ConstIterator_previous__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "ConstIterator.previous", 
+    "    swig::ConstIterator ConstIterator.previous(size_t n)\n"
+    "    swig::ConstIterator * ConstIterator.previous()\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.==
+
+  call-seq:
+    ==(x) -> bool
+
+Equality comparison operator.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator___eq__(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  swig::ConstIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator ==", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__ConstIterator,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::ConstIterator const &","operator ==", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::ConstIterator const &","operator ==", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< swig::ConstIterator * >(argp2);
+  result = (bool)((swig::ConstIterator const *)arg1)->operator ==((swig::ConstIterator const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.+
+
+  call-seq:
+    +(n) -> ConstIterator
+
+Add operator.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator___add__(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator +", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator +", 2, argv[0] ));
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->operator +(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ConstIterator.-
+
+  call-seq:
+    -(n) -> ConstIterator
+    -(x) -> ptrdiff_t
+
+Substraction operator.
+*/
+SWIGINTERN VALUE
+_wrap_ConstIterator___sub____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator -", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator -", 2, argv[0] ));
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->operator -(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ConstIterator___sub____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ;
+  swig::ConstIterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  ptrdiff_t result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator -", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::ConstIterator * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__ConstIterator,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::ConstIterator const &","operator -", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::ConstIterator const &","operator -", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< swig::ConstIterator * >(argp2);
+  result = ((swig::ConstIterator const *)arg1)->operator -((swig::ConstIterator const &)*arg2);
+  vresult = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_ConstIterator___sub__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ConstIterator___sub____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ConstIterator___sub____SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "ConstIterator.__sub__", 
+    "    swig::ConstIterator ConstIterator.__sub__(ptrdiff_t n)\n"
+    "    ptrdiff_t ConstIterator.__sub__(swig::ConstIterator const &x)\n");
+  
+  return Qnil;
+}
+
+
+static swig_class SwigClassIterator;
+
+SWIGINTERN VALUE
+_wrap_Iterator_valuee___(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  VALUE *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE temp2 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","setValue", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  temp2 = static_cast< VALUE >(argv[0]);
+  arg2 = &temp2;
+  result = (VALUE)(arg1)->setValue((VALUE const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.dup
+
+  call-seq:
+    dup -> Iterator
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator_dup(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  result = (swig::Iterator *)((swig::Iterator const *)arg1)->dup();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Iterator_next__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","next", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","next", 2, argv[0] ));
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (swig::Iterator *)(arg1)->next(arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Iterator_next__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","next", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  try {
+    result = (swig::Iterator *)(arg1)->next();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_Iterator_next(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Iterator_next__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Iterator_next__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "Iterator.next", 
+    "    swig::Iterator Iterator.next(size_t n)\n"
+    "    swig::Iterator * Iterator.next()\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Iterator_previous__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","previous", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","previous", 2, argv[0] ));
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (swig::Iterator *)(arg1)->previous(arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Iterator_previous__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","previous", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  try {
+    result = (swig::Iterator *)(arg1)->previous();
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_Iterator_previous(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_Iterator_previous__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Iterator_previous__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "Iterator.previous", 
+    "    swig::Iterator Iterator.previous(size_t n)\n"
+    "    swig::Iterator * Iterator.previous()\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator_inspect(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  result = (VALUE)((swig::Iterator const *)arg1)->inspect();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator_to_s(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  result = (VALUE)((swig::Iterator const *)arg1)->to_s();
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.==
+
+  call-seq:
+    ==(x) -> bool
+
+Equality comparison operator.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator___eq__(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  swig::Iterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator ==", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__Iterator,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::Iterator const &","operator ==", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::Iterator const &","operator ==", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< swig::Iterator * >(argp2);
+  result = (bool)((swig::Iterator const *)arg1)->operator ==((swig::Iterator const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.+
+
+  call-seq:
+    +(n) -> Iterator
+
+Add operator.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator___add__(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator +", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator +", 2, argv[0] ));
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::Iterator *)((swig::Iterator const *)arg1)->operator +(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::Iterator.-
+
+  call-seq:
+    -(n) -> Iterator
+    -(x) -> ptrdiff_t
+
+Substraction operator.
+*/
+SWIGINTERN VALUE
+_wrap_Iterator___sub____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  ptrdiff_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  swig::Iterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator -", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator -", 2, argv[0] ));
+  } 
+  arg2 = static_cast< ptrdiff_t >(val2);
+  try {
+    result = (swig::Iterator *)((swig::Iterator const *)arg1)->operator -(arg2);
+  } catch(swig::stop_iteration &_e) {
+    {
+      (void)_e;
+      SWIG_Ruby_ExceptionType(NULL, Qnil);
+      SWIG_fail;
+    }
+  }
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Iterator___sub____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  swig::Iterator *arg1 = (swig::Iterator *) 0 ;
+  swig::Iterator *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  ptrdiff_t result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator -", 1, self )); 
+  }
+  arg1 = reinterpret_cast< swig::Iterator * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__Iterator,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::Iterator const &","operator -", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::Iterator const &","operator -", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< swig::Iterator * >(argp2);
+  result = ((swig::Iterator const *)arg1)->operator -((swig::Iterator const &)*arg2);
+  vresult = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_Iterator___sub__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_swig__Iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_Iterator___sub____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_Iterator___sub____SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "Iterator.__sub__", 
+    "    swig::Iterator Iterator.__sub__(ptrdiff_t n)\n"
+    "    ptrdiff_t Iterator.__sub__(swig::Iterator const &x)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_swig_Iterator(void *self) {
+    swig::Iterator *arg1 = (swig::Iterator *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassIntVector;
+
+/*
+  Document-method: Cdi::IntVector.dup
+
+  call-seq:
+    dup -> IntVector
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_dup(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_inspect(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (VALUE)std_vector_Sl_int_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert IntVector to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_to_a(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (VALUE)std_vector_Sl_int_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_to_s(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (VALUE)std_vector_Sl_int_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.slice
+
+  call-seq:
+    slice(i, length) -> VALUE
+
+Return a slice (portion of) the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_slice(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","slice", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","slice", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","slice", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_int_Sg__slice(arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.each
+
+  call-seq:
+    each -> IntVector
+
+Iterate thru each element in the IntVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_each(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector___delete2__(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__delete2__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","__delete2__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_vector_Sl_int_Sg____delete2__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.select
+
+  call-seq:
+    select -> IntVector
+
+Iterate thru each element in the IntVector and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_select(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.delete_at
+
+  call-seq:
+    delete_at(i) -> VALUE
+
+Delete an element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_delete_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","delete_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","delete_at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_int_Sg__delete_at(arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.at
+
+  call-seq:
+    at(i) -> VALUE
+
+Return element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_int_Sg__at((std::vector< int > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.[]
+
+  call-seq:
+    [](i, length) -> VALUE
+    [](i) -> VALUE
+    [](i) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_0((std::vector< int > const *)arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  VALUE arg2 = (VALUE) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  arg2 = argv[0];
+  try {
+    result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_2((std::vector< int > const *)arg1,arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_IntVector___getitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntVector___getitem____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      _v = (argv[1] != 0);
+      if (_v) {
+        return _wrap_IntVector___getitem____SWIG_2(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector___getitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "__getitem__", 
+    "    VALUE __getitem__(std::vector< int >::difference_type i, std::vector< int >::difference_type length)\n"
+    "    VALUE __getitem__(std::vector< int >::difference_type i)\n"
+    "    VALUE __getitem__(VALUE i)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.[]=
+
+  call-seq:
+    []=(i, x) -> VALUE
+    []=(i, length, v) -> VALUE
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_int(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","__setitem__", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    result = (VALUE)std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,arg2,(int const &)*arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  std::vector< int >::difference_type arg3 ;
+  std::vector< int,std::allocator< int > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< int >::difference_type >(val3);
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< int,std::allocator< int > > const &","__setitem__", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int,std::allocator< int > > const &","__setitem__", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,arg2,arg3,(std::vector< int,std::allocator< int > > const &)*arg4);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_IntVector___setitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector___setitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_IntVector___setitem____SWIG_1(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "__setitem__", 
+    "    VALUE __setitem__(std::vector< int >::difference_type i, std::vector< int >::value_type const &x)\n"
+    "    VALUE __setitem__(std::vector< int >::difference_type i, std::vector< int >::difference_type length, std::vector< int,std::allocator< int > > const &v)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.reject!
+
+  call-seq:
+    reject! -> IntVector
+
+Iterate thru each element in the IntVector and reject those that fail a condition.  A block must be provided.  IntVector is modified in place.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_rejectN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reject_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__reject_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.pop
+
+  call-seq:
+    pop -> VALUE
+
+Remove and return element at the end of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_pop(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","pop", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (VALUE)std_vector_Sl_int_Sg__pop(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.push
+
+  call-seq:
+    push(e) -> std::vector< int >::value_type const
+
+Add an element at the end of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_push(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","push", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","push", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__push(arg1,(int const &)*arg2);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.reject
+
+  call-seq:
+    reject -> IntVector
+
+Iterate thru each element in the IntVector and reject those that fail a condition returning a new IntVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_reject(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reject", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__reject(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.shift
+
+  call-seq:
+    shift -> VALUE
+
+Remove and return element at the beginning of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_shift(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","shift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (VALUE)std_vector_Sl_int_Sg__shift(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.insert
+
+  call-seq:
+    insert(pos, argc) -> IntVector
+    insert(pos, x) -> std::vector< int >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::difference_type arg2 ;
+  int arg3 ;
+  VALUE *arg4 = (VALUE *) 0 ;
+  void *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 2) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","insert", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::difference_type >(val2);
+  {
+    arg3 = argc - 1;
+    arg4 = argv + 1;
+  }
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__insert__SWIG_0(arg1,arg2,arg3,arg4,arg5);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.unshift
+
+  call-seq:
+    unshift(argc) -> IntVector
+
+Add one or more elements at the beginning of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_unshift(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","unshift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__unshift(arg1,arg2,arg3,arg4);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_IntVector__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::vector< int > *)new std::vector< int >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_IntVector__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< int > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const &","vector<(int)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int > const &","vector<(int)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the IntVector is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (bool)((std::vector< int > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.size
+
+  call-seq:
+    size -> std::vector< int >::size_type
+
+Size or Length of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_size(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector_swap(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< int > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< int > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.begin
+
+  call-seq:
+    begin -> std::vector< int >::iterator
+
+Return an iterator to the beginning of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_begin(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.end
+
+  call-seq:
+    end -> std::vector< int >::iterator
+
+Return an iterator to past the end of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_end(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.rbegin
+
+  call-seq:
+    rbegin -> std::vector< int >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.rend
+
+  call-seq:
+    rend -> std::vector< int >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_rend(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.clear
+
+  call-seq:
+    clear
+
+Clear IntVector contents.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_clear(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< int > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::vector< int >::allocator_type(static_cast< const std::vector< int >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_IntVector__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< int >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< int >::size_type","vector<(int)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  result = (std::vector< int > *)new std::vector< int >(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->resize(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.erase
+
+  call-seq:
+    erase(pos) -> std::vector< int >::iterator
+    erase(first, last) -> std::vector< int >::iterator
+
+Delete a portion of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,arg2);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  swig::Iterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< int >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 3, argv[1] ));
+  } else {
+    swig::Iterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 3, argv[1] ));
+    }
+  }
+  result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_IntVector_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_IntVector_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::ConstIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_IntVector_erase__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "erase", 
+    "    std::vector< int >::iterator erase(std::vector< int >::iterator pos)\n"
+    "    std::vector< int >::iterator erase(std::vector< int >::iterator first, std::vector< int >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_IntVector_allocate(VALUE self)
+#else
+_wrap_IntVector_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_IntVector__SWIG_3(int argc, VALUE *argv, VALUE self) {
+  std::vector< int >::size_type arg1 ;
+  std::vector< int >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< int >::value_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::vector< int > *result = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< int >::size_type","vector<(int)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< int >::size_type >(val1);
+  ecode2 = SWIG_AsVal_int(argv[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","vector<(int)>", 2, argv[1] ));
+  } 
+  temp2 = static_cast< std::vector< int >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_IntVector(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[2];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 2) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_IntVector__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_IntVector__SWIG_2(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_IntVector__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_IntVector__SWIG_3(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 2, "IntVector.new", 
+    "    IntVector.new()\n"
+    "    IntVector.new(std::vector< int > const &other)\n"
+    "    IntVector.new(std::vector< int >::size_type size)\n"
+    "    IntVector.new(std::vector< int >::size_type size, std::vector< int >::value_type const &value)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.front
+
+  call-seq:
+    front -> std::vector< int >::value_type const &
+
+Return the first element in IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_front(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","front", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front();
+  vresult = SWIG_From_int(static_cast< int >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.back
+
+  call-seq:
+    back -> std::vector< int >::value_type const &
+
+Return the last element in IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_back(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","back", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back();
+  vresult = SWIG_From_int(static_cast< int >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.assign
+
+  call-seq:
+    assign(n, x)
+
+Assign a new IntVector or portion of it.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_assign(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","assign", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","assign", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","assign", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  ecode3 = SWIG_AsVal_int(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","resize", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_IntVector_resize(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_IntVector_resize__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector_resize__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "IntVector.resize", 
+    "    void IntVector.resize(std::vector< int >::size_type new_size)\n"
+    "    void IntVector.resize(std::vector< int >::size_type new_size, std::vector< int >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.insert
+
+  call-seq:
+    insert(pos, argc) -> IntVector
+    insert(pos, x) -> std::vector< int >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< int >::value_type temp3 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_int(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","insert", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< int >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_int_Sg__insert__SWIG_1(arg1,arg2,(int const &)*arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::iterator arg2 ;
+  std::vector< int >::size_type arg3 ;
+  std::vector< int >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< int >::value_type temp4 ;
+  int val4 ;
+  int ecode4 = 0 ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< int >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::size_type","insert", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< int >::size_type >(val3);
+  ecode4 = SWIG_AsVal_int(argv[2], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "std::vector< int >::value_type","insert", 4, argv[2] ));
+  } 
+  temp4 = static_cast< std::vector< int >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_int_Sg__insert__SWIG_2(arg1,arg2,arg3,(int const &)*arg4);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_IntVector_insert(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_IntVector_insert__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          if (argc <= 3) {
+            return _wrap_IntVector_insert__SWIG_0(nargs, args, self);
+          }
+          return _wrap_IntVector_insert__SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< int >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_int(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_IntVector_insert__SWIG_2(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "insert", 
+    "    std::vector< int,std::allocator< int > > insert(std::vector< int >::difference_type pos, int argc, VALUE *argv, ...)\n"
+    "    std::vector< int >::iterator insert(std::vector< int >::iterator pos, std::vector< int >::value_type const &x)\n"
+    "    void insert(std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.reserve
+
+  call-seq:
+    reserve(n)
+
+Reserve memory in the IntVector for a number of elements.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_reserve(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  std::vector< int >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reserve", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","reserve", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< int >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.capacity
+
+  call-seq:
+    capacity -> std::vector< int >::size_type
+
+Reserved capacity of the IntVector.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_capacity(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","capacity", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = ((std::vector< int > const *)arg1)->capacity();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_IntVector_mapN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","map_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__map_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::IntVector.delete
+
+  call-seq:
+    delete(val) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_IntVector_delete(int argc, VALUE *argv, VALUE self) {
+  std::vector< int > *arg1 = (std::vector< int > *) 0 ;
+  int *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< int > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< int >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_vector_Sl_int_Sg____delete__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_vector_Sl_int_Sg_(void *self) {
+    std::vector< int > *arg1 = (std::vector< int > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassDoubleVector;
+
+/*
+  Document-method: Cdi::DoubleVector.dup
+
+  call-seq:
+    dup -> DoubleVector
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_dup(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_inspect(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (VALUE)std_vector_Sl_double_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert DoubleVector to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_to_a(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (VALUE)std_vector_Sl_double_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_to_s(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (VALUE)std_vector_Sl_double_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.slice
+
+  call-seq:
+    slice(i, length) -> VALUE
+
+Return a slice (portion of) the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_slice(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","slice", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","slice", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","slice", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_double_Sg__slice(arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.each
+
+  call-seq:
+    each -> DoubleVector
+
+Iterate thru each element in the DoubleVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_each(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector___delete2__(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__delete2__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","__delete2__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_vector_Sl_double_Sg____delete2__(arg1,(double const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.select
+
+  call-seq:
+    select -> DoubleVector
+
+Iterate thru each element in the DoubleVector and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_select(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.delete_at
+
+  call-seq:
+    delete_at(i) -> VALUE
+
+Delete an element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_delete_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","delete_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","delete_at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_double_Sg__delete_at(arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.at
+
+  call-seq:
+    at(i) -> VALUE
+
+Return element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_double_Sg__at((std::vector< double > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.[]
+
+  call-seq:
+    [](i, length) -> VALUE
+    [](i) -> VALUE
+    [](i) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_0((std::vector< double > const *)arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  VALUE arg2 = (VALUE) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  arg2 = argv[0];
+  try {
+    result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_2((std::vector< double > const *)arg1,arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleVector___getitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleVector___getitem____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      _v = (argv[1] != 0);
+      if (_v) {
+        return _wrap_DoubleVector___getitem____SWIG_2(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector___getitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "__getitem__", 
+    "    VALUE __getitem__(std::vector< double >::difference_type i, std::vector< double >::difference_type length)\n"
+    "    VALUE __getitem__(std::vector< double >::difference_type i)\n"
+    "    VALUE __getitem__(VALUE i)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.[]=
+
+  call-seq:
+    []=(i, x) -> VALUE
+    []=(i, length, v) -> VALUE
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_double(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","__setitem__", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  try {
+    result = (VALUE)std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,arg2,(double const &)*arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  std::vector< double >::difference_type arg3 ;
+  std::vector< double,std::allocator< double > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< double >::difference_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > const &","__setitem__", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double,std::allocator< double > > const &","__setitem__", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleVector___setitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector___setitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleVector___setitem____SWIG_1(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "__setitem__", 
+    "    VALUE __setitem__(std::vector< double >::difference_type i, std::vector< double >::value_type const &x)\n"
+    "    VALUE __setitem__(std::vector< double >::difference_type i, std::vector< double >::difference_type length, std::vector< double,std::allocator< double > > const &v)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.reject!
+
+  call-seq:
+    reject! -> DoubleVector
+
+Iterate thru each element in the DoubleVector and reject those that fail a condition.  A block must be provided.  DoubleVector is modified in place.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_rejectN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reject_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__reject_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.pop
+
+  call-seq:
+    pop -> VALUE
+
+Remove and return element at the end of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_pop(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","pop", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (VALUE)std_vector_Sl_double_Sg__pop(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.push
+
+  call-seq:
+    push(e) -> std::vector< double >::value_type const
+
+Add an element at the end of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_push(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","push", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","push", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__push(arg1,(double const &)*arg2);
+  vresult = SWIG_From_double(static_cast< double >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.reject
+
+  call-seq:
+    reject -> DoubleVector
+
+Iterate thru each element in the DoubleVector and reject those that fail a condition returning a new DoubleVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_reject(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reject", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__reject(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.shift
+
+  call-seq:
+    shift -> VALUE
+
+Remove and return element at the beginning of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_shift(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","shift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (VALUE)std_vector_Sl_double_Sg__shift(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.insert
+
+  call-seq:
+    insert(pos, argc) -> DoubleVector
+    insert(pos, x) -> std::vector< double >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::difference_type arg2 ;
+  int arg3 ;
+  VALUE *arg4 = (VALUE *) 0 ;
+  void *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 2) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","insert", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::difference_type >(val2);
+  {
+    arg3 = argc - 1;
+    arg4 = argv + 1;
+  }
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__insert__SWIG_0(arg1,arg2,arg3,arg4,arg5);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.unshift
+
+  call-seq:
+    unshift(argc) -> DoubleVector
+
+Add one or more elements at the beginning of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_unshift(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","unshift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__unshift(arg1,arg2,arg3,arg4);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleVector__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::vector< double > *)new std::vector< double >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleVector__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< double > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const &","vector<(double)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double > const &","vector<(double)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the DoubleVector is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (bool)((std::vector< double > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.size
+
+  call-seq:
+    size -> std::vector< double >::size_type
+
+Size or Length of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_size(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector_swap(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< double > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.begin
+
+  call-seq:
+    begin -> std::vector< double >::iterator
+
+Return an iterator to the beginning of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_begin(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.end
+
+  call-seq:
+    end -> std::vector< double >::iterator
+
+Return an iterator to past the end of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_end(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.rbegin
+
+  call-seq:
+    rbegin -> std::vector< double >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.rend
+
+  call-seq:
+    rend -> std::vector< double >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_rend(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.clear
+
+  call-seq:
+    clear
+
+Clear DoubleVector contents.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_clear(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< double > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::vector< double >::allocator_type(static_cast< const std::vector< double >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleVector__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< double >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< double >::size_type","vector<(double)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  result = (std::vector< double > *)new std::vector< double >(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->resize(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.erase
+
+  call-seq:
+    erase(pos) -> std::vector< double >::iterator
+    erase(first, last) -> std::vector< double >::iterator
+
+Delete a portion of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,arg2);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  swig::Iterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< double >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 3, argv[1] ));
+  } else {
+    swig::Iterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 3, argv[1] ));
+    }
+  }
+  result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleVector_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_DoubleVector_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::ConstIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_DoubleVector_erase__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "erase", 
+    "    std::vector< double >::iterator erase(std::vector< double >::iterator pos)\n"
+    "    std::vector< double >::iterator erase(std::vector< double >::iterator first, std::vector< double >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_DoubleVector_allocate(VALUE self)
+#else
+_wrap_DoubleVector_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleVector__SWIG_3(int argc, VALUE *argv, VALUE self) {
+  std::vector< double >::size_type arg1 ;
+  std::vector< double >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< double >::value_type temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  std::vector< double > *result = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< double >::size_type","vector<(double)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< double >::size_type >(val1);
+  ecode2 = SWIG_AsVal_double(argv[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","vector<(double)>", 2, argv[1] ));
+  } 
+  temp2 = static_cast< std::vector< double >::value_type >(val2);
+  arg2 = &temp2;
+  result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_DoubleVector(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[2];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 2) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_DoubleVector__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_DoubleVector__SWIG_2(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_DoubleVector__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_double(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new_DoubleVector__SWIG_3(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 2, "DoubleVector.new", 
+    "    DoubleVector.new()\n"
+    "    DoubleVector.new(std::vector< double > const &other)\n"
+    "    DoubleVector.new(std::vector< double >::size_type size)\n"
+    "    DoubleVector.new(std::vector< double >::size_type size, std::vector< double >::value_type const &value)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.front
+
+  call-seq:
+    front -> std::vector< double >::value_type const &
+
+Return the first element in DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_front(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","front", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front();
+  vresult = SWIG_From_double(static_cast< double >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.back
+
+  call-seq:
+    back -> std::vector< double >::value_type const &
+
+Return the last element in DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_back(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","back", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back();
+  vresult = SWIG_From_double(static_cast< double >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.assign
+
+  call-seq:
+    assign(n, x)
+
+Assign a new DoubleVector or portion of it.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_assign(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","assign", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","assign", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","assign", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  ecode3 = SWIG_AsVal_double(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","resize", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleVector_resize(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleVector_resize__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector_resize__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "DoubleVector.resize", 
+    "    void DoubleVector.resize(std::vector< double >::size_type new_size)\n"
+    "    void DoubleVector.resize(std::vector< double >::size_type new_size, std::vector< double >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.insert
+
+  call-seq:
+    insert(pos, argc) -> DoubleVector
+    insert(pos, x) -> std::vector< double >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< double >::value_type temp3 ;
+  double val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_double(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","insert", 3, argv[1] ));
+  } 
+  temp3 = static_cast< std::vector< double >::value_type >(val3);
+  arg3 = &temp3;
+  result = std_vector_Sl_double_Sg__insert__SWIG_1(arg1,arg2,(double const &)*arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::iterator arg2 ;
+  std::vector< double >::size_type arg3 ;
+  std::vector< double >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  std::vector< double >::value_type temp4 ;
+  double val4 ;
+  int ecode4 = 0 ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< double >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::size_type","insert", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< double >::size_type >(val3);
+  ecode4 = SWIG_AsVal_double(argv[2], &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "std::vector< double >::value_type","insert", 4, argv[2] ));
+  } 
+  temp4 = static_cast< std::vector< double >::value_type >(val4);
+  arg4 = &temp4;
+  std_vector_Sl_double_Sg__insert__SWIG_2(arg1,arg2,arg3,(double const &)*arg4);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleVector_insert(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_double(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleVector_insert__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          if (argc <= 3) {
+            return _wrap_DoubleVector_insert__SWIG_0(nargs, args, self);
+          }
+          return _wrap_DoubleVector_insert__SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< double >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          {
+            int res = SWIG_AsVal_double(argv[3], NULL);
+            _v = SWIG_CheckState(res);
+          }
+          if (_v) {
+            return _wrap_DoubleVector_insert__SWIG_2(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "insert", 
+    "    std::vector< double,std::allocator< double > > insert(std::vector< double >::difference_type pos, int argc, VALUE *argv, ...)\n"
+    "    std::vector< double >::iterator insert(std::vector< double >::iterator pos, std::vector< double >::value_type const &x)\n"
+    "    void insert(std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.reserve
+
+  call-seq:
+    reserve(n)
+
+Reserve memory in the DoubleVector for a number of elements.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_reserve(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  std::vector< double >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reserve", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","reserve", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< double >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.capacity
+
+  call-seq:
+    capacity -> std::vector< double >::size_type
+
+Reserved capacity of the DoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_capacity(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","capacity", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = ((std::vector< double > const *)arg1)->capacity();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleVector_mapN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","map_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__map_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleVector.delete
+
+  call-seq:
+    delete(val) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleVector_delete(int argc, VALUE *argv, VALUE self) {
+  std::vector< double > *arg1 = (std::vector< double > *) 0 ;
+  double *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double temp2 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< double > * >(argp1);
+  ecode2 = SWIG_AsVal_double(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "double","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< double >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_vector_Sl_double_Sg____delete__(arg1,(double const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_vector_Sl_double_Sg_(void *self) {
+    std::vector< double > *arg1 = (std::vector< double > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassDoubleDoubleVector;
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.dup
+
+  call-seq:
+    dup -> DoubleDoubleVector
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_dup(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_inspect(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert DoubleDoubleVector to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_to_a(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_to_s(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.slice
+
+  call-seq:
+    slice(i, length) -> VALUE
+
+Return a slice (portion of) the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_slice(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","slice", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","slice", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","slice", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__slice(arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.each
+
+  call-seq:
+    each -> DoubleDoubleVector
+
+Iterate thru each element in the DoubleDoubleVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_each(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___delete2__(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__delete2__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","__delete2__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","__delete2__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____delete2__(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  vresult = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.select
+
+  call-seq:
+    select -> DoubleDoubleVector
+
+Iterate thru each element in the DoubleDoubleVector and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_select(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.delete_at
+
+  call-seq:
+    delete_at(i) -> VALUE
+
+Delete an element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_delete_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","delete_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","delete_at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__delete_at(arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.at
+
+  call-seq:
+    at(i) -> VALUE
+
+Return element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__at((std::vector< std::vector< double > > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.[]
+
+  call-seq:
+    [](i, length) -> VALUE
+    [](i) -> VALUE
+    [](i) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0((std::vector< std::vector< double > > const *)arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  VALUE arg2 = (VALUE) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  arg2 = argv[0];
+  try {
+    result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_2((std::vector< std::vector< double > > const *)arg1,arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleDoubleVector___getitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector___getitem____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      _v = (argv[1] != 0);
+      if (_v) {
+        return _wrap_DoubleDoubleVector___getitem____SWIG_2(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_DoubleDoubleVector___getitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "__getitem__", 
+    "    VALUE __getitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type length)\n"
+    "    VALUE __getitem__(std::vector< std::vector< double > >::difference_type i)\n"
+    "    VALUE __getitem__(VALUE i)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.[]=
+
+  call-seq:
+    []=(i, x) -> VALUE
+    []=(i, length, v) -> VALUE
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","__setitem__", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","__setitem__", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  std::vector< std::vector< double > >::difference_type arg3 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3);
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &","__setitem__", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &","__setitem__", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2,arg3,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleDoubleVector___setitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector___setitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleDoubleVector___setitem____SWIG_1(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "__setitem__", 
+    "    VALUE __setitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::value_type const &x)\n"
+    "    VALUE __setitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type length, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.reject!
+
+  call-seq:
+    reject! -> DoubleDoubleVector
+
+Iterate thru each element in the DoubleDoubleVector and reject those that fail a condition.  A block must be provided.  DoubleDoubleVector is modified in place.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_rejectN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reject_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.pop
+
+  call-seq:
+    pop -> VALUE
+
+Remove and return element at the end of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_pop(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","pop", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.push
+
+  call-seq:
+    push(e) -> DoubleVector
+
+Add an element at the end of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_push(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > >::value_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","push", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","push", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","push", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__push(arg1,(std::vector< double,std::allocator< double > > const &)*arg2);
+  vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.reject
+
+  call-seq:
+    reject -> DoubleDoubleVector
+
+Iterate thru each element in the DoubleDoubleVector and reject those that fail a condition returning a new DoubleDoubleVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_reject(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reject", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.shift
+
+  call-seq:
+    shift -> VALUE
+
+Remove and return element at the beginning of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_shift(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","shift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__shift(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.insert
+
+  call-seq:
+    insert(pos, argc) -> DoubleDoubleVector
+    insert(pos, x) -> std::vector< std::vector< double > >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::difference_type arg2 ;
+  int arg3 ;
+  VALUE *arg4 = (VALUE *) 0 ;
+  void *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 2) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","insert", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2);
+  {
+    arg3 = argc - 1;
+    arg4 = argv + 1;
+  }
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,arg2,arg3,arg4,arg5);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.unshift
+
+  call-seq:
+    unshift(argc) -> DoubleDoubleVector
+
+Add one or more elements at the beginning of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_unshift(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","unshift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__unshift(arg1,arg2,arg3,arg4);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleDoubleVector__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleDoubleVector__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > > > const &","vector<(std::vector<(double)>)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > > > const &","vector<(std::vector<(double)>)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the DoubleDoubleVector is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.size
+
+  call-seq:
+    size -> std::vector< std::vector< double > >::size_type
+
+Size or Length of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_size(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_swap(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > > > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > > > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.begin
+
+  call-seq:
+    begin -> std::vector< std::vector< double > >::iterator
+
+Return an iterator to the beginning of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_begin(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.end
+
+  call-seq:
+    end -> std::vector< std::vector< double > >::iterator
+
+Return an iterator to past the end of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_end(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.rbegin
+
+  call-seq:
+    rbegin -> std::vector< std::vector< double > >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.rend
+
+  call-seq:
+    rend -> std::vector< std::vector< double > >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_rend(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.clear
+
+  call-seq:
+    clear
+
+Clear DoubleDoubleVector contents.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_clear(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(static_cast< const std::vector< std::vector< double > >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleDoubleVector__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","vector<(std::vector<(double)>)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->resize(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.erase
+
+  call-seq:
+    erase(pos) -> std::vector< std::vector< double > >::iterator
+    erase(first, last) -> std::vector< std::vector< double > >::iterator
+
+Delete a portion of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::vector< double > >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,arg2);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  swig::Iterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< std::vector< double > >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 3, argv[1] ));
+  } else {
+    swig::Iterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 3, argv[1] ));
+    }
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,arg2,arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleDoubleVector_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_DoubleDoubleVector_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::ConstIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_DoubleDoubleVector_erase__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "erase", 
+    "    std::vector< std::vector< double > >::iterator erase(std::vector< std::vector< double > >::iterator pos)\n"
+    "    std::vector< std::vector< double > >::iterator erase(std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_DoubleDoubleVector_allocate(VALUE self)
+#else
+_wrap_DoubleDoubleVector_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_DoubleDoubleVector__SWIG_3(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > >::size_type arg1 ;
+  std::vector< std::vector< double > >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > > *result = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","vector<(std::vector<(double)>)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res2 = swig::asptr(argv[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","vector<(std::vector<(double)>)>", 2, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","vector<(std::vector<(double)>)>", 2, argv[1])); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_DoubleDoubleVector(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[2];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 2) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_DoubleDoubleVector__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_DoubleDoubleVector__SWIG_2(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_DoubleDoubleVector__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_DoubleDoubleVector__SWIG_3(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 2, "DoubleDoubleVector.new", 
+    "    DoubleDoubleVector.new()\n"
+    "    DoubleDoubleVector.new(std::vector< std::vector< double,std::allocator< double > > > const &other)\n"
+    "    DoubleDoubleVector.new(std::vector< std::vector< double > >::size_type size)\n"
+    "    DoubleDoubleVector.new(std::vector< std::vector< double > >::size_type size, std::vector< std::vector< double > >::value_type const &value)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.front
+
+  call-seq:
+    front -> DoubleVector
+
+Return the first element in DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_front(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","front", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front();
+  vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.back
+
+  call-seq:
+    back -> DoubleVector
+
+Return the last element in DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_back(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","back", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back();
+  vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.assign
+
+  call-seq:
+    assign(n, x)
+
+Assign a new DoubleDoubleVector or portion of it.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_assign(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","assign", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","assign", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","assign", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","assign", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","resize", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","resize", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleDoubleVector_resize(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_DoubleDoubleVector_resize__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector_resize__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "DoubleDoubleVector.resize", 
+    "    void DoubleDoubleVector.resize(std::vector< std::vector< double > >::size_type new_size)\n"
+    "    void DoubleDoubleVector.resize(std::vector< std::vector< double > >::size_type new_size, std::vector< std::vector< double > >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.insert
+
+  call-seq:
+    insert(pos, argc) -> DoubleDoubleVector
+    insert(pos, x) -> std::vector< std::vector< double > >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  std::vector< std::vector< double > >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res3 = swig::asptr(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","insert", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","insert", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::iterator arg2 ;
+  std::vector< std::vector< double > >::size_type arg3 ;
+  std::vector< std::vector< double > >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::vector< double > >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","insert", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3);
+  {
+    std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","insert", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","insert", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_2(arg1,arg2,arg3,(std::vector< double,std::allocator< double > > const &)*arg4);
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_DoubleDoubleVector_insert(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_DoubleDoubleVector_insert__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          if (argc <= 3) {
+            return _wrap_DoubleDoubleVector_insert__SWIG_0(nargs, args, self);
+          }
+          return _wrap_DoubleDoubleVector_insert__SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::vector< double > >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_DoubleDoubleVector_insert__SWIG_2(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "insert", 
+    "    std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > insert(std::vector< std::vector< double > >::difference_type pos, int argc, VALUE *argv, ...)\n"
+    "    std::vector< std::vector< double > >::iterator insert(std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::value_type const &x)\n"
+    "    void insert(std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, std::vector< std::vector< double > >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.reserve
+
+  call-seq:
+    reserve(n)
+
+Reserve memory in the DoubleDoubleVector for a number of elements.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_reserve(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  std::vector< std::vector< double > >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reserve", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","reserve", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::DoubleDoubleVector.capacity
+
+  call-seq:
+    capacity -> std::vector< std::vector< double > >::size_type
+
+Reserved capacity of the DoubleDoubleVector.
+*/
+SWIGINTERN VALUE
+_wrap_DoubleDoubleVector_capacity(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double > >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","capacity", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1);
+  result = ((std::vector< std::vector< double > > const *)arg1)->capacity();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_vector_Sl_std_vector_Sl_double_Sg__Sg_(void *self) {
+    std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassStringVector;
+
+/*
+  Document-method: Cdi::StringVector.dup
+
+  call-seq:
+    dup -> StringVector
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_dup(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_inspect(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_string_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert StringVector to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_to_a(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_string_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_to_s(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_string_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.slice
+
+  call-seq:
+    slice(i, length) -> VALUE
+
+Return a slice (portion of) the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_slice(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","slice", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","slice", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","slice", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_std_string_Sg__slice(arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.each
+
+  call-seq:
+    each -> StringVector
+
+Iterate thru each element in the StringVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_each(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector___delete2__(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__delete2__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","__delete2__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","__delete2__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (VALUE)std_vector_Sl_std_string_Sg____delete2__(arg1,(std::string const &)*arg2);
+  vresult = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.select
+
+  call-seq:
+    select -> StringVector
+
+Iterate thru each element in the StringVector and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_select(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.delete_at
+
+  call-seq:
+    delete_at(i) -> VALUE
+
+Delete an element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_delete_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","delete_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","delete_at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_string_Sg__delete_at(arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.at
+
+  call-seq:
+    at(i) -> VALUE
+
+Return element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_string_Sg__at((std::vector< std::string > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.[]
+
+  call-seq:
+    [](i, length) -> VALUE
+    [](i) -> VALUE
+    [](i) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_0((std::vector< std::string > const *)arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  VALUE arg2 = (VALUE) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  arg2 = argv[0];
+  try {
+    result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_2((std::vector< std::string > const *)arg1,arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_StringVector___getitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_StringVector___getitem____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      _v = (argv[1] != 0);
+      if (_v) {
+        return _wrap_StringVector___getitem____SWIG_2(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_StringVector___getitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "__getitem__", 
+    "    VALUE __getitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type length)\n"
+    "    VALUE __getitem__(std::vector< std::string >::difference_type i)\n"
+    "    VALUE __getitem__(VALUE i)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.[]=
+
+  call-seq:
+    []=(i, x) -> VALUE
+    []=(i, length, v) -> VALUE
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","__setitem__", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","__setitem__", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,arg2,(std::string const &)*arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  std::vector< std::string >::difference_type arg3 ;
+  std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::string >::difference_type >(val3);
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::string,std::allocator< std::string > > const &","__setitem__", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string,std::allocator< std::string > > const &","__setitem__", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,arg2,arg3,(std::vector< std::string,std::allocator< std::string > > const &)*arg4);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_StringVector___setitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector___setitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_StringVector___setitem____SWIG_1(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "__setitem__", 
+    "    VALUE __setitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const &x)\n"
+    "    VALUE __setitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type length, std::vector< std::string,std::allocator< std::string > > const &v)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.reject!
+
+  call-seq:
+    reject! -> StringVector
+
+Iterate thru each element in the StringVector and reject those that fail a condition.  A block must be provided.  StringVector is modified in place.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_rejectN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reject_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__reject_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.pop
+
+  call-seq:
+    pop -> VALUE
+
+Remove and return element at the end of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_pop(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","pop", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_string_Sg__pop(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.push
+
+  call-seq:
+    push(e) -> std::vector< std::string >::value_type const
+
+Add an element at the end of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_push(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::string >::value_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","push", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","push", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","push", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = std_vector_Sl_std_string_Sg__push(arg1,(std::string const &)*arg2);
+  vresult = SWIG_From_std_string(static_cast< std::string >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.reject
+
+  call-seq:
+    reject -> StringVector
+
+Iterate thru each element in the StringVector and reject those that fail a condition returning a new StringVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_reject(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reject", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__reject(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.shift
+
+  call-seq:
+    shift -> VALUE
+
+Remove and return element at the beginning of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_shift(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","shift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (VALUE)std_vector_Sl_std_string_Sg__shift(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.insert
+
+  call-seq:
+    insert(pos, argc) -> StringVector
+    insert(pos, x) -> std::vector< std::string >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::difference_type arg2 ;
+  int arg3 ;
+  VALUE *arg4 = (VALUE *) 0 ;
+  void *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 2) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","insert", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::difference_type >(val2);
+  {
+    arg3 = argc - 1;
+    arg4 = argv + 1;
+  }
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,arg2,arg3,arg4,arg5);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.unshift
+
+  call-seq:
+    unshift(argc) -> StringVector
+
+Add one or more elements at the beginning of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_unshift(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","unshift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__unshift(arg1,arg2,arg3,arg4);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_StringVector__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_StringVector__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const &","vector<(std::string)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string > const &","vector<(std::string)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the StringVector is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (bool)((std::vector< std::string > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.size
+
+  call-seq:
+    size -> std::vector< std::string >::size_type
+
+Size or Length of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_size(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector_swap(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.begin
+
+  call-seq:
+    begin -> std::vector< std::string >::iterator
+
+Return an iterator to the beginning of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_begin(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.end
+
+  call-seq:
+    end -> std::vector< std::string >::iterator
+
+Return an iterator to past the end of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_end(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.rbegin
+
+  call-seq:
+    rbegin -> std::vector< std::string >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.rend
+
+  call-seq:
+    rend -> std::vector< std::string >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_rend(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.clear
+
+  call-seq:
+    clear
+
+Clear StringVector contents.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_clear(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::string > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(static_cast< const std::vector< std::string >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_StringVector__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","vector<(std::string)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->resize(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.erase
+
+  call-seq:
+    erase(pos) -> std::vector< std::string >::iterator
+    erase(first, last) -> std::vector< std::string >::iterator
+
+Delete a portion of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< std::string >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,arg2);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  swig::Iterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< std::string >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 3, argv[1] ));
+  } else {
+    swig::Iterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 3, argv[1] ));
+    }
+  }
+  result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_StringVector_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_StringVector_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::ConstIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_StringVector_erase__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "erase", 
+    "    std::vector< std::string >::iterator erase(std::vector< std::string >::iterator pos)\n"
+    "    std::vector< std::string >::iterator erase(std::vector< std::string >::iterator first, std::vector< std::string >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_StringVector_allocate(VALUE self)
+#else
+_wrap_StringVector_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_StringVector__SWIG_3(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string >::size_type arg1 ;
+  std::vector< std::string >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::vector< std::string > *result = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","vector<(std::string)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< std::string >::size_type >(val1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","vector<(std::string)>", 2, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","vector<(std::string)>", 2, argv[1])); 
+    }
+    arg2 = ptr;
+  }
+  result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_StringVector(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[2];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 2) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_StringVector__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_StringVector__SWIG_2(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_StringVector__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_StringVector__SWIG_3(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 2, "StringVector.new", 
+    "    StringVector.new()\n"
+    "    StringVector.new(std::vector< std::string > const &other)\n"
+    "    StringVector.new(std::vector< std::string >::size_type size)\n"
+    "    StringVector.new(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const &value)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.front
+
+  call-seq:
+    front -> std::vector< std::string >::value_type const &
+
+Return the first element in StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_front(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","front", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front();
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.back
+
+  call-seq:
+    back -> std::vector< std::string >::value_type const &
+
+Return the last element in StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_back(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","back", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back();
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.assign
+
+  call-seq:
+    assign(n, x)
+
+Assign a new StringVector or portion of it.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_assign(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","assign", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","assign", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","assign", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","assign", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  int res3 = SWIG_OLDOBJ ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","resize", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","resize", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_StringVector_resize(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_StringVector_resize__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector_resize__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "StringVector.resize", 
+    "    void StringVector.resize(std::vector< std::string >::size_type new_size)\n"
+    "    void StringVector.resize(std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.insert
+
+  call-seq:
+    insert(pos, argc) -> StringVector
+    insert(pos, x) -> std::vector< std::string >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  int res3 = SWIG_OLDOBJ ;
+  std::vector< std::string >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  {
+    std::string *ptr = (std::string *)0;
+    res3 = SWIG_AsPtr_std_string(argv[1], &ptr);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","insert", 3, argv[1] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","insert", 3, argv[1])); 
+    }
+    arg3 = ptr;
+  }
+  result = std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,arg2,(std::string const &)*arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res3)) delete arg3;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::iterator arg2 ;
+  std::vector< std::string >::size_type arg3 ;
+  std::vector< std::string >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< std::string >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","insert", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< std::string >::size_type >(val3);
+  {
+    std::string *ptr = (std::string *)0;
+    res4 = SWIG_AsPtr_std_string(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","insert", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","insert", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  std_vector_Sl_std_string_Sg__insert__SWIG_2(arg1,arg2,arg3,(std::string const &)*arg4);
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_StringVector_insert(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0));
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_StringVector_insert__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          if (argc <= 3) {
+            return _wrap_StringVector_insert__SWIG_0(nargs, args, self);
+          }
+          return _wrap_StringVector_insert__SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< std::string >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_StringVector_insert__SWIG_2(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "insert", 
+    "    std::vector< std::string,std::allocator< std::string > > insert(std::vector< std::string >::difference_type pos, int argc, VALUE *argv, ...)\n"
+    "    std::vector< std::string >::iterator insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const &x)\n"
+    "    void insert(std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.reserve
+
+  call-seq:
+    reserve(n)
+
+Reserve memory in the StringVector for a number of elements.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_reserve(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::vector< std::string >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reserve", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","reserve", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< std::string >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.capacity
+
+  call-seq:
+    capacity -> std::vector< std::string >::size_type
+
+Reserved capacity of the StringVector.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_capacity(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","capacity", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = ((std::vector< std::string > const *)arg1)->capacity();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_StringVector_mapN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","map_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__map_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::StringVector.delete
+
+  call-seq:
+    delete(val) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_StringVector_delete(int argc, VALUE *argv, VALUE self) {
+  std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< std::string > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","__delete__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","__delete__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (VALUE)std_vector_Sl_std_string_Sg____delete__(arg1,(std::string const &)*arg2);
+  vresult = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_vector_Sl_std_string_Sg_(void *self) {
+    std::vector< std::string > *arg1 = (std::vector< std::string > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassVarsVector;
+
+/*
+  Document-method: Cdi::VarsVector.dup
+
+  call-seq:
+    dup -> VarsVector
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_dup(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_inspect(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert VarsVector to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_to_a(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_to_s(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.slice
+
+  call-seq:
+    slice(i, length) -> VALUE
+
+Return a slice (portion of) the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_slice(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","slice", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","slice", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","slice", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_CdiVariable_Sg__slice(arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.each
+
+  call-seq:
+    each -> VarsVector
+
+Iterate thru each element in the VarsVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_each(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector___delete2__(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__delete2__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","__delete2__", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","__delete2__", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg____delete2__(arg1,(CdiVariable const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.select
+
+  call-seq:
+    select -> VarsVector
+
+Iterate thru each element in the VarsVector and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_select(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.delete_at
+
+  call-seq:
+    delete_at(i) -> VALUE
+
+Delete an element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_delete_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","delete_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","delete_at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__delete_at(arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.at
+
+  call-seq:
+    at(i) -> VALUE
+
+Return element at a certain index.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_at(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","at", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__at((std::vector< CdiVariable > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.[]
+
+  call-seq:
+    [](i, length) -> VALUE
+    [](i) -> VALUE
+    [](i) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  try {
+    result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0((std::vector< CdiVariable > const *)arg1,arg2,arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1((std::vector< CdiVariable > const *)arg1,arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  VALUE arg2 = (VALUE) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  arg2 = argv[0];
+  try {
+    result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_2((std::vector< CdiVariable > const *)arg1,arg2);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsVector___getitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsVector___getitem____SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      _v = (argv[1] != 0);
+      if (_v) {
+        return _wrap_VarsVector___getitem____SWIG_2(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_VarsVector___getitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "__getitem__", 
+    "    VALUE __getitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::difference_type length)\n"
+    "    VALUE __getitem__(std::vector< CdiVariable >::difference_type i)\n"
+    "    VALUE __getitem__(VALUE i)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.[]=
+
+  call-seq:
+    []=(i, x) -> VALUE
+    []=(i, length, v) -> VALUE
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  try {
+    result = (VALUE)std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(arg1,arg2,(CdiVariable const &)*arg3);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  std::vector< CdiVariable >::difference_type arg3 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  ptrdiff_t val3 ;
+  int ecode3 = 0 ;
+  int res4 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3);
+  {
+    std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0;
+    res4 = swig::asptr(argv[2], &ptr);
+    if (!SWIG_IsOK(res4)) {
+      SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< CdiVariable,std::allocator< CdiVariable > > const &","__setitem__", 4, argv[2] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable,std::allocator< CdiVariable > > const &","__setitem__", 4, argv[2])); 
+    }
+    arg4 = ptr;
+  }
+  try {
+    result = (VALUE)std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(arg1,arg2,arg3,(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg4);
+  } catch(std::invalid_argument &_e) {
+    SWIG_exception_fail(SWIG_ValueError, (&_e)->what());
+  }
+  vresult = result;
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res4)) delete arg4;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsVector___setitem__(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector___setitem____SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          int res = swig::asptr(argv[3], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_VarsVector___setitem____SWIG_1(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "__setitem__", 
+    "    VALUE __setitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::value_type const &x)\n"
+    "    VALUE __setitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::difference_type length, std::vector< CdiVariable,std::allocator< CdiVariable > > const &v)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.reject!
+
+  call-seq:
+    reject! -> VarsVector
+
+Iterate thru each element in the VarsVector and reject those that fail a condition.  A block must be provided.  VarsVector is modified in place.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_rejectN___(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reject_bang", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__reject_bang(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.pop
+
+  call-seq:
+    pop -> VALUE
+
+Remove and return element at the end of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_pop(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","pop", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__pop(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.push
+
+  call-seq:
+    push(e) -> CdiVariable
+
+Add an element at the end of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_push(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  std::vector< CdiVariable >::value_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","push", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","push", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","push", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  result = std_vector_Sl_CdiVariable_Sg__push(arg1,(CdiVariable const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::vector< CdiVariable >::value_type(static_cast< const std::vector< CdiVariable >::value_type& >(result))), SWIGTYPE_p_CdiVariable, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.reject
+
+  call-seq:
+    reject -> VarsVector
+
+Iterate thru each element in the VarsVector and reject those that fail a condition returning a new VarsVector.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_reject(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reject", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__reject(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.shift
+
+  call-seq:
+    shift -> VALUE
+
+Remove and return element at the beginning of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_shift(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","shift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (VALUE)std_vector_Sl_CdiVariable_Sg__shift(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.insert
+
+  call-seq:
+    insert(pos, argc) -> VarsVector
+    insert(pos, x) -> std::vector< CdiVariable >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::difference_type arg2 ;
+  int arg3 ;
+  VALUE *arg4 = (VALUE *) 0 ;
+  void *arg5 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  ptrdiff_t val2 ;
+  int ecode2 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 2) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","insert", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2);
+  {
+    arg3 = argc - 1;
+    arg4 = argv + 1;
+  }
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(arg1,arg2,arg3,arg4,arg5);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.unshift
+
+  call-seq:
+    unshift(argc) -> VarsVector
+
+Add one or more elements at the beginning of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_unshift(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","unshift", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__unshift(arg1,arg2,arg3,arg4);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsVector__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsVector__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const &","vector<(CdiVariable)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable > const &","vector<(CdiVariable)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >((std::vector< CdiVariable > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the VarsVector is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (bool)((std::vector< CdiVariable > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.size
+
+  call-seq:
+    size -> std::vector< CdiVariable >::size_type
+
+Size or Length of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_size(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector_swap(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.begin
+
+  call-seq:
+    begin -> std::vector< CdiVariable >::iterator
+
+Return an iterator to the beginning of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_begin(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.end
+
+  call-seq:
+    end -> std::vector< CdiVariable >::iterator
+
+Return an iterator to past the end of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_end(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.rbegin
+
+  call-seq:
+    rbegin -> std::vector< CdiVariable >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.rend
+
+  call-seq:
+    rend -> std::vector< CdiVariable >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_rend(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.clear
+
+  call-seq:
+    clear
+
+Clear VarsVector contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_clear(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< CdiVariable > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::vector< CdiVariable >::allocator_type(static_cast< const std::vector< CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_CdiVariable_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsVector__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable >::size_type arg1 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","vector<(CdiVariable)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1);
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  (arg1)->resize(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.erase
+
+  call-seq:
+    erase(pos) -> std::vector< CdiVariable >::iterator
+    erase(first, last) -> std::vector< CdiVariable >::iterator
+
+Delete a portion of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  std::vector< CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(arg1,arg2);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  swig::Iterator *iter3 = 0 ;
+  int res3 ;
+  std::vector< CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res3) || !iter3) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 3, argv[1] ));
+  } else {
+    swig::Iterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter3);
+    if (iter_t) {
+      arg3 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 3, argv[1] ));
+    }
+  }
+  result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(arg1,arg2,arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsVector_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        return _wrap_VarsVector_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        swig::ConstIterator *iter = 0;
+        int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+        _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+        if (_v) {
+          return _wrap_VarsVector_erase__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "erase", 
+    "    std::vector< CdiVariable >::iterator erase(std::vector< CdiVariable >::iterator pos)\n"
+    "    std::vector< CdiVariable >::iterator erase(std::vector< CdiVariable >::iterator first, std::vector< CdiVariable >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_VarsVector_allocate(VALUE self)
+#else
+_wrap_VarsVector_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsVector__SWIG_3(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable >::size_type arg1 ;
+  std::vector< CdiVariable >::value_type *arg2 = 0 ;
+  size_t val1 ;
+  int ecode1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  std::vector< CdiVariable > *result = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_size_t(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","vector<(CdiVariable)>", 1, argv[0] ));
+  } 
+  arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1);
+  res2 = SWIG_ConvertPtr(argv[1], &argp2, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","vector<(CdiVariable)>", 2, argv[1] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","vector<(CdiVariable)>", 2, argv[1])); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2);
+  result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1,(std::vector< CdiVariable >::value_type const &)*arg2);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_VarsVector(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[2];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 2) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_VarsVector__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_VarsVector__SWIG_2(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsVector__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    {
+      int res = SWIG_AsVal_size_t(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new_VarsVector__SWIG_3(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 2, "VarsVector.new", 
+    "    VarsVector.new()\n"
+    "    VarsVector.new(std::vector< CdiVariable > const &other)\n"
+    "    VarsVector.new(std::vector< CdiVariable >::size_type size)\n"
+    "    VarsVector.new(std::vector< CdiVariable >::size_type size, std::vector< CdiVariable >::value_type const &value)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.front
+
+  call-seq:
+    front -> CdiVariable
+
+Return the first element in VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_front(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","front", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->front();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.back
+
+  call-seq:
+    back -> CdiVariable
+
+Return the last element in VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_back(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::value_type *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","back", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->back();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.assign
+
+  call-seq:
+    assign(n, x)
+
+Assign a new VarsVector or portion of it.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_assign(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","assign", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","assign", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","assign", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","assign", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  (arg1)->assign(arg2,(std::vector< CdiVariable >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.resize
+
+  call-seq:
+    resize(new_size)
+    resize(new_size, x)
+
+Resize the size of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","resize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","resize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","resize", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","resize", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  (arg1)->resize(arg2,(std::vector< CdiVariable >::value_type const &)*arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsVector_resize(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsVector_resize__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector_resize__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "VarsVector.resize", 
+    "    void VarsVector.resize(std::vector< CdiVariable >::size_type new_size)\n"
+    "    void VarsVector.resize(std::vector< CdiVariable >::size_type new_size, std::vector< CdiVariable >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.insert
+
+  call-seq:
+    insert(pos, argc) -> VarsVector
+    insert(pos, x) -> std::vector< CdiVariable >::iterator
+    insert(pos, n, x)
+
+Insert one or more new elements in the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::value_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  std::vector< CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","insert", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","insert", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3);
+  result = std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(arg1,arg2,(CdiVariable const &)*arg3);
+  vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result),
+      self),
+    swig::Iterator::descriptor(),SWIG_POINTER_OWN);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::iterator arg2 ;
+  std::vector< CdiVariable >::size_type arg3 ;
+  std::vector< CdiVariable >::value_type *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::Iterator *iter2 = 0 ;
+  int res2 ;
+  size_t val3 ;
+  int ecode3 = 0 ;
+  void *argp4 ;
+  int res4 = 0 ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0);
+  if (!SWIG_IsOK(res2) || !iter2) {
+    SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] ));
+  } else {
+    swig::Iterator_T<std::vector< CdiVariable >::iterator > *iter_t = dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter2);
+    if (iter_t) {
+      arg2 = iter_t->get_current();
+    } else {
+      SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] ));
+    }
+  }
+  ecode3 = SWIG_AsVal_size_t(argv[1], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","insert", 3, argv[1] ));
+  } 
+  arg3 = static_cast< std::vector< CdiVariable >::size_type >(val3);
+  res4 = SWIG_ConvertPtr(argv[2], &argp4, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res4)) {
+    SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","insert", 4, argv[2] )); 
+  }
+  if (!argp4) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","insert", 4, argv[2])); 
+  }
+  arg4 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp4);
+  std_vector_Sl_CdiVariable_Sg__insert__SWIG_2(arg1,arg2,arg3,(CdiVariable const &)*arg4);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsVector_insert(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[5];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 5) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsVector_insert__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          if (argc <= 3) {
+            return _wrap_VarsVector_insert__SWIG_0(nargs, args, self);
+          }
+          return _wrap_VarsVector_insert__SWIG_0(nargs, args, self);
+        }
+      }
+    }
+  }
+  if (argc == 4) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      swig::ConstIterator *iter = 0;
+      int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0);
+      _v = (SWIG_IsOK(res) && iter && (dynamic_cast<swig::Iterator_T<std::vector< CdiVariable >::iterator > *>(iter) != 0));
+      if (_v) {
+        {
+          int res = SWIG_AsVal_size_t(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          void *vptr = 0;
+          int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL);
+          _v = SWIG_CheckState(res);
+          if (_v) {
+            return _wrap_VarsVector_insert__SWIG_2(nargs, args, self);
+          }
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 5, "insert", 
+    "    std::vector< CdiVariable,std::allocator< CdiVariable > > insert(std::vector< CdiVariable >::difference_type pos, int argc, VALUE *argv, ...)\n"
+    "    std::vector< CdiVariable >::iterator insert(std::vector< CdiVariable >::iterator pos, std::vector< CdiVariable >::value_type const &x)\n"
+    "    void insert(std::vector< CdiVariable >::iterator pos, std::vector< CdiVariable >::size_type n, std::vector< CdiVariable >::value_type const &x)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.reserve
+
+  call-seq:
+    reserve(n)
+
+Reserve memory in the VarsVector for a number of elements.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_reserve(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  std::vector< CdiVariable >::size_type arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reserve", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","reserve", 2, argv[0] ));
+  } 
+  arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2);
+  (arg1)->reserve(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsVector.capacity
+
+  call-seq:
+    capacity -> std::vector< CdiVariable >::size_type
+
+Reserved capacity of the VarsVector.
+*/
+SWIGINTERN VALUE
+_wrap_VarsVector_capacity(int argc, VALUE *argv, VALUE self) {
+  std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","capacity", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1);
+  result = ((std::vector< CdiVariable > const *)arg1)->capacity();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_vector_Sl_CdiVariable_Sg_(void *self) {
+    std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassVarsMap;
+
+SWIGINTERN VALUE
+_wrap_new_VarsMap__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::less< std::string > *arg1 = 0 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_std__string_t,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< std::string > const &","map<(std::string,CdiVariable)>", 1, argv[0] )); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< std::string > const &","map<(std::string,CdiVariable)>", 1, argv[0])); 
+  }
+  arg1 = reinterpret_cast< std::less< std::string > * >(argp1);
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::less< std::string > const &)*arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.dup
+
+  call-seq:
+    dup -> VarsMap
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_dup(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.delete
+
+  call-seq:
+    delete(key) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_delete(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__delete__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__delete__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg____delete__(arg1,(std::string const &)*arg2);
+  vresult = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_has_keyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","has_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","has_key", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","has_key", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.keys
+
+  call-seq:
+    keys -> VALUE
+
+Return an Array of key elements.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_keys(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","keys", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.each
+
+  call-seq:
+    each -> VarsMap
+
+Iterate thru each element in the VarsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_each(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.select
+
+  call-seq:
+    select -> VarsMap
+
+Iterate thru each element in the VarsMap and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_select(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.values_at
+
+  call-seq:
+    values_at(argc) -> VALUE
+
+Return an Array of value elements matching the conditions.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_values_at(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","values_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__values_at(arg1,arg2,arg3,arg4);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.each_key
+
+  call-seq:
+    each_key -> VarsMap
+
+Iterate thru each key element in the VarsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_each_key(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each_key(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.values
+
+  call-seq:
+    values -> VALUE
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_values(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__values(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.each_value
+
+  call-seq:
+    each_value -> VarsMap
+
+Iterate thru each key element in the VarsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_each_value(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each_value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each_value(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_entries(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","entries", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__entries(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_includeq___(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__contains__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__contains__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__contains__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(arg1,(std::string const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_key_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","key_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_value_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","value_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.[]
+
+  call-seq:
+    [](key) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap___getitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__getitem__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__getitem__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2);
+  vresult = result;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.[]=
+
+  call-seq:
+    []=(key, x)
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap___setitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  std::map< std::string,CdiVariable >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__setitem__", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__setitem__", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::map< std::string,CdiVariable >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem__(arg1,(std::string const &)*arg2,(CdiVariable const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_inspect(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert VarsMap to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_to_a(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_to_s(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsMap__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_VarsMap_allocate(VALUE self)
+#else
+_wrap_VarsMap_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsMap__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *ptr = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const &","map<(std::string,CdiVariable)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable > const &","map<(std::string,CdiVariable)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::map< std::string,CdiVariable > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_VarsMap(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_VarsMap__SWIG_1(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_std__string_t, SWIG_POINTER_NO_NULL);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsMap__SWIG_0(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsMap__SWIG_2(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "VarsMap.new", 
+    "    VarsMap.new(std::less< std::string > const &other)\n"
+    "    VarsMap.new()\n"
+    "    VarsMap.new(std::map< std::string,CdiVariable > const &other)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the VarsMap is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (bool)((std::map< std::string,CdiVariable > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.size
+
+  call-seq:
+    size -> std::map< std::string,CdiVariable >::size_type
+
+Size or Length of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_size(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_swap(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.begin
+
+  call-seq:
+    begin -> std::map< std::string,CdiVariable >::iterator
+
+Return an iterator to the beginning of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_begin(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(static_cast< const std::map< std::string,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.end
+
+  call-seq:
+    end -> std::map< std::string,CdiVariable >::iterator
+
+Return an iterator to past the end of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_end(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(static_cast< const std::map< std::string,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.rbegin
+
+  call-seq:
+    rbegin -> std::map< std::string,CdiVariable >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::reverse_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.rend
+
+  call-seq:
+    rend -> std::map< std::string,CdiVariable >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_rend(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::reverse_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.clear
+
+  call-seq:
+    clear
+
+Clear VarsMap contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_clear(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::pair< std::string const,CdiVariable > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::allocator_type(static_cast< const std::map< std::string,CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.erase
+
+  call-seq:
+    erase(x) -> std::map< std::string,CdiVariable >::size_type
+    erase(position)
+    erase(first, last)
+
+Delete a portion of the VarsMap.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","erase", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","erase", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->erase((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_count(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","count", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","count", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","count", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = ((std::map< std::string,CdiVariable > const *)arg1)->count((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp2));
+    }
+  }
+  std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::iterator arg2 ;
+  std::map< std::string,CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp2));
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 3, argv[1] )); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 3, argv[1]));
+    } else {
+      arg3 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp3));
+    }
+  }
+  std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsMap_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_VarsMap_erase__SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0));
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_VarsMap_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsMap_erase__SWIG_2(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "VarsMap.erase", 
+    "    std::map< std::string,CdiVariable >::size_type VarsMap.erase(std::map< std::string,CdiVariable >::key_type const &x)\n"
+    "    void VarsMap.erase(std::map< std::string,CdiVariable >::iterator position)\n"
+    "    void VarsMap.erase(std::map< std::string,CdiVariable >::iterator first, std::map< std::string,CdiVariable >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsMap.find
+
+  call-seq:
+    find(x) -> std::map< std::string,CdiVariable >::iterator
+
+Find an element in the class.
+*/
+SWIGINTERN VALUE
+_wrap_VarsMap_find(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","find", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","find", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","find", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->find((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(static_cast< const std::map< std::string,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_lower_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","lower_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","lower_bound", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","lower_bound", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->lower_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(static_cast< const std::map< std::string,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsMap_upper_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ;
+  std::map< std::string,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  std::map< std::string,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","upper_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","upper_bound", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","upper_bound", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  result = (arg1)->upper_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(static_cast< const std::map< std::string,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return vresult;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_map_Sl_std_string_Sc_CdiVariable_Sg_(void *self) {
+    std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassVarsByCode;
+
+SWIGINTERN VALUE
+_wrap_new_VarsByCode__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::less< int > *arg1 = 0 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiVariable)>", 1, argv[0] )); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiVariable)>", 1, argv[0])); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::less< int > const &)*arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.dup
+
+  call-seq:
+    dup -> VarsByCode
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_dup(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.delete
+
+  call-seq:
+    delete(key) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_delete(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg____delete__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_has_keyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","has_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","has_key", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg__has_key((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.keys
+
+  call-seq:
+    keys -> VALUE
+
+Return an Array of key elements.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_keys(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","keys", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__keys(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.each
+
+  call-seq:
+    each -> VarsByCode
+
+Iterate thru each element in the VarsByCode.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_each(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.select
+
+  call-seq:
+    select -> VarsByCode
+
+Iterate thru each element in the VarsByCode and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_select(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.values_at
+
+  call-seq:
+    values_at(argc) -> VALUE
+
+Return an Array of value elements matching the conditions.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_values_at(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","values_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__values_at(arg1,arg2,arg3,arg4);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.each_key
+
+  call-seq:
+    each_key -> VarsByCode
+
+Iterate thru each key element in the VarsByCode.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_each_key(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each_key(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.values
+
+  call-seq:
+    values -> VALUE
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_values(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__values(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.each_value
+
+  call-seq:
+    each_value -> VarsByCode
+
+Iterate thru each key element in the VarsByCode.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_each_value(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each_value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each_value(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_entries(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","entries", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__entries(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_includeq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__contains__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__contains__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____contains__(arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_key_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","key_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_value_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","value_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.[]
+
+  call-seq:
+    [](key) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode___getitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__getitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg____getitem__((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.[]=
+
+  call-seq:
+    []=(key, x)
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode___setitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  std::map< int,CdiVariable >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__setitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiVariable >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiVariable_Sg____setitem__(arg1,(int const &)*arg2,(CdiVariable const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_inspect(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert VarsByCode to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_to_a(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_to_s(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsByCode__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_VarsByCode_allocate(VALUE self)
+#else
+_wrap_VarsByCode_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_VarsByCode__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiVariable > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *ptr = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const &","map<(int,CdiVariable)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable > const &","map<(int,CdiVariable)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::map< int,CdiVariable > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_VarsByCode(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_VarsByCode__SWIG_1(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsByCode__SWIG_0(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_VarsByCode__SWIG_2(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "VarsByCode.new", 
+    "    VarsByCode.new(std::less< int > const &other)\n"
+    "    VarsByCode.new()\n"
+    "    VarsByCode.new(std::map< int,CdiVariable > const &other)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the VarsByCode is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (bool)((std::map< int,CdiVariable > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.size
+
+  call-seq:
+    size -> std::map< int,CdiVariable >::size_type
+
+Size or Length of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_size(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = ((std::map< int,CdiVariable > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_swap(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiVariable > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.begin
+
+  call-seq:
+    begin -> std::map< int,CdiVariable >::iterator
+
+Return an iterator to the beginning of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_begin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(static_cast< const std::map< int,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.end
+
+  call-seq:
+    end -> std::map< int,CdiVariable >::iterator
+
+Return an iterator to past the end of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_end(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(static_cast< const std::map< int,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.rbegin
+
+  call-seq:
+    rbegin -> std::map< int,CdiVariable >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::reverse_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.rend
+
+  call-seq:
+    rend -> std::map< int,CdiVariable >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_rend(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::reverse_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.clear
+
+  call-seq:
+    clear
+
+Clear VarsByCode contents.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_clear(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiVariable > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  result = ((std::map< int,CdiVariable > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::allocator_type(static_cast< const std::map< int,CdiVariable >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.erase
+
+  call-seq:
+    erase(x) -> std::map< int,CdiVariable >::size_type
+    erase(position)
+    erase(first, last)
+
+Delete a portion of the VarsByCode.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","erase", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_count(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","count", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","count", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiVariable > const *)arg1)->count((std::map< int,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp2));
+    }
+  }
+  std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_erase__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::iterator arg2 ;
+  std::map< int,CdiVariable >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp2));
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 3, argv[1] )); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 3, argv[1]));
+    } else {
+      arg3 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp3));
+    }
+  }
+  std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_VarsByCode_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_VarsByCode_erase__SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_VarsByCode_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_VarsByCode_erase__SWIG_2(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "VarsByCode.erase", 
+    "    std::map< int,CdiVariable >::size_type VarsByCode.erase(std::map< int,CdiVariable >::key_type const &x)\n"
+    "    void VarsByCode.erase(std::map< int,CdiVariable >::iterator position)\n"
+    "    void VarsByCode.erase(std::map< int,CdiVariable >::iterator first, std::map< int,CdiVariable >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::VarsByCode.find
+
+  call-seq:
+    find(x) -> std::map< int,CdiVariable >::iterator
+
+Find an element in the class.
+*/
+SWIGINTERN VALUE
+_wrap_VarsByCode_find(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","find", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","find", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(static_cast< const std::map< int,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_lower_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","lower_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","lower_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(static_cast< const std::map< int,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_VarsByCode_upper_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ;
+  std::map< int,CdiVariable >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiVariable >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","upper_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","upper_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiVariable >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(static_cast< const std::map< int,CdiVariable >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_map_Sl_int_Sc_CdiVariable_Sg_(void *self) {
+    std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassTaxesMap;
+
+SWIGINTERN VALUE
+_wrap_new_TaxesMap__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::less< int > *arg1 = 0 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiTaxis)>", 1, argv[0] )); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiTaxis)>", 1, argv[0])); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::less< int > const &)*arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.dup
+
+  call-seq:
+    dup -> TaxesMap
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_dup(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.delete
+
+  call-seq:
+    delete(key) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_delete(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg____delete__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_has_keyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","has_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","has_key", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg__has_key((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.keys
+
+  call-seq:
+    keys -> VALUE
+
+Return an Array of key elements.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_keys(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","keys", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__keys(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.each
+
+  call-seq:
+    each -> TaxesMap
+
+Iterate thru each element in the TaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_each(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.select
+
+  call-seq:
+    select -> TaxesMap
+
+Iterate thru each element in the TaxesMap and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_select(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.values_at
+
+  call-seq:
+    values_at(argc) -> VALUE
+
+Return an Array of value elements matching the conditions.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_values_at(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","values_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__values_at(arg1,arg2,arg3,arg4);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.each_key
+
+  call-seq:
+    each_key -> TaxesMap
+
+Iterate thru each key element in the TaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_each_key(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each_key(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.values
+
+  call-seq:
+    values -> VALUE
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_values(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__values(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.each_value
+
+  call-seq:
+    each_value -> TaxesMap
+
+Iterate thru each key element in the TaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_each_value(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each_value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each_value(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_entries(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","entries", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__entries(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_includeq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__contains__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__contains__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_key_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","key_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_value_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","value_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.[]
+
+  call-seq:
+    [](key) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap___getitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__getitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.[]=
+
+  call-seq:
+    []=(key, x)
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap___setitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  std::map< int,CdiTaxis >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__setitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiTaxis,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::mapped_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::mapped_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiTaxis >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiTaxis_Sg____setitem__(arg1,(int const &)*arg2,(CdiTaxis const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_inspect(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert TaxesMap to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_to_a(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_to_s(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_TaxesMap__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_TaxesMap_allocate(VALUE self)
+#else
+_wrap_TaxesMap_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_TaxesMap__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiTaxis > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *ptr = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const &","map<(int,CdiTaxis)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis > const &","map<(int,CdiTaxis)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::map< int,CdiTaxis > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_TaxesMap(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_TaxesMap__SWIG_1(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_TaxesMap__SWIG_0(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_TaxesMap__SWIG_2(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "TaxesMap.new", 
+    "    TaxesMap.new(std::less< int > const &other)\n"
+    "    TaxesMap.new()\n"
+    "    TaxesMap.new(std::map< int,CdiTaxis > const &other)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the TaxesMap is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (bool)((std::map< int,CdiTaxis > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.size
+
+  call-seq:
+    size -> std::map< int,CdiTaxis >::size_type
+
+Size or Length of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_size(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = ((std::map< int,CdiTaxis > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_swap(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.begin
+
+  call-seq:
+    begin -> std::map< int,CdiTaxis >::iterator
+
+Return an iterator to the beginning of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_begin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(static_cast< const std::map< int,CdiTaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.end
+
+  call-seq:
+    end -> std::map< int,CdiTaxis >::iterator
+
+Return an iterator to past the end of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_end(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(static_cast< const std::map< int,CdiTaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.rbegin
+
+  call-seq:
+    rbegin -> std::map< int,CdiTaxis >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::reverse_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.rend
+
+  call-seq:
+    rend -> std::map< int,CdiTaxis >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_rend(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::reverse_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.clear
+
+  call-seq:
+    clear
+
+Clear TaxesMap contents.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_clear(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiTaxis > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  result = ((std::map< int,CdiTaxis > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::allocator_type(static_cast< const std::map< int,CdiTaxis >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.erase
+
+  call-seq:
+    erase(x) -> std::map< int,CdiTaxis >::size_type
+    erase(position)
+    erase(first, last)
+
+Delete a portion of the TaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","erase", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_count(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","count", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","count", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiTaxis > const *)arg1)->count((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp2));
+    }
+  }
+  std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(arg1,arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::iterator arg2 ;
+  std::map< int,CdiTaxis >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp2));
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 3, argv[1] )); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 3, argv[1]));
+    } else {
+      arg3 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp3));
+    }
+  }
+  std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_TaxesMap_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_TaxesMap_erase__SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_TaxesMap_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_TaxesMap_erase__SWIG_2(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "TaxesMap.erase", 
+    "    std::map< int,CdiTaxis >::size_type TaxesMap.erase(std::map< int,CdiTaxis >::key_type const &x)\n"
+    "    void TaxesMap.erase(std::map< int,CdiTaxis >::iterator position)\n"
+    "    void TaxesMap.erase(std::map< int,CdiTaxis >::iterator first, std::map< int,CdiTaxis >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::TaxesMap.find
+
+  call-seq:
+    find(x) -> std::map< int,CdiTaxis >::iterator
+
+Find an element in the class.
+*/
+SWIGINTERN VALUE
+_wrap_TaxesMap_find(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","find", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","find", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(static_cast< const std::map< int,CdiTaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_lower_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","lower_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","lower_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(static_cast< const std::map< int,CdiTaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_TaxesMap_upper_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ;
+  std::map< int,CdiTaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiTaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","upper_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","upper_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiTaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(static_cast< const std::map< int,CdiTaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_map_Sl_int_Sc_CdiTaxis_Sg_(void *self) {
+    std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassZaxesMap;
+
+SWIGINTERN VALUE
+_wrap_new_ZaxesMap__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::less< int > *arg1 = 0 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiZaxis)>", 1, argv[0] )); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiZaxis)>", 1, argv[0])); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::less< int > const &)*arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.dup
+
+  call-seq:
+    dup -> ZaxesMap
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_dup(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.delete
+
+  call-seq:
+    delete(key) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_delete(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg____delete__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_has_keyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","has_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","has_key", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg__has_key((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.keys
+
+  call-seq:
+    keys -> VALUE
+
+Return an Array of key elements.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_keys(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","keys", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__keys(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.each
+
+  call-seq:
+    each -> ZaxesMap
+
+Iterate thru each element in the ZaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_each(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.select
+
+  call-seq:
+    select -> ZaxesMap
+
+Iterate thru each element in the ZaxesMap and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_select(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.values_at
+
+  call-seq:
+    values_at(argc) -> VALUE
+
+Return an Array of value elements matching the conditions.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_values_at(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","values_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__values_at(arg1,arg2,arg3,arg4);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.each_key
+
+  call-seq:
+    each_key -> ZaxesMap
+
+Iterate thru each key element in the ZaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_each_key(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each_key(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.values
+
+  call-seq:
+    values -> VALUE
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_values(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__values(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.each_value
+
+  call-seq:
+    each_value -> ZaxesMap
+
+Iterate thru each key element in the ZaxesMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_each_value(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each_value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each_value(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_entries(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","entries", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__entries(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_includeq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__contains__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__contains__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_key_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","key_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_value_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","value_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.[]
+
+  call-seq:
+    [](key) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap___getitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__getitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.[]=
+
+  call-seq:
+    []=(key, x)
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap___setitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  std::map< int,CdiZaxis >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__setitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiZaxis,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::mapped_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::mapped_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiZaxis >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiZaxis_Sg____setitem__(arg1,(int const &)*arg2,(CdiZaxis const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_inspect(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert ZaxesMap to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_to_a(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_to_s(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_ZaxesMap__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_ZaxesMap_allocate(VALUE self)
+#else
+_wrap_ZaxesMap_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_ZaxesMap__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiZaxis > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *ptr = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const &","map<(int,CdiZaxis)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis > const &","map<(int,CdiZaxis)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::map< int,CdiZaxis > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_ZaxesMap(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_ZaxesMap__SWIG_1(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ZaxesMap__SWIG_0(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_ZaxesMap__SWIG_2(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "ZaxesMap.new", 
+    "    ZaxesMap.new(std::less< int > const &other)\n"
+    "    ZaxesMap.new()\n"
+    "    ZaxesMap.new(std::map< int,CdiZaxis > const &other)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the ZaxesMap is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (bool)((std::map< int,CdiZaxis > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.size
+
+  call-seq:
+    size -> std::map< int,CdiZaxis >::size_type
+
+Size or Length of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_size(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = ((std::map< int,CdiZaxis > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_swap(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.begin
+
+  call-seq:
+    begin -> std::map< int,CdiZaxis >::iterator
+
+Return an iterator to the beginning of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_begin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(static_cast< const std::map< int,CdiZaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.end
+
+  call-seq:
+    end -> std::map< int,CdiZaxis >::iterator
+
+Return an iterator to past the end of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_end(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(static_cast< const std::map< int,CdiZaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.rbegin
+
+  call-seq:
+    rbegin -> std::map< int,CdiZaxis >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::reverse_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.rend
+
+  call-seq:
+    rend -> std::map< int,CdiZaxis >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_rend(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::reverse_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.clear
+
+  call-seq:
+    clear
+
+Clear ZaxesMap contents.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_clear(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiZaxis > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  result = ((std::map< int,CdiZaxis > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::allocator_type(static_cast< const std::map< int,CdiZaxis >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.erase
+
+  call-seq:
+    erase(x) -> std::map< int,CdiZaxis >::size_type
+    erase(position)
+    erase(first, last)
+
+Delete a portion of the ZaxesMap.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","erase", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_count(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","count", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","count", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiZaxis > const *)arg1)->count((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp2));
+    }
+  }
+  std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(arg1,arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::iterator arg2 ;
+  std::map< int,CdiZaxis >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp2));
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 3, argv[1] )); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 3, argv[1]));
+    } else {
+      arg3 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp3));
+    }
+  }
+  std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_ZaxesMap_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_ZaxesMap_erase__SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_ZaxesMap_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_ZaxesMap_erase__SWIG_2(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "ZaxesMap.erase", 
+    "    std::map< int,CdiZaxis >::size_type ZaxesMap.erase(std::map< int,CdiZaxis >::key_type const &x)\n"
+    "    void ZaxesMap.erase(std::map< int,CdiZaxis >::iterator position)\n"
+    "    void ZaxesMap.erase(std::map< int,CdiZaxis >::iterator first, std::map< int,CdiZaxis >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::ZaxesMap.find
+
+  call-seq:
+    find(x) -> std::map< int,CdiZaxis >::iterator
+
+Find an element in the class.
+*/
+SWIGINTERN VALUE
+_wrap_ZaxesMap_find(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","find", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","find", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(static_cast< const std::map< int,CdiZaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_lower_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","lower_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","lower_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(static_cast< const std::map< int,CdiZaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_ZaxesMap_upper_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ;
+  std::map< int,CdiZaxis >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiZaxis >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","upper_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","upper_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiZaxis >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(static_cast< const std::map< int,CdiZaxis >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_map_Sl_int_Sc_CdiZaxis_Sg_(void *self) {
+    std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassGridsMap;
+
+SWIGINTERN VALUE
+_wrap_new_GridsMap__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::less< int > *arg1 = 0 ;
+  void *argp1 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t,  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiGrid)>", 1, argv[0] )); 
+  }
+  if (!argp1) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiGrid)>", 1, argv[0])); 
+  }
+  arg1 = reinterpret_cast< std::less< int > * >(argp1);
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::less< int > const &)*arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.dup
+
+  call-seq:
+    dup -> GridsMap
+
+Create a duplicate of the class and unfreeze it if needed.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_dup(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","dup", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__dup(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.delete
+
+  call-seq:
+    delete(key) -> VALUE
+
+Delete a matching element.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_delete(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__delete__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__delete__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg____delete__(arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_has_keyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","has_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","has_key", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg__has_key((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.keys
+
+  call-seq:
+    keys -> VALUE
+
+Return an Array of key elements.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_keys(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","keys", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__keys(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.each
+
+  call-seq:
+    each -> GridsMap
+
+Iterate thru each element in the GridsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_each(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.select
+
+  call-seq:
+    select -> GridsMap
+
+Iterate thru each element in the GridsMap and select those that match a condition.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_select(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","select", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__select(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.values_at
+
+  call-seq:
+    values_at(argc) -> VALUE
+
+Return an Array of value elements matching the conditions.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_values_at(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  int arg2 ;
+  VALUE *arg3 = (VALUE *) 0 ;
+  void *arg4 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if (argc < 1) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","values_at", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  {
+    arg2 = argc;
+    arg3 = argv;
+  }
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__values_at(arg1,arg2,arg3,arg4);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.each_key
+
+  call-seq:
+    each_key -> GridsMap
+
+Iterate thru each key element in the GridsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_each_key(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each_key", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each_key(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.values
+
+  call-seq:
+    values -> VALUE
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_values(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__values(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.each_value
+
+  call-seq:
+    each_value -> GridsMap
+
+Iterate thru each key element in the GridsMap.  A block must be provided.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_each_value(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each_value", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each_value(arg1);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_entries(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","entries", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__entries(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_includeq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__contains__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__contains__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____contains__(arg1,(int const &)*arg2);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_key_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","key_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_value_iterator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  VALUE *arg2 = (VALUE *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  swig::ConstIterator *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  arg2 = &self;
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","value_iterator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(arg1,arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.[]
+
+  call-seq:
+    [](key) -> VALUE
+
+Element accessor/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap___getitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","__getitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__getitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg____getitem__((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.[]=
+
+  call-seq:
+    []=(key, x)
+
+Element setter/slicing.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap___setitem__(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  std::map< int,CdiGrid >::mapped_type *arg3 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__setitem__", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__setitem__", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiGrid,  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::mapped_type const &","__setitem__", 3, argv[1] )); 
+  }
+  if (!argp3) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::mapped_type const &","__setitem__", 3, argv[1])); 
+  }
+  arg3 = reinterpret_cast< std::map< int,CdiGrid >::mapped_type * >(argp3);
+  try {
+    std_map_Sl_int_Sc_CdiGrid_Sg____setitem__(arg1,(int const &)*arg2,(CdiGrid const &)*arg3);
+  } catch(std::out_of_range &_e) {
+    SWIG_exception_fail(SWIG_IndexError, (&_e)->what());
+  }
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.inspect
+
+  call-seq:
+    inspect -> VALUE
+
+Inspect class and its contents.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_inspect(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","inspect", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__inspect(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.to_a
+
+  call-seq:
+    to_a -> VALUE
+
+Convert GridsMap to an Array.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_to_a(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","to_a", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__to_a(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.to_s
+
+  call-seq:
+    to_s -> VALUE
+
+Convert class to a String representation.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_to_s(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  VALUE result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","to_s", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__to_s(arg1);
+  vresult = result;
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_GridsMap__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_GridsMap_allocate(VALUE self)
+#else
+_wrap_GridsMap_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_GridsMap__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = 0 ;
+  int res1 = SWIG_OLDOBJ ;
+  std::map< int,CdiGrid > *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  {
+    std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *ptr = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)0;
+    res1 = swig::asptr(argv[0], &ptr);
+    if (!SWIG_IsOK(res1)) {
+      SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const &","map<(int,CdiGrid)>", 1, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid > const &","map<(int,CdiGrid)>", 1, argv[0])); 
+    }
+    arg1 = ptr;
+  }
+  result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::map< int,CdiGrid > const &)*arg1);
+  DATA_PTR(self) = result;
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return self;
+fail:
+  if (SWIG_IsNewObj(res1)) delete arg1;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_GridsMap(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_GridsMap__SWIG_1(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GridsMap__SWIG_0(nargs, args, self);
+    }
+  }
+  if (argc == 1) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new_GridsMap__SWIG_2(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "GridsMap.new", 
+    "    GridsMap.new(std::less< int > const &other)\n"
+    "    GridsMap.new()\n"
+    "    GridsMap.new(std::map< int,CdiGrid > const &other)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.empty?
+
+  call-seq:
+    empty? -> bool
+
+Check if the GridsMap is empty or not.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_emptyq___(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","empty", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (bool)((std::map< int,CdiGrid > const *)arg1)->empty();
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.size
+
+  call-seq:
+    size -> std::map< int,CdiGrid >::size_type
+
+Size or Length of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_size(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = ((std::map< int,CdiGrid > const *)arg1)->size();
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_swap(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid > *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","swap", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > &","swap", 2, argv[0] )); 
+  }
+  if (!argp2) {
+    SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid > &","swap", 2, argv[0])); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiGrid > * >(argp2);
+  (arg1)->swap(*arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.begin
+
+  call-seq:
+    begin -> std::map< int,CdiGrid >::iterator
+
+Return an iterator to the beginning of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_begin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","begin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->begin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(static_cast< const std::map< int,CdiGrid >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.end
+
+  call-seq:
+    end -> std::map< int,CdiGrid >::iterator
+
+Return an iterator to past the end of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_end(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","end", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->end();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(static_cast< const std::map< int,CdiGrid >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.rbegin
+
+  call-seq:
+    rbegin -> std::map< int,CdiGrid >::reverse_iterator
+
+Return a reverse iterator to the beginning (the end) of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_rbegin(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","rbegin", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->rbegin();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::reverse_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.rend
+
+  call-seq:
+    rend -> std::map< int,CdiGrid >::reverse_iterator
+
+Return a reverse iterator to past the end (past the beginning) of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_rend(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::reverse_iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","rend", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = (arg1)->rend();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::reverse_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.clear
+
+  call-seq:
+    clear
+
+Clear GridsMap contents.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_clear(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","clear", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  (arg1)->clear();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_get_allocator(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::allocator< std::pair< int const,CdiGrid > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","get_allocator", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  result = ((std::map< int,CdiGrid > const *)arg1)->get_allocator();
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::allocator_type(static_cast< const std::map< int,CdiGrid >::allocator_type& >(result))), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.erase
+
+  call-seq:
+    erase(x) -> std::map< int,CdiGrid >::size_type
+    erase(position)
+    erase(first, last)
+
+Delete a portion of the GridsMap.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","erase", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->erase((std::map< int,CdiGrid >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_count(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::size_type result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","count", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","count", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = ((std::map< int,CdiGrid > const *)arg1)->count((std::map< int,CdiGrid >::key_type const &)*arg2);
+  vresult = SWIG_From_size_t(static_cast< size_t >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::iterator arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp2));
+    }
+  }
+  std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(arg1,arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::iterator arg2 ;
+  std::map< int,CdiGrid >::iterator arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0] )); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0]));
+    } else {
+      arg2 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp2));
+    }
+  }
+  {
+    res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator,  0 );
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 3, argv[1] )); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 3, argv[1]));
+    } else {
+      arg3 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp3));
+    }
+  }
+  std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(arg1,arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_GridsMap_erase(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[4];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 4) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_GridsMap_erase__SWIG_1(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_GridsMap_erase__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0));
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      void *vptr = 0;
+      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_GridsMap_erase__SWIG_2(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 4, "GridsMap.erase", 
+    "    std::map< int,CdiGrid >::size_type GridsMap.erase(std::map< int,CdiGrid >::key_type const &x)\n"
+    "    void GridsMap.erase(std::map< int,CdiGrid >::iterator position)\n"
+    "    void GridsMap.erase(std::map< int,CdiGrid >::iterator first, std::map< int,CdiGrid >::iterator last)\n");
+  
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::GridsMap.find
+
+  call-seq:
+    find(x) -> std::map< int,CdiGrid >::iterator
+
+Find an element in the class.
+*/
+SWIGINTERN VALUE
+_wrap_GridsMap_find(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","find", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","find", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->find((std::map< int,CdiGrid >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(static_cast< const std::map< int,CdiGrid >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_lower_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","lower_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","lower_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->lower_bound((std::map< int,CdiGrid >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(static_cast< const std::map< int,CdiGrid >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_GridsMap_upper_bound(int argc, VALUE *argv, VALUE self) {
+  std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ;
+  std::map< int,CdiGrid >::key_type *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid >::key_type temp2 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  std::map< int,CdiGrid >::iterator result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","upper_bound", 1, self )); 
+  }
+  arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","upper_bound", 2, argv[0] ));
+  } 
+  temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2);
+  arg2 = &temp2;
+  result = (arg1)->upper_bound((std::map< int,CdiGrid >::key_type const &)*arg2);
+  vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(static_cast< const std::map< int,CdiGrid >::iterator& >(result))), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_std_map_Sl_int_Sc_CdiGrid_Sg_(void *self) {
+    std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *)self;
+    delete arg1;
+}
+
+static swig_class SwigClassCdiGrid;
+
+SWIGINTERN VALUE
+_wrap_new_CdiGrid__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (CdiGrid *)new CdiGrid();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_CdiGrid_allocate(VALUE self)
+#else
+_wrap_CdiGrid_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiGrid);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_CdiGrid__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiGrid *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_int(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiGrid", 1, argv[0] ));
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiGrid *)new CdiGrid(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_CdiGrid(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_CdiGrid__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiGrid__SWIG_1(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "CdiGrid.new", 
+    "    CdiGrid.new()\n"
+    "    CdiGrid.new(int gridid)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_CdiGrid(void *self) {
+    CdiGrid *arg1 = (CdiGrid *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_gridID_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","gridID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","gridID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->gridID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_gridID_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","gridID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->gridID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_type_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_type_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->type);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::CdiGrid.size
+
+  call-seq:
+    size -> int
+
+Size or Length of the CdiGrid.
+*/
+/*
+  Document-method: Cdi::CdiGrid.size=
+
+  call-seq:
+    size=(x) -> int
+
+Size or Length of the CdiGrid.
+*/
+SWIGINTERN VALUE
+_wrap_CdiGrid_size_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_size_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->size);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xsize_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xsize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","xsize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->xsize = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xsize_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xsize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->xsize);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ysize_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ysize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ysize", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ysize = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ysize_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ysize", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->ysize);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_prec_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","prec", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","prec", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->prec = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_prec_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","prec", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->prec);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ncorner_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ncorner", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ncorner", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ncorner = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ncorner_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ncorner", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (int) ((arg1)->ncorner);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasXValues_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasXValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasXValues", 2, argv[0] ));
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasXValues = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasXValues_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasXValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasXValues);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasYValues_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasYValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasYValues", 2, argv[0] ));
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasYValues = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasYValues_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasYValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasYValues);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasBounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  bool arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  ecode2 = SWIG_AsVal_bool(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasBounds", 2, argv[0] ));
+  } 
+  arg2 = static_cast< bool >(val2);
+  if (arg1) (arg1)->hasBounds = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_hasBounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  bool result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (bool) ((arg1)->hasBounds);
+  vresult = SWIG_From_bool(static_cast< bool >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xvalues_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xvalues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","xvalues", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->xvalues = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xvalues_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xvalues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xvalues);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yvalues_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yvalues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","yvalues", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->yvalues = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yvalues_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yvalues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->yvalues);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xbounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","xbounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->xbounds = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xbounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xbounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ybounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ybounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","ybounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->ybounds = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ybounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ybounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ybounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xlongname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xlongname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xlongname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xlongname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xlongname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xlongname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xlongname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xlongname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xstdname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xstdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xstdname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xstdname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xstdname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xstdname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xstdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xstdname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xunits_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xunits", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xunits", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xunits", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->xunits = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_xunits_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xunits", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->xunits);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","yname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","yname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->yname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->yname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ylongname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ylongname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ylongname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ylongname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->ylongname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ylongname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ylongname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->ylongname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ystdname_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ystdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ystdname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ystdname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->ystdname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_ystdname_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ystdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->ystdname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yunits_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yunits", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","yunits", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","yunits", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->yunits = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_yunits_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yunits", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->yunits);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_name_set(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_name_get(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getValues(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  (arg1)->getValues();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getBounds(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  (arg1)->getBounds();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getValuesAsPointer(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  double *arg2 = (double *) 0 ;
+  double *arg3 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getValuesAsPointer", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","getValuesAsPointer", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "double *","getValuesAsPointer", 3, argv[1] )); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  (arg1)->getValuesAsPointer(arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getBoundsAsPointer(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  double *arg2 = (double *) 0 ;
+  double *arg3 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getBoundsAsPointer", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","getBoundsAsPointer", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "double *","getBoundsAsPointer", 3, argv[1] )); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  (arg1)->getBoundsAsPointer(arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getFloatVals(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  float *arg2 = (float *) 0 ;
+  float *arg3 = (float *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getFloatVals", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "float *","getFloatVals", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< float * >(argp2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "float *","getFloatVals", 3, argv[1] )); 
+  }
+  arg3 = reinterpret_cast< float * >(argp3);
+  (arg1)->getFloatVals(arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiGrid_getFloatBounds(int argc, VALUE *argv, VALUE self) {
+  CdiGrid *arg1 = (CdiGrid *) 0 ;
+  float *arg2 = (float *) 0 ;
+  float *arg3 = (float *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  
+  if ((argc < 2) || (argc > 2)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getFloatBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiGrid * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "float *","getFloatBounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< float * >(argp2);
+  res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_float, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "float *","getFloatBounds", 3, argv[1] )); 
+  }
+  arg3 = reinterpret_cast< float * >(argp3);
+  (arg1)->getFloatBounds(arg2,arg3);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+static swig_class SwigClassCdiTaxis;
+
+SWIGINTERN VALUE
+_wrap_new_CdiTaxis__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (CdiTaxis *)new CdiTaxis();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_CdiTaxis_allocate(VALUE self)
+#else
+_wrap_CdiTaxis_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiTaxis);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_CdiTaxis__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiTaxis *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_int(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiTaxis", 1, argv[0] ));
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiTaxis *)new CdiTaxis(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_CdiTaxis(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_CdiTaxis__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiTaxis__SWIG_1(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "CdiTaxis.new", 
+    "    CdiTaxis.new()\n"
+    "    CdiTaxis.new(int vlistID)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_CdiTaxis(void *self) {
+    CdiTaxis *arg1 = (CdiTaxis *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_taxisID_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_taxisID_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_ntsteps_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","ntsteps", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ntsteps", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ntsteps = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_ntsteps_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","ntsteps", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->ntsteps);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_unit_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unit", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","unit", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->unit = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_unit_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unit", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->unit);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_rdate_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rdate", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","rdate", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->rdate = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_rdate_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rdate", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->rdate);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_rtime_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rtime", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","rtime", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->rtime = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_rtime_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rtime", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->rtime);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_vdate_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vdate", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vdate", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vdate = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_vdate_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vdate", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->vdate);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_vtime_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vtime", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vtime", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vtime = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_vtime_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vtime", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->vtime);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_type_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_type_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->type);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_calendar_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","calendar", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","calendar", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->calendar = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_calendar_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","calendar", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->calendar);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_hasBounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","hasBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","hasBounds", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->hasBounds = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_hasBounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","hasBounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (int) ((arg1)->hasBounds);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_name_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  char *arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char temp2[CDI_MAX_NAME] ;
+  int res2 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  res2 = SWIG_AsCharArray(argv[0], temp2, CDI_MAX_NAME);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char [CDI_MAX_NAME]","name", 2, argv[0] ));
+  }
+  arg2 = reinterpret_cast< char * >(temp2);
+  if (arg2) memcpy(arg1->name,arg2,CDI_MAX_NAME*sizeof(char));
+  else memset(arg1->name,0,CDI_MAX_NAME*sizeof(char));
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_name_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (char *)(char *) ((arg1)->name);
+  {
+    size_t size = SWIG_strnlen(result, CDI_MAX_NAME);
+    
+    
+    
+    vresult = SWIG_FromCharPtrAndSize(result, size);
+  }
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_unitname_set(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unitname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","unitname", 2, argv[0] ));
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  if (arg2) {
+    size_t size = strlen(reinterpret_cast< const char * >(reinterpret_cast< const char * >(arg2))) + 1;
+    arg1->unitname = (char const *)reinterpret_cast< char* >(memcpy(new char[size], arg2, sizeof(char)*(size)));
+  } else {
+    arg1->unitname = 0;
+  }
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return Qnil;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiTaxis_unitname_get(int argc, VALUE *argv, VALUE self) {
+  CdiTaxis *arg1 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unitname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiTaxis * >(argp1);
+  result = (char *) ((arg1)->unitname);
+  vresult = SWIG_FromCharPtr((const char *)result);
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+static swig_class SwigClassCdiZaxis;
+
+SWIGINTERN VALUE
+_wrap_new_CdiZaxis__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (CdiZaxis *)new CdiZaxis();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_CdiZaxis_allocate(VALUE self)
+#else
+_wrap_CdiZaxis_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiZaxis);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_CdiZaxis__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  int arg1 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  CdiZaxis *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_int(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiZaxis", 1, argv[0] ));
+  } 
+  arg1 = static_cast< int >(val1);
+  result = (CdiZaxis *)new CdiZaxis(arg1);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_CdiZaxis(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[1];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 1) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_CdiZaxis__SWIG_0(nargs, args, self);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new_CdiZaxis__SWIG_1(nargs, args, self);
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 1, "CdiZaxis.new", 
+    "    CdiZaxis.new()\n"
+    "    CdiZaxis.new(int zaxisid)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_CdiZaxis(void *self) {
+    CdiZaxis *arg1 = (CdiZaxis *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_zaxisID_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","zaxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","zaxisID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->zaxisID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_zaxisID_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","zaxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->zaxisID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_type_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->type = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_type_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","type", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->type);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_ltype_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ltype", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ltype", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ltype = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_ltype_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ltype", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->ltype);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::CdiZaxis.size
+
+  call-seq:
+    size -> int
+
+Size or Length of the CdiZaxis.
+*/
+/*
+  Document-method: Cdi::CdiZaxis.size=
+
+  call-seq:
+    size=(x) -> int
+
+Size or Length of the CdiZaxis.
+*/
+SWIGINTERN VALUE
+_wrap_CdiZaxis_size_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_size_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->size);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_prec_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","prec", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","prec", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->prec = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_prec_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","prec", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (int) ((arg1)->prec);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_plevels_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plevels", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","plevels", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->plevels = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_plevels_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plevels", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->plevels);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_plbounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","plbounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->plbounds = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_plbounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->plbounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_pubounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pubounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","pubounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->pubounds = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_pubounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pubounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->pubounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_pweights_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pweights", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","pweights", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->pweights = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_pweights_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pweights", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (double *) ((arg1)->pweights);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_levels_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","levels", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","levels", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->levels = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_levels_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","levels", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->levels);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_lbounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","lbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","lbounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->lbounds = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_lbounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","lbounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->lbounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_ubounds_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ubounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","ubounds", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->ubounds = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_ubounds_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ubounds", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ubounds);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_weights_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","weights", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","weights", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->weights = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_weights_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","weights", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->weights);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_name_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_name_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_longname_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","longname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","longname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","longname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->longname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_longname_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","longname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->longname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_units_set(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","units", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","units", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","units", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->units = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiZaxis_units_get(int argc, VALUE *argv, VALUE self) {
+  CdiZaxis *arg1 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","units", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiZaxis * >(argp1);
+  result = (std::string *) & ((arg1)->units);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+static swig_class SwigClassCdiVariable;
+
+SWIGINTERN VALUE
+_wrap_new_CdiVariable__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *result = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  result = (CdiVariable *)new CdiVariable();
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_CdiVariable_allocate(VALUE self)
+#else
+_wrap_CdiVariable_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiVariable);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_CdiVariable__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  int arg1 ;
+  int arg2 ;
+  int arg3 ;
+  int val1 ;
+  int ecode1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  CdiVariable *result = 0 ;
+  
+  if ((argc < 3) || (argc > 3)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail;
+  }
+  ecode1 = SWIG_AsVal_int(argv[0], &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiVariable", 1, argv[0] ));
+  } 
+  arg1 = static_cast< int >(val1);
+  ecode2 = SWIG_AsVal_int(argv[1], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","CdiVariable", 2, argv[1] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  ecode3 = SWIG_AsVal_int(argv[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "int","CdiVariable", 3, argv[2] ));
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (CdiVariable *)new CdiVariable(arg1,arg2,arg3);
+  DATA_PTR(self) = result;
+  return self;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_new_CdiVariable(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs;
+  if (argc > 3) SWIG_fail;
+  for (ii = 0; (ii < argc); ++ii) {
+    argv[ii] = args[ii];
+  }
+  if (argc == 0) {
+    return _wrap_new_CdiVariable__SWIG_0(nargs, args, self);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_int(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        {
+          int res = SWIG_AsVal_int(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new_CdiVariable__SWIG_1(nargs, args, self);
+        }
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "CdiVariable.new", 
+    "    CdiVariable.new()\n"
+    "    CdiVariable.new(int streamid, int vlistid, int varid)\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_CdiVariable(void *self) {
+    CdiVariable *arg1 = (CdiVariable *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_varID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","varID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","varID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->varID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_varID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","varID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->varID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_zaxisID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","zaxisID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->zaxisID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_zaxisID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->zaxisID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_gridID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","gridID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","gridID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->gridID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_gridID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","gridID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->gridID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_taxisID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_taxisID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_timeID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","timeID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","timeID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->timeID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_timeID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","timeID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->timeID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_vlistID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","vlistID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vlistID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vlistID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_vlistID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","vlistID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->vlistID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::CdiVariable.size
+
+  call-seq:
+    size -> int
+
+Size or Length of the CdiVariable.
+*/
+/*
+  Document-method: Cdi::CdiVariable.size=
+
+  call-seq:
+    size=(x) -> int
+
+Size or Length of the CdiVariable.
+*/
+SWIGINTERN VALUE
+_wrap_CdiVariable_size_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->size = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_size_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","size", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->size);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_code_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","code", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","code", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->code = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_code_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","code", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->code);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_datatype_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","datatype", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","datatype", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->datatype = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_datatype_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","datatype", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->datatype);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_streamID_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","streamID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","streamID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->streamID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_streamID_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","streamID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (int) ((arg1)->streamID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_name_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->name = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_name_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","name", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->name);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_longname_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","longname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","longname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","longname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->longname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_longname_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","longname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->longname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_units_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","units", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","units", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","units", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->units = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_units_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","units", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->units);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_stdname_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::string *arg2 = 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","stdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(argv[0], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","stdname", 2, argv[0] )); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","stdname", 2, argv[0])); 
+    }
+    arg2 = ptr;
+  }
+  if (arg1) (arg1)->stdname = *arg2;
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_stdname_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::string *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","stdname", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::string *) & ((arg1)->stdname);
+  vresult = SWIG_From_std_string(static_cast< std::string >(*result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_missval_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","missval", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_double(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "double","missval", 2, argv[0] ));
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->missval = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_missval_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","missval", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double) ((arg1)->missval);
+  vresult = SWIG_From_double(static_cast< double >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+/*
+  Document-method: Cdi::CdiVariable.values
+
+  call-seq:
+    values -> DoubleVector
+
+Return an Array of value elements.
+*/
+/*
+  Document-method: Cdi::CdiVariable.values=
+
+  call-seq:
+    values=(x) -> DoubleVector
+
+Return an Array of value elements.
+*/
+SWIGINTERN VALUE
+_wrap_CdiVariable_values_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","values", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2);
+  if (arg1) (arg1)->values = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_values_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< double,std::allocator< double > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","values", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::vector< double,std::allocator< double > > *)& ((arg1)->values);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_valuesWithLevel_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","valuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *","valuesWithLevel", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > * >(argp2);
+  if (arg1) (arg1)->valuesWithLevel = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_valuesWithLevel_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","valuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)& ((arg1)->valuesWithLevel);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_grid_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiGrid *arg2 = (CdiGrid *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","grid", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiGrid, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiGrid *","grid", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< CdiGrid * >(argp2);
+  if (arg1) (arg1)->grid = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_grid_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  CdiGrid *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","grid", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiGrid *)& ((arg1)->grid);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_zaxis_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiZaxis *arg2 = (CdiZaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxis", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiZaxis *","zaxis", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< CdiZaxis * >(argp2);
+  if (arg1) (arg1)->zaxis = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_zaxis_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  CdiZaxis *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxis", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiZaxis *)& ((arg1)->zaxis);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_taxis_set(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  CdiTaxis *arg2 = (CdiTaxis *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxis", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiTaxis *","taxis", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< CdiTaxis * >(argp2);
+  if (arg1) (arg1)->taxis = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_taxis_get(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  CdiTaxis *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxis", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (CdiTaxis *)& ((arg1)->taxis);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_sinfo(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","sinfo", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->sinfo();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValues(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->getValues();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValuesWithLevel__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getValuesWithLevel", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  (arg1)->getValuesWithLevel(arg2);
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValuesWithLevel__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  (arg1)->getValuesWithLevel();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevel(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getValuesWithLevel__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getValuesWithLevel__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getValuesWithLevel", 
+    "    void CdiVariable.getValuesWithLevel(int tsID)\n"
+    "    void CdiVariable.getValuesWithLevel()\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getFValues(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::vector< float,std::allocator< float > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValues", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (arg1)->getFValues();
+  vresult = SWIG_NewPointerObj((new std::vector< float,std::allocator< float > >(static_cast< const std::vector< float,std::allocator< float > >& >(result))), SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getFValuesWithLevel__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getFValuesWithLevel", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  result = (arg1)->getFValuesWithLevel(arg2);
+  vresult = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(static_cast< const std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >& >(result))), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getFValuesWithLevel__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValuesWithLevel", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (arg1)->getFValuesWithLevel();
+  vresult = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(static_cast< const std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >& >(result))), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_CdiVariable_getFValuesWithLevel(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getFValuesWithLevel__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getFValuesWithLevel__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getFValuesWithLevel", 
+    "    std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > CdiVariable.getFValuesWithLevel(int tsID)\n"
+    "    std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > CdiVariable.getFValuesWithLevel()\n");
+  
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValuesAsPointer(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesAsPointer", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double *)(arg1)->getValuesAsPointer();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  double **result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevelAsPointer", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getValuesWithLevelAsPointer", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  result = (double **)(arg1)->getValuesWithLevelAsPointer(arg2);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(int argc, VALUE *argv, VALUE self) {
+  CdiVariable *arg1 = (CdiVariable *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double **result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevelAsPointer", 1, self )); 
+  }
+  arg1 = reinterpret_cast< CdiVariable * >(argp1);
+  result = (double **)(arg1)->getValuesWithLevelAsPointer();
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevelAsPointer(int nargs, VALUE *args, VALUE self) {
+  int argc;
+  VALUE argv[3];
+  int ii;
+  
+  argc = nargs + 1;
+  argv[0] = self;
+  if (argc > 3) SWIG_fail;
+  for (ii = 1; (ii < argc); ++ii) {
+    argv[ii] = args[ii-1];
+  }
+  if (argc == 1) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(nargs, args, self);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_int(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(nargs, args, self);
+      }
+    }
+  }
+  
+fail:
+  Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getValuesWithLevelAsPointer", 
+    "    double CdiVariable.getValuesWithLevelAsPointer(int tsID)\n"
+    "    double ** CdiVariable.getValuesWithLevelAsPointer()\n");
+  
+  return Qnil;
+}
+
+
+static swig_class SwigClassCdi;
+
+SWIGINTERN VALUE
+#ifdef HAVE_RB_DEFINE_ALLOC_FUNC
+_wrap_Cdi_allocate(VALUE self)
+#else
+_wrap_Cdi_allocate(int argc, VALUE *argv, VALUE self)
+#endif
+{
+  VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_Cdi);
+#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
+  rb_obj_call_init(vresult, argc, argv);
+#endif
+  return vresult;
+}
+
+
+SWIGINTERN VALUE
+_wrap_new_Cdi(int argc, VALUE *argv, VALUE self) {
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  Cdi *result = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","Cdi", 1, argv[0] ));
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (Cdi *)new Cdi((char const *)arg1);
+  DATA_PTR(self) = result;
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return self;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return Qnil;
+}
+
+
+SWIGINTERN void
+free_Cdi(void *self) {
+    Cdi *arg1 = (Cdi *)self;
+    delete arg1;
+}
+
+SWIGINTERN VALUE
+_wrap_Cdi_streamID_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","streamID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","streamID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->streamID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_streamID_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","streamID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->streamID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_vlistID_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","vlistID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vlistID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->vlistID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_vlistID_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","vlistID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->vlistID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_nvars_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nvars", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","nvars", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->nvars = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_nvars_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nvars", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->nvars);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_nzaxes_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nzaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","nzaxes", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->nzaxes = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_nzaxes_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nzaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->nzaxes);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_ngrids_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ngrids", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ngrids", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ngrids = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_ngrids_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ngrids", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->ngrids);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_ntaxes_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ntaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ntaxes", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->ntaxes = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_ntaxes_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ntaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->ntaxes);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_taxisID_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  int arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int val2 ;
+  int ecode2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  ecode2 = SWIG_AsVal_int(argv[0], &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] ));
+  } 
+  arg2 = static_cast< int >(val2);
+  if (arg1) (arg1)->taxisID = arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_taxisID_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxisID", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (int) ((arg1)->taxisID);
+  vresult = SWIG_From_int(static_cast< int >(result));
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_varnames_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< std::string,std::allocator< std::string > > *arg2 = (std::vector< std::string,std::allocator< std::string > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varnames", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string,std::allocator< std::string > > *","varnames", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< std::string,std::allocator< std::string > > * >(argp2);
+  if (arg1) (arg1)->varnames = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_varnames_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< std::string,std::allocator< std::string > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varnames", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< std::string,std::allocator< std::string > > *)& ((arg1)->varnames);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_codes_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","codes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< int,std::allocator< int > > *","codes", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2);
+  if (arg1) (arg1)->codes = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_codes_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< int,std::allocator< int > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","codes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< int,std::allocator< int > > *)& ((arg1)->codes);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_variables_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *arg2 = (std::vector< CdiVariable,std::allocator< CdiVariable > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","variables", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable,std::allocator< CdiVariable > > *","variables", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::vector< CdiVariable,std::allocator< CdiVariable > > * >(argp2);
+  if (arg1) (arg1)->variables = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_variables_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","variables", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)& ((arg1)->variables);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_var_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *arg2 = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","var", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *","var", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > * >(argp2);
+  if (arg1) (arg1)->var = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_var_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","var", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)& ((arg1)->var);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_varByCode_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *arg2 = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varByCode", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *","varByCode", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > * >(argp2);
+  if (arg1) (arg1)->varByCode = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_varByCode_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varByCode", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)& ((arg1)->varByCode);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_taxes_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *arg2 = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *","taxes", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > * >(argp2);
+  if (arg1) (arg1)->taxes = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_taxes_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)& ((arg1)->taxes);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_zaxes_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *arg2 = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","zaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *","zaxes", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > * >(argp2);
+  if (arg1) (arg1)->zaxes = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_zaxes_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","zaxes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)& ((arg1)->zaxes);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_grids_set(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *arg2 = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  
+  if ((argc < 1) || (argc > 1)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","grids", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *","grids", 2, argv[0] )); 
+  }
+  arg2 = reinterpret_cast< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > * >(argp2);
+  if (arg1) (arg1)->grids = *arg2;
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_grids_get(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ;
+  VALUE vresult = Qnil;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","grids", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)& ((arg1)->grids);
+  vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 |  0 );
+  return vresult;
+fail:
+  return Qnil;
+}
+
+
+SWIGINTERN VALUE
+_wrap_Cdi_griddes(int argc, VALUE *argv, VALUE self) {
+  Cdi *arg1 = (Cdi *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if ((argc < 0) || (argc > 0)) {
+    rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
+  }
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","griddes", 1, self )); 
+  }
+  arg1 = reinterpret_cast< Cdi * >(argp1);
+  (arg1)->griddes();
+  return Qnil;
+fail:
+  return Qnil;
+}
+
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p_swig__IteratorTo_p_swig__ConstIterator(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((swig::ConstIterator *)  ((swig::Iterator *) x));
+}
+static swig_type_info _swigt__p_Cdi = {"_p_Cdi", "Cdi *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiGrid = {"_p_CdiGrid", "std::map< int,CdiGrid >::mapped_type *|CdiGrid *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiTaxis = {"_p_CdiTaxis", "std::map< int,CdiTaxis >::mapped_type *|CdiTaxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiVariable = {"_p_CdiVariable", "std::map< std::string,CdiVariable >::mapped_type *|std::vector< CdiVariable >::value_type *|std::map< int,CdiVariable >::mapped_type *|CdiVariable *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_CdiZaxis = {"_p_CdiZaxis", "std::map< int,CdiZaxis >::mapped_type *|CdiZaxis *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_float = {"_p_float", "float *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_key_type = {"_p_key_type", "key_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_mapped_type = {"_p_mapped_type", "mapped_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_double = {"_p_p_double", "double **", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_p_void = {"_p_p_void", "void **|VALUE *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_CdiVariable_t = {"_p_std__allocatorT_CdiVariable_t", "std::vector< CdiVariable >::allocator_type *|std::allocator< CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t", "std::map< int,CdiGrid >::allocator_type *|std::allocator< std::pair< int const,CdiGrid > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t", "std::map< int,CdiTaxis >::allocator_type *|std::allocator< std::pair< int const,CdiTaxis > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t", "std::map< int,CdiVariable >::allocator_type *|std::allocator< std::pair< int const,CdiVariable > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t", "std::map< int,CdiZaxis >::allocator_type *|std::allocator< std::pair< int const,CdiZaxis > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t", "std::allocator< std::pair< std::string const,CdiVariable > > *|std::map< std::string,CdiVariable >::allocator_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__lessT_int_t = {"_p_std__lessT_int_t", "std::less< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t", "std::map< int,CdiGrid > *|std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator", "std::map< int,CdiGrid >::iterator *|std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator", "std::map< int,CdiGrid >::reverse_iterator *|std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::reverse_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t", "std::map< int,CdiTaxis > *|std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator", "std::map< int,CdiTaxis >::iterator *|std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator", "std::map< int,CdiTaxis >::reverse_iterator *|std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::reverse_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *|std::map< int,CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator", "std::map< int,CdiVariable >::iterator *|std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator", "std::map< int,CdiVariable >::reverse_iterator *|std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::reverse_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t", "std::map< int,CdiZaxis > *|std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator", "std::map< int,CdiZaxis >::iterator *|std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator", "std::map< int,CdiZaxis >::reverse_iterator *|std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::reverse_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *|std::map< std::string,CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator", "std::map< std::string,CdiVariable >::iterator *|std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator", "std::map< std::string,CdiVariable >::reverse_iterator *|std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::reverse_iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t = {"_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t", "std::vector< CdiVariable,std::allocator< CdiVariable > > *|std::vector< CdiVariable > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_float_std__allocatorT_float_t_t = {"_p_std__vectorT_float_std__allocatorT_float_t_t", "std::vector< float,std::allocator< float > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t = {"_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t", "std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__ConstIterator = {"_p_swig__ConstIterator", "swig::ConstIterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__GC_VALUE = {"_p_swig__GC_VALUE", "swig::GC_VALUE *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_swig__Iterator = {"_p_swig__Iterator", "swig::Iterator *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_void = {"_p_void", "VALUE|void *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_Cdi,
+  &_swigt__p_CdiGrid,
+  &_swigt__p_CdiTaxis,
+  &_swigt__p_CdiVariable,
+  &_swigt__p_CdiZaxis,
+  &_swigt__p_allocator_type,
+  &_swigt__p_char,
+  &_swigt__p_difference_type,
+  &_swigt__p_double,
+  &_swigt__p_float,
+  &_swigt__p_key_type,
+  &_swigt__p_mapped_type,
+  &_swigt__p_p_double,
+  &_swigt__p_p_void,
+  &_swigt__p_size_type,
+  &_swigt__p_std__allocatorT_CdiVariable_t,
+  &_swigt__p_std__allocatorT_double_t,
+  &_swigt__p_std__allocatorT_int_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t,
+  &_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t,
+  &_swigt__p_std__allocatorT_std__string_t,
+  &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  &_swigt__p_std__lessT_int_t,
+  &_swigt__p_std__lessT_std__string_t,
+  &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,
+  &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator,
+  &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator,
+  &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,
+  &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator,
+  &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator,
+  &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,
+  &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator,
+  &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator,
+  &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,
+  &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator,
+  &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator,
+  &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,
+  &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator,
+  &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator,
+  &_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,
+  &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
+  &_swigt__p_std__vectorT_float_std__allocatorT_float_t_t,
+  &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
+  &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  &_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t,
+  &_swigt__p_swig__ConstIterator,
+  &_swigt__p_swig__GC_VALUE,
+  &_swigt__p_swig__Iterator,
+  &_swigt__p_value_type,
+  &_swigt__p_void,
+};
+
+static swig_cast_info _swigc__p_Cdi[] = {  {&_swigt__p_Cdi, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiGrid[] = {  {&_swigt__p_CdiGrid, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiTaxis[] = {  {&_swigt__p_CdiTaxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiVariable[] = {  {&_swigt__p_CdiVariable, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_CdiZaxis[] = {  {&_swigt__p_CdiZaxis, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_difference_type[] = {  {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_float[] = {  {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_key_type[] = {  {&_swigt__p_key_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_mapped_type[] = {  {&_swigt__p_mapped_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_double[] = {  {&_swigt__p_p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_p_void[] = {  {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_size_type[] = {  {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_CdiVariable_t[] = {  {&_swigt__p_std__allocatorT_CdiVariable_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_double_t[] = {  {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_int_t[] = {  {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t[] = {  {&_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = {  {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__lessT_int_t[] = {  {&_swigt__p_std__lessT_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__lessT_std__string_t[] = {  {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator[] = {  {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator[] = {  {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator[] = {  {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator[] = {  {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator[] = {  {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator[] = {  {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t[] = {  {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator[] = {  {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator[] = {  {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t[] = {  {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator[] = {  {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator[] = {  {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t[] = {  {&_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_float_std__allocatorT_float_t_t[] = {  {&_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = {  {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t[] = {  {&_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__ConstIterator[] = {  {&_swigt__p_swig__ConstIterator, 0, 0, 0},  {&_swigt__p_swig__Iterator, _p_swig__IteratorTo_p_swig__ConstIterator, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__GC_VALUE[] = {  {&_swigt__p_swig__GC_VALUE, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_swig__Iterator[] = {  {&_swigt__p_swig__Iterator, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_void[] = {  {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_Cdi,
+  _swigc__p_CdiGrid,
+  _swigc__p_CdiTaxis,
+  _swigc__p_CdiVariable,
+  _swigc__p_CdiZaxis,
+  _swigc__p_allocator_type,
+  _swigc__p_char,
+  _swigc__p_difference_type,
+  _swigc__p_double,
+  _swigc__p_float,
+  _swigc__p_key_type,
+  _swigc__p_mapped_type,
+  _swigc__p_p_double,
+  _swigc__p_p_void,
+  _swigc__p_size_type,
+  _swigc__p_std__allocatorT_CdiVariable_t,
+  _swigc__p_std__allocatorT_double_t,
+  _swigc__p_std__allocatorT_int_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t,
+  _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t,
+  _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t,
+  _swigc__p_std__allocatorT_std__string_t,
+  _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t,
+  _swigc__p_std__lessT_int_t,
+  _swigc__p_std__lessT_std__string_t,
+  _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t,
+  _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator,
+  _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator,
+  _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t,
+  _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator,
+  _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator,
+  _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t,
+  _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator,
+  _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator,
+  _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t,
+  _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator,
+  _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator,
+  _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t,
+  _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator,
+  _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator,
+  _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t,
+  _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
+  _swigc__p_std__vectorT_float_std__allocatorT_float_t_t,
+  _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
+  _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
+  _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t,
+  _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t,
+  _swigc__p_swig__ConstIterator,
+  _swigc__p_swig__GC_VALUE,
+  _swigc__p_swig__Iterator,
+  _swigc__p_value_type,
+  _swigc__p_void,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic
+ * memory is used. Also, since swig_type_info structures store pointers to
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization.
+ * The idea is that swig generates all the structures that are needed.
+ * The runtime then collects these partially filled structures.
+ * The SWIG_InitializeModule function takes these initial arrays out of
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned statically to an initial
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded.
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int init;
+
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        /* Our module is already in the list, so there's nothing more to do. */
+        return;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+
+    /* otherwise we must add our module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+
+  /* When multiple interpreters are used, a module could have already been initialized in
+     a different interpreter, but not yet have a pointer in this interpreter.
+     In this case, we do not want to continue adding types... everything should be
+     set up already */
+  if (init == 0) return;
+
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name);
+#endif
+
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+	type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+	if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+	if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+	  printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+	  cast->type = ret;
+	  ret = 0;
+	} else {
+	  /* Check for casting already in the list */
+	  swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+	  if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+	  if (!ocast) ret = 0;
+	}
+      }
+
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+	printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+  printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+
+  if (init_run) return;
+  init_run = 1;
+
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+            SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{ /* c-mode */
+#endif
+}
+#endif
+
+/*
+
+*/
+#ifdef __cplusplus
+extern "C"
+#endif
+SWIGEXPORT void Init_Cdi(void) {
+  size_t i;
+  
+  SWIG_InitRuntime();
+  
+  SWIG_InitializeModule(0);
+  for (i = 0; i < swig_module.size; i++) {
+    SWIG_define_class(swig_module.types[i]);
+  }
+  
+  SWIG_RubyInitializeTrackings();
+  
+  SwigClassGC_VALUE.klass = rb_define_class("GC_VALUE", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_swig__GC_VALUE, (void *) &SwigClassGC_VALUE);
+  rb_undef_alloc_func(SwigClassGC_VALUE.klass);
+  rb_define_method(SwigClassGC_VALUE.klass, "inspect", VALUEFUNC(_wrap_GC_VALUE_inspect), -1);
+  rb_define_method(SwigClassGC_VALUE.klass, "to_s", VALUEFUNC(_wrap_GC_VALUE_to_s), -1);
+  SwigClassGC_VALUE.mark = 0;
+  SwigClassGC_VALUE.trackObjects = 0;
+  
+  swig::SwigGCReferences::initialize();
+  
+  
+  SwigClassConstIterator.klass = rb_define_class("ConstIterator", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_swig__ConstIterator, (void *) &SwigClassConstIterator);
+  rb_undef_alloc_func(SwigClassConstIterator.klass);
+  rb_define_method(SwigClassConstIterator.klass, "value", VALUEFUNC(_wrap_ConstIterator_value), -1);
+  rb_define_method(SwigClassConstIterator.klass, "dup", VALUEFUNC(_wrap_ConstIterator_dup), -1);
+  rb_define_method(SwigClassConstIterator.klass, "inspect", VALUEFUNC(_wrap_ConstIterator_inspect), -1);
+  rb_define_method(SwigClassConstIterator.klass, "to_s", VALUEFUNC(_wrap_ConstIterator_to_s), -1);
+  rb_define_method(SwigClassConstIterator.klass, "next", VALUEFUNC(_wrap_ConstIterator_next), -1);
+  rb_define_method(SwigClassConstIterator.klass, "previous", VALUEFUNC(_wrap_ConstIterator_previous), -1);
+  rb_define_method(SwigClassConstIterator.klass, "==", VALUEFUNC(_wrap_ConstIterator___eq__), -1);
+  rb_define_method(SwigClassConstIterator.klass, "+", VALUEFUNC(_wrap_ConstIterator___add__), -1);
+  rb_define_method(SwigClassConstIterator.klass, "-", VALUEFUNC(_wrap_ConstIterator___sub__), -1);
+  SwigClassConstIterator.mark = 0;
+  SwigClassConstIterator.destroy = (void (*)(void *)) free_swig_ConstIterator;
+  SwigClassConstIterator.trackObjects = 0;
+  
+  SwigClassIterator.klass = rb_define_class("Iterator", ((swig_class *) SWIGTYPE_p_swig__ConstIterator->clientdata)->klass);
+  SWIG_TypeClientData(SWIGTYPE_p_swig__Iterator, (void *) &SwigClassIterator);
+  rb_undef_alloc_func(SwigClassIterator.klass);
+  rb_define_method(SwigClassIterator.klass, "value=", VALUEFUNC(_wrap_Iterator_valuee___), -1);
+  rb_define_method(SwigClassIterator.klass, "dup", VALUEFUNC(_wrap_Iterator_dup), -1);
+  rb_define_method(SwigClassIterator.klass, "next", VALUEFUNC(_wrap_Iterator_next), -1);
+  rb_define_method(SwigClassIterator.klass, "previous", VALUEFUNC(_wrap_Iterator_previous), -1);
+  rb_define_method(SwigClassIterator.klass, "inspect", VALUEFUNC(_wrap_Iterator_inspect), -1);
+  rb_define_method(SwigClassIterator.klass, "to_s", VALUEFUNC(_wrap_Iterator_to_s), -1);
+  rb_define_method(SwigClassIterator.klass, "==", VALUEFUNC(_wrap_Iterator___eq__), -1);
+  rb_define_method(SwigClassIterator.klass, "+", VALUEFUNC(_wrap_Iterator___add__), -1);
+  rb_define_method(SwigClassIterator.klass, "-", VALUEFUNC(_wrap_Iterator___sub__), -1);
+  SwigClassIterator.mark = 0;
+  SwigClassIterator.destroy = (void (*)(void *)) free_swig_Iterator;
+  SwigClassIterator.trackObjects = 0;
+  
+  SwigClassIntVector.klass = rb_define_class("IntVector", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, (void *) &SwigClassIntVector);
+  rb_include_module(SwigClassIntVector.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassIntVector.klass, _wrap_IntVector_allocate);
+  rb_define_method(SwigClassIntVector.klass, "initialize", VALUEFUNC(_wrap_new_IntVector), -1);
+  rb_define_method(SwigClassIntVector.klass, "dup", VALUEFUNC(_wrap_IntVector_dup), -1);
+  rb_define_method(SwigClassIntVector.klass, "inspect", VALUEFUNC(_wrap_IntVector_inspect), -1);
+  rb_define_method(SwigClassIntVector.klass, "to_a", VALUEFUNC(_wrap_IntVector_to_a), -1);
+  rb_define_method(SwigClassIntVector.klass, "to_s", VALUEFUNC(_wrap_IntVector_to_s), -1);
+  rb_define_method(SwigClassIntVector.klass, "slice", VALUEFUNC(_wrap_IntVector_slice), -1);
+  rb_define_method(SwigClassIntVector.klass, "each", VALUEFUNC(_wrap_IntVector_each), -1);
+  rb_define_method(SwigClassIntVector.klass, "__delete2__", VALUEFUNC(_wrap_IntVector___delete2__), -1);
+  rb_define_method(SwigClassIntVector.klass, "select", VALUEFUNC(_wrap_IntVector_select), -1);
+  rb_define_method(SwigClassIntVector.klass, "delete_at", VALUEFUNC(_wrap_IntVector_delete_at), -1);
+  rb_define_method(SwigClassIntVector.klass, "at", VALUEFUNC(_wrap_IntVector_at), -1);
+  rb_define_method(SwigClassIntVector.klass, "[]", VALUEFUNC(_wrap_IntVector___getitem__), -1);
+  rb_define_method(SwigClassIntVector.klass, "[]=", VALUEFUNC(_wrap_IntVector___setitem__), -1);
+  rb_define_method(SwigClassIntVector.klass, "reject!", VALUEFUNC(_wrap_IntVector_rejectN___), -1);
+  rb_define_alias(SwigClassIntVector.klass, "delete_if", "reject!");
+  rb_define_method(SwigClassIntVector.klass, "pop", VALUEFUNC(_wrap_IntVector_pop), -1);
+  rb_define_method(SwigClassIntVector.klass, "push", VALUEFUNC(_wrap_IntVector_push), -1);
+  rb_define_alias(SwigClassIntVector.klass, "<<", "push");
+  rb_define_method(SwigClassIntVector.klass, "reject", VALUEFUNC(_wrap_IntVector_reject), -1);
+  rb_define_method(SwigClassIntVector.klass, "shift", VALUEFUNC(_wrap_IntVector_shift), -1);
+  rb_define_method(SwigClassIntVector.klass, "unshift", VALUEFUNC(_wrap_IntVector_unshift), -1);
+  rb_define_method(SwigClassIntVector.klass, "empty?", VALUEFUNC(_wrap_IntVector_emptyq___), -1);
+  rb_define_method(SwigClassIntVector.klass, "size", VALUEFUNC(_wrap_IntVector_size), -1);
+  rb_define_method(SwigClassIntVector.klass, "swap", VALUEFUNC(_wrap_IntVector_swap), -1);
+  rb_define_method(SwigClassIntVector.klass, "begin", VALUEFUNC(_wrap_IntVector_begin), -1);
+  rb_define_method(SwigClassIntVector.klass, "end", VALUEFUNC(_wrap_IntVector_end), -1);
+  rb_define_method(SwigClassIntVector.klass, "rbegin", VALUEFUNC(_wrap_IntVector_rbegin), -1);
+  rb_define_method(SwigClassIntVector.klass, "rend", VALUEFUNC(_wrap_IntVector_rend), -1);
+  rb_define_method(SwigClassIntVector.klass, "clear", VALUEFUNC(_wrap_IntVector_clear), -1);
+  rb_define_method(SwigClassIntVector.klass, "get_allocator", VALUEFUNC(_wrap_IntVector_get_allocator), -1);
+  rb_define_method(SwigClassIntVector.klass, "erase", VALUEFUNC(_wrap_IntVector_erase), -1);
+  rb_define_method(SwigClassIntVector.klass, "front", VALUEFUNC(_wrap_IntVector_front), -1);
+  rb_define_method(SwigClassIntVector.klass, "back", VALUEFUNC(_wrap_IntVector_back), -1);
+  rb_define_method(SwigClassIntVector.klass, "assign", VALUEFUNC(_wrap_IntVector_assign), -1);
+  rb_define_method(SwigClassIntVector.klass, "resize", VALUEFUNC(_wrap_IntVector_resize), -1);
+  rb_define_method(SwigClassIntVector.klass, "insert", VALUEFUNC(_wrap_IntVector_insert), -1);
+  rb_define_method(SwigClassIntVector.klass, "reserve", VALUEFUNC(_wrap_IntVector_reserve), -1);
+  rb_define_method(SwigClassIntVector.klass, "capacity", VALUEFUNC(_wrap_IntVector_capacity), -1);
+  rb_define_method(SwigClassIntVector.klass, "map!", VALUEFUNC(_wrap_IntVector_mapN___), -1);
+  rb_define_method(SwigClassIntVector.klass, "delete", VALUEFUNC(_wrap_IntVector_delete), -1);
+  SwigClassIntVector.mark = 0;
+  SwigClassIntVector.destroy = (void (*)(void *)) free_std_vector_Sl_int_Sg_;
+  SwigClassIntVector.trackObjects = 0;
+  
+  SwigClassDoubleVector.klass = rb_define_class("DoubleVector", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, (void *) &SwigClassDoubleVector);
+  rb_include_module(SwigClassDoubleVector.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassDoubleVector.klass, _wrap_DoubleVector_allocate);
+  rb_define_method(SwigClassDoubleVector.klass, "initialize", VALUEFUNC(_wrap_new_DoubleVector), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "dup", VALUEFUNC(_wrap_DoubleVector_dup), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "inspect", VALUEFUNC(_wrap_DoubleVector_inspect), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "to_a", VALUEFUNC(_wrap_DoubleVector_to_a), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "to_s", VALUEFUNC(_wrap_DoubleVector_to_s), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "slice", VALUEFUNC(_wrap_DoubleVector_slice), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "each", VALUEFUNC(_wrap_DoubleVector_each), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "__delete2__", VALUEFUNC(_wrap_DoubleVector___delete2__), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "select", VALUEFUNC(_wrap_DoubleVector_select), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "delete_at", VALUEFUNC(_wrap_DoubleVector_delete_at), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "at", VALUEFUNC(_wrap_DoubleVector_at), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "[]", VALUEFUNC(_wrap_DoubleVector___getitem__), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "[]=", VALUEFUNC(_wrap_DoubleVector___setitem__), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "reject!", VALUEFUNC(_wrap_DoubleVector_rejectN___), -1);
+  rb_define_alias(SwigClassDoubleVector.klass, "delete_if", "reject!");
+  rb_define_method(SwigClassDoubleVector.klass, "pop", VALUEFUNC(_wrap_DoubleVector_pop), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "push", VALUEFUNC(_wrap_DoubleVector_push), -1);
+  rb_define_alias(SwigClassDoubleVector.klass, "<<", "push");
+  rb_define_method(SwigClassDoubleVector.klass, "reject", VALUEFUNC(_wrap_DoubleVector_reject), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "shift", VALUEFUNC(_wrap_DoubleVector_shift), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "unshift", VALUEFUNC(_wrap_DoubleVector_unshift), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "empty?", VALUEFUNC(_wrap_DoubleVector_emptyq___), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "size", VALUEFUNC(_wrap_DoubleVector_size), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "swap", VALUEFUNC(_wrap_DoubleVector_swap), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "begin", VALUEFUNC(_wrap_DoubleVector_begin), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "end", VALUEFUNC(_wrap_DoubleVector_end), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "rbegin", VALUEFUNC(_wrap_DoubleVector_rbegin), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "rend", VALUEFUNC(_wrap_DoubleVector_rend), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "clear", VALUEFUNC(_wrap_DoubleVector_clear), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "get_allocator", VALUEFUNC(_wrap_DoubleVector_get_allocator), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "erase", VALUEFUNC(_wrap_DoubleVector_erase), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "front", VALUEFUNC(_wrap_DoubleVector_front), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "back", VALUEFUNC(_wrap_DoubleVector_back), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "assign", VALUEFUNC(_wrap_DoubleVector_assign), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "resize", VALUEFUNC(_wrap_DoubleVector_resize), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "insert", VALUEFUNC(_wrap_DoubleVector_insert), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "reserve", VALUEFUNC(_wrap_DoubleVector_reserve), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "capacity", VALUEFUNC(_wrap_DoubleVector_capacity), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "map!", VALUEFUNC(_wrap_DoubleVector_mapN___), -1);
+  rb_define_method(SwigClassDoubleVector.klass, "delete", VALUEFUNC(_wrap_DoubleVector_delete), -1);
+  SwigClassDoubleVector.mark = 0;
+  SwigClassDoubleVector.destroy = (void (*)(void *)) free_std_vector_Sl_double_Sg_;
+  SwigClassDoubleVector.trackObjects = 0;
+  
+  SwigClassDoubleDoubleVector.klass = rb_define_class("DoubleDoubleVector", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, (void *) &SwigClassDoubleDoubleVector);
+  rb_include_module(SwigClassDoubleDoubleVector.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassDoubleDoubleVector.klass, _wrap_DoubleDoubleVector_allocate);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "initialize", VALUEFUNC(_wrap_new_DoubleDoubleVector), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "dup", VALUEFUNC(_wrap_DoubleDoubleVector_dup), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "inspect", VALUEFUNC(_wrap_DoubleDoubleVector_inspect), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "to_a", VALUEFUNC(_wrap_DoubleDoubleVector_to_a), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "to_s", VALUEFUNC(_wrap_DoubleDoubleVector_to_s), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "slice", VALUEFUNC(_wrap_DoubleDoubleVector_slice), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "each", VALUEFUNC(_wrap_DoubleDoubleVector_each), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "__delete2__", VALUEFUNC(_wrap_DoubleDoubleVector___delete2__), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "select", VALUEFUNC(_wrap_DoubleDoubleVector_select), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "delete_at", VALUEFUNC(_wrap_DoubleDoubleVector_delete_at), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "at", VALUEFUNC(_wrap_DoubleDoubleVector_at), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "[]", VALUEFUNC(_wrap_DoubleDoubleVector___getitem__), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "[]=", VALUEFUNC(_wrap_DoubleDoubleVector___setitem__), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "reject!", VALUEFUNC(_wrap_DoubleDoubleVector_rejectN___), -1);
+  rb_define_alias(SwigClassDoubleDoubleVector.klass, "delete_if", "reject!");
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "pop", VALUEFUNC(_wrap_DoubleDoubleVector_pop), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "push", VALUEFUNC(_wrap_DoubleDoubleVector_push), -1);
+  rb_define_alias(SwigClassDoubleDoubleVector.klass, "<<", "push");
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "reject", VALUEFUNC(_wrap_DoubleDoubleVector_reject), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "shift", VALUEFUNC(_wrap_DoubleDoubleVector_shift), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "unshift", VALUEFUNC(_wrap_DoubleDoubleVector_unshift), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "empty?", VALUEFUNC(_wrap_DoubleDoubleVector_emptyq___), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "size", VALUEFUNC(_wrap_DoubleDoubleVector_size), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "swap", VALUEFUNC(_wrap_DoubleDoubleVector_swap), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "begin", VALUEFUNC(_wrap_DoubleDoubleVector_begin), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "end", VALUEFUNC(_wrap_DoubleDoubleVector_end), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "rbegin", VALUEFUNC(_wrap_DoubleDoubleVector_rbegin), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "rend", VALUEFUNC(_wrap_DoubleDoubleVector_rend), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "clear", VALUEFUNC(_wrap_DoubleDoubleVector_clear), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "get_allocator", VALUEFUNC(_wrap_DoubleDoubleVector_get_allocator), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "erase", VALUEFUNC(_wrap_DoubleDoubleVector_erase), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "front", VALUEFUNC(_wrap_DoubleDoubleVector_front), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "back", VALUEFUNC(_wrap_DoubleDoubleVector_back), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "assign", VALUEFUNC(_wrap_DoubleDoubleVector_assign), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "resize", VALUEFUNC(_wrap_DoubleDoubleVector_resize), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "insert", VALUEFUNC(_wrap_DoubleDoubleVector_insert), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "reserve", VALUEFUNC(_wrap_DoubleDoubleVector_reserve), -1);
+  rb_define_method(SwigClassDoubleDoubleVector.klass, "capacity", VALUEFUNC(_wrap_DoubleDoubleVector_capacity), -1);
+  SwigClassDoubleDoubleVector.mark = 0;
+  SwigClassDoubleDoubleVector.destroy = (void (*)(void *)) free_std_vector_Sl_std_vector_Sl_double_Sg__Sg_;
+  SwigClassDoubleDoubleVector.trackObjects = 0;
+  
+  SwigClassStringVector.klass = rb_define_class("StringVector", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, (void *) &SwigClassStringVector);
+  rb_include_module(SwigClassStringVector.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassStringVector.klass, _wrap_StringVector_allocate);
+  rb_define_method(SwigClassStringVector.klass, "initialize", VALUEFUNC(_wrap_new_StringVector), -1);
+  rb_define_method(SwigClassStringVector.klass, "dup", VALUEFUNC(_wrap_StringVector_dup), -1);
+  rb_define_method(SwigClassStringVector.klass, "inspect", VALUEFUNC(_wrap_StringVector_inspect), -1);
+  rb_define_method(SwigClassStringVector.klass, "to_a", VALUEFUNC(_wrap_StringVector_to_a), -1);
+  rb_define_method(SwigClassStringVector.klass, "to_s", VALUEFUNC(_wrap_StringVector_to_s), -1);
+  rb_define_method(SwigClassStringVector.klass, "slice", VALUEFUNC(_wrap_StringVector_slice), -1);
+  rb_define_method(SwigClassStringVector.klass, "each", VALUEFUNC(_wrap_StringVector_each), -1);
+  rb_define_method(SwigClassStringVector.klass, "__delete2__", VALUEFUNC(_wrap_StringVector___delete2__), -1);
+  rb_define_method(SwigClassStringVector.klass, "select", VALUEFUNC(_wrap_StringVector_select), -1);
+  rb_define_method(SwigClassStringVector.klass, "delete_at", VALUEFUNC(_wrap_StringVector_delete_at), -1);
+  rb_define_method(SwigClassStringVector.klass, "at", VALUEFUNC(_wrap_StringVector_at), -1);
+  rb_define_method(SwigClassStringVector.klass, "[]", VALUEFUNC(_wrap_StringVector___getitem__), -1);
+  rb_define_method(SwigClassStringVector.klass, "[]=", VALUEFUNC(_wrap_StringVector___setitem__), -1);
+  rb_define_method(SwigClassStringVector.klass, "reject!", VALUEFUNC(_wrap_StringVector_rejectN___), -1);
+  rb_define_alias(SwigClassStringVector.klass, "delete_if", "reject!");
+  rb_define_method(SwigClassStringVector.klass, "pop", VALUEFUNC(_wrap_StringVector_pop), -1);
+  rb_define_method(SwigClassStringVector.klass, "push", VALUEFUNC(_wrap_StringVector_push), -1);
+  rb_define_alias(SwigClassStringVector.klass, "<<", "push");
+  rb_define_method(SwigClassStringVector.klass, "reject", VALUEFUNC(_wrap_StringVector_reject), -1);
+  rb_define_method(SwigClassStringVector.klass, "shift", VALUEFUNC(_wrap_StringVector_shift), -1);
+  rb_define_method(SwigClassStringVector.klass, "unshift", VALUEFUNC(_wrap_StringVector_unshift), -1);
+  rb_define_method(SwigClassStringVector.klass, "empty?", VALUEFUNC(_wrap_StringVector_emptyq___), -1);
+  rb_define_method(SwigClassStringVector.klass, "size", VALUEFUNC(_wrap_StringVector_size), -1);
+  rb_define_method(SwigClassStringVector.klass, "swap", VALUEFUNC(_wrap_StringVector_swap), -1);
+  rb_define_method(SwigClassStringVector.klass, "begin", VALUEFUNC(_wrap_StringVector_begin), -1);
+  rb_define_method(SwigClassStringVector.klass, "end", VALUEFUNC(_wrap_StringVector_end), -1);
+  rb_define_method(SwigClassStringVector.klass, "rbegin", VALUEFUNC(_wrap_StringVector_rbegin), -1);
+  rb_define_method(SwigClassStringVector.klass, "rend", VALUEFUNC(_wrap_StringVector_rend), -1);
+  rb_define_method(SwigClassStringVector.klass, "clear", VALUEFUNC(_wrap_StringVector_clear), -1);
+  rb_define_method(SwigClassStringVector.klass, "get_allocator", VALUEFUNC(_wrap_StringVector_get_allocator), -1);
+  rb_define_method(SwigClassStringVector.klass, "erase", VALUEFUNC(_wrap_StringVector_erase), -1);
+  rb_define_method(SwigClassStringVector.klass, "front", VALUEFUNC(_wrap_StringVector_front), -1);
+  rb_define_method(SwigClassStringVector.klass, "back", VALUEFUNC(_wrap_StringVector_back), -1);
+  rb_define_method(SwigClassStringVector.klass, "assign", VALUEFUNC(_wrap_StringVector_assign), -1);
+  rb_define_method(SwigClassStringVector.klass, "resize", VALUEFUNC(_wrap_StringVector_resize), -1);
+  rb_define_method(SwigClassStringVector.klass, "insert", VALUEFUNC(_wrap_StringVector_insert), -1);
+  rb_define_method(SwigClassStringVector.klass, "reserve", VALUEFUNC(_wrap_StringVector_reserve), -1);
+  rb_define_method(SwigClassStringVector.klass, "capacity", VALUEFUNC(_wrap_StringVector_capacity), -1);
+  rb_define_method(SwigClassStringVector.klass, "map!", VALUEFUNC(_wrap_StringVector_mapN___), -1);
+  rb_define_method(SwigClassStringVector.klass, "delete", VALUEFUNC(_wrap_StringVector_delete), -1);
+  SwigClassStringVector.mark = 0;
+  SwigClassStringVector.destroy = (void (*)(void *)) free_std_vector_Sl_std_string_Sg_;
+  SwigClassStringVector.trackObjects = 0;
+  
+  SwigClassVarsVector.klass = rb_define_class("VarsVector", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, (void *) &SwigClassVarsVector);
+  rb_include_module(SwigClassVarsVector.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassVarsVector.klass, _wrap_VarsVector_allocate);
+  rb_define_method(SwigClassVarsVector.klass, "initialize", VALUEFUNC(_wrap_new_VarsVector), -1);
+  rb_define_method(SwigClassVarsVector.klass, "dup", VALUEFUNC(_wrap_VarsVector_dup), -1);
+  rb_define_method(SwigClassVarsVector.klass, "inspect", VALUEFUNC(_wrap_VarsVector_inspect), -1);
+  rb_define_method(SwigClassVarsVector.klass, "to_a", VALUEFUNC(_wrap_VarsVector_to_a), -1);
+  rb_define_method(SwigClassVarsVector.klass, "to_s", VALUEFUNC(_wrap_VarsVector_to_s), -1);
+  rb_define_method(SwigClassVarsVector.klass, "slice", VALUEFUNC(_wrap_VarsVector_slice), -1);
+  rb_define_method(SwigClassVarsVector.klass, "each", VALUEFUNC(_wrap_VarsVector_each), -1);
+  rb_define_method(SwigClassVarsVector.klass, "__delete2__", VALUEFUNC(_wrap_VarsVector___delete2__), -1);
+  rb_define_method(SwigClassVarsVector.klass, "select", VALUEFUNC(_wrap_VarsVector_select), -1);
+  rb_define_method(SwigClassVarsVector.klass, "delete_at", VALUEFUNC(_wrap_VarsVector_delete_at), -1);
+  rb_define_method(SwigClassVarsVector.klass, "at", VALUEFUNC(_wrap_VarsVector_at), -1);
+  rb_define_method(SwigClassVarsVector.klass, "[]", VALUEFUNC(_wrap_VarsVector___getitem__), -1);
+  rb_define_method(SwigClassVarsVector.klass, "[]=", VALUEFUNC(_wrap_VarsVector___setitem__), -1);
+  rb_define_method(SwigClassVarsVector.klass, "reject!", VALUEFUNC(_wrap_VarsVector_rejectN___), -1);
+  rb_define_alias(SwigClassVarsVector.klass, "delete_if", "reject!");
+  rb_define_method(SwigClassVarsVector.klass, "pop", VALUEFUNC(_wrap_VarsVector_pop), -1);
+  rb_define_method(SwigClassVarsVector.klass, "push", VALUEFUNC(_wrap_VarsVector_push), -1);
+  rb_define_alias(SwigClassVarsVector.klass, "<<", "push");
+  rb_define_method(SwigClassVarsVector.klass, "reject", VALUEFUNC(_wrap_VarsVector_reject), -1);
+  rb_define_method(SwigClassVarsVector.klass, "shift", VALUEFUNC(_wrap_VarsVector_shift), -1);
+  rb_define_method(SwigClassVarsVector.klass, "unshift", VALUEFUNC(_wrap_VarsVector_unshift), -1);
+  rb_define_method(SwigClassVarsVector.klass, "empty?", VALUEFUNC(_wrap_VarsVector_emptyq___), -1);
+  rb_define_method(SwigClassVarsVector.klass, "size", VALUEFUNC(_wrap_VarsVector_size), -1);
+  rb_define_method(SwigClassVarsVector.klass, "swap", VALUEFUNC(_wrap_VarsVector_swap), -1);
+  rb_define_method(SwigClassVarsVector.klass, "begin", VALUEFUNC(_wrap_VarsVector_begin), -1);
+  rb_define_method(SwigClassVarsVector.klass, "end", VALUEFUNC(_wrap_VarsVector_end), -1);
+  rb_define_method(SwigClassVarsVector.klass, "rbegin", VALUEFUNC(_wrap_VarsVector_rbegin), -1);
+  rb_define_method(SwigClassVarsVector.klass, "rend", VALUEFUNC(_wrap_VarsVector_rend), -1);
+  rb_define_method(SwigClassVarsVector.klass, "clear", VALUEFUNC(_wrap_VarsVector_clear), -1);
+  rb_define_method(SwigClassVarsVector.klass, "get_allocator", VALUEFUNC(_wrap_VarsVector_get_allocator), -1);
+  rb_define_method(SwigClassVarsVector.klass, "erase", VALUEFUNC(_wrap_VarsVector_erase), -1);
+  rb_define_method(SwigClassVarsVector.klass, "front", VALUEFUNC(_wrap_VarsVector_front), -1);
+  rb_define_method(SwigClassVarsVector.klass, "back", VALUEFUNC(_wrap_VarsVector_back), -1);
+  rb_define_method(SwigClassVarsVector.klass, "assign", VALUEFUNC(_wrap_VarsVector_assign), -1);
+  rb_define_method(SwigClassVarsVector.klass, "resize", VALUEFUNC(_wrap_VarsVector_resize), -1);
+  rb_define_method(SwigClassVarsVector.klass, "insert", VALUEFUNC(_wrap_VarsVector_insert), -1);
+  rb_define_method(SwigClassVarsVector.klass, "reserve", VALUEFUNC(_wrap_VarsVector_reserve), -1);
+  rb_define_method(SwigClassVarsVector.klass, "capacity", VALUEFUNC(_wrap_VarsVector_capacity), -1);
+  SwigClassVarsVector.mark = 0;
+  SwigClassVarsVector.destroy = (void (*)(void *)) free_std_vector_Sl_CdiVariable_Sg_;
+  SwigClassVarsVector.trackObjects = 0;
+  
+  SwigClassVarsMap.klass = rb_define_class("VarsMap", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, (void *) &SwigClassVarsMap);
+  rb_include_module(SwigClassVarsMap.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassVarsMap.klass, _wrap_VarsMap_allocate);
+  rb_define_method(SwigClassVarsMap.klass, "initialize", VALUEFUNC(_wrap_new_VarsMap), -1);
+  rb_define_method(SwigClassVarsMap.klass, "dup", VALUEFUNC(_wrap_VarsMap_dup), -1);
+  rb_define_method(SwigClassVarsMap.klass, "delete", VALUEFUNC(_wrap_VarsMap_delete), -1);
+  rb_define_method(SwigClassVarsMap.klass, "has_key?", VALUEFUNC(_wrap_VarsMap_has_keyq___), -1);
+  rb_define_method(SwigClassVarsMap.klass, "keys", VALUEFUNC(_wrap_VarsMap_keys), -1);
+  rb_define_method(SwigClassVarsMap.klass, "each", VALUEFUNC(_wrap_VarsMap_each), -1);
+  rb_define_method(SwigClassVarsMap.klass, "select", VALUEFUNC(_wrap_VarsMap_select), -1);
+  rb_define_method(SwigClassVarsMap.klass, "values_at", VALUEFUNC(_wrap_VarsMap_values_at), -1);
+  rb_define_method(SwigClassVarsMap.klass, "each_key", VALUEFUNC(_wrap_VarsMap_each_key), -1);
+  rb_define_method(SwigClassVarsMap.klass, "values", VALUEFUNC(_wrap_VarsMap_values), -1);
+  rb_define_method(SwigClassVarsMap.klass, "each_value", VALUEFUNC(_wrap_VarsMap_each_value), -1);
+  rb_define_method(SwigClassVarsMap.klass, "entries", VALUEFUNC(_wrap_VarsMap_entries), -1);
+  rb_define_method(SwigClassVarsMap.klass, "include?", VALUEFUNC(_wrap_VarsMap_includeq___), -1);
+  rb_define_method(SwigClassVarsMap.klass, "key_iterator", VALUEFUNC(_wrap_VarsMap_key_iterator), -1);
+  rb_define_method(SwigClassVarsMap.klass, "value_iterator", VALUEFUNC(_wrap_VarsMap_value_iterator), -1);
+  rb_define_method(SwigClassVarsMap.klass, "[]", VALUEFUNC(_wrap_VarsMap___getitem__), -1);
+  rb_define_method(SwigClassVarsMap.klass, "[]=", VALUEFUNC(_wrap_VarsMap___setitem__), -1);
+  rb_define_method(SwigClassVarsMap.klass, "inspect", VALUEFUNC(_wrap_VarsMap_inspect), -1);
+  rb_define_method(SwigClassVarsMap.klass, "to_a", VALUEFUNC(_wrap_VarsMap_to_a), -1);
+  rb_define_method(SwigClassVarsMap.klass, "to_s", VALUEFUNC(_wrap_VarsMap_to_s), -1);
+  rb_define_method(SwigClassVarsMap.klass, "empty?", VALUEFUNC(_wrap_VarsMap_emptyq___), -1);
+  rb_define_method(SwigClassVarsMap.klass, "size", VALUEFUNC(_wrap_VarsMap_size), -1);
+  rb_define_method(SwigClassVarsMap.klass, "swap", VALUEFUNC(_wrap_VarsMap_swap), -1);
+  rb_define_method(SwigClassVarsMap.klass, "begin", VALUEFUNC(_wrap_VarsMap_begin), -1);
+  rb_define_method(SwigClassVarsMap.klass, "end", VALUEFUNC(_wrap_VarsMap_end), -1);
+  rb_define_method(SwigClassVarsMap.klass, "rbegin", VALUEFUNC(_wrap_VarsMap_rbegin), -1);
+  rb_define_method(SwigClassVarsMap.klass, "rend", VALUEFUNC(_wrap_VarsMap_rend), -1);
+  rb_define_method(SwigClassVarsMap.klass, "clear", VALUEFUNC(_wrap_VarsMap_clear), -1);
+  rb_define_method(SwigClassVarsMap.klass, "get_allocator", VALUEFUNC(_wrap_VarsMap_get_allocator), -1);
+  rb_define_method(SwigClassVarsMap.klass, "count", VALUEFUNC(_wrap_VarsMap_count), -1);
+  rb_define_method(SwigClassVarsMap.klass, "erase", VALUEFUNC(_wrap_VarsMap_erase), -1);
+  rb_define_method(SwigClassVarsMap.klass, "find", VALUEFUNC(_wrap_VarsMap_find), -1);
+  rb_define_method(SwigClassVarsMap.klass, "lower_bound", VALUEFUNC(_wrap_VarsMap_lower_bound), -1);
+  rb_define_method(SwigClassVarsMap.klass, "upper_bound", VALUEFUNC(_wrap_VarsMap_upper_bound), -1);
+  SwigClassVarsMap.mark = 0;
+  SwigClassVarsMap.destroy = (void (*)(void *)) free_std_map_Sl_std_string_Sc_CdiVariable_Sg_;
+  SwigClassVarsMap.trackObjects = 0;
+  
+  SwigClassVarsByCode.klass = rb_define_class("VarsByCode", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, (void *) &SwigClassVarsByCode);
+  rb_include_module(SwigClassVarsByCode.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassVarsByCode.klass, _wrap_VarsByCode_allocate);
+  rb_define_method(SwigClassVarsByCode.klass, "initialize", VALUEFUNC(_wrap_new_VarsByCode), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "dup", VALUEFUNC(_wrap_VarsByCode_dup), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "delete", VALUEFUNC(_wrap_VarsByCode_delete), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "has_key?", VALUEFUNC(_wrap_VarsByCode_has_keyq___), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "keys", VALUEFUNC(_wrap_VarsByCode_keys), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "each", VALUEFUNC(_wrap_VarsByCode_each), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "select", VALUEFUNC(_wrap_VarsByCode_select), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "values_at", VALUEFUNC(_wrap_VarsByCode_values_at), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "each_key", VALUEFUNC(_wrap_VarsByCode_each_key), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "values", VALUEFUNC(_wrap_VarsByCode_values), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "each_value", VALUEFUNC(_wrap_VarsByCode_each_value), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "entries", VALUEFUNC(_wrap_VarsByCode_entries), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "include?", VALUEFUNC(_wrap_VarsByCode_includeq___), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "key_iterator", VALUEFUNC(_wrap_VarsByCode_key_iterator), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "value_iterator", VALUEFUNC(_wrap_VarsByCode_value_iterator), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "[]", VALUEFUNC(_wrap_VarsByCode___getitem__), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "[]=", VALUEFUNC(_wrap_VarsByCode___setitem__), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "inspect", VALUEFUNC(_wrap_VarsByCode_inspect), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "to_a", VALUEFUNC(_wrap_VarsByCode_to_a), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "to_s", VALUEFUNC(_wrap_VarsByCode_to_s), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "empty?", VALUEFUNC(_wrap_VarsByCode_emptyq___), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "size", VALUEFUNC(_wrap_VarsByCode_size), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "swap", VALUEFUNC(_wrap_VarsByCode_swap), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "begin", VALUEFUNC(_wrap_VarsByCode_begin), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "end", VALUEFUNC(_wrap_VarsByCode_end), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "rbegin", VALUEFUNC(_wrap_VarsByCode_rbegin), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "rend", VALUEFUNC(_wrap_VarsByCode_rend), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "clear", VALUEFUNC(_wrap_VarsByCode_clear), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "get_allocator", VALUEFUNC(_wrap_VarsByCode_get_allocator), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "count", VALUEFUNC(_wrap_VarsByCode_count), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "erase", VALUEFUNC(_wrap_VarsByCode_erase), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "find", VALUEFUNC(_wrap_VarsByCode_find), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "lower_bound", VALUEFUNC(_wrap_VarsByCode_lower_bound), -1);
+  rb_define_method(SwigClassVarsByCode.klass, "upper_bound", VALUEFUNC(_wrap_VarsByCode_upper_bound), -1);
+  SwigClassVarsByCode.mark = 0;
+  SwigClassVarsByCode.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiVariable_Sg_;
+  SwigClassVarsByCode.trackObjects = 0;
+  
+  SwigClassTaxesMap.klass = rb_define_class("TaxesMap", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, (void *) &SwigClassTaxesMap);
+  rb_include_module(SwigClassTaxesMap.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassTaxesMap.klass, _wrap_TaxesMap_allocate);
+  rb_define_method(SwigClassTaxesMap.klass, "initialize", VALUEFUNC(_wrap_new_TaxesMap), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "dup", VALUEFUNC(_wrap_TaxesMap_dup), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "delete", VALUEFUNC(_wrap_TaxesMap_delete), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "has_key?", VALUEFUNC(_wrap_TaxesMap_has_keyq___), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "keys", VALUEFUNC(_wrap_TaxesMap_keys), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "each", VALUEFUNC(_wrap_TaxesMap_each), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "select", VALUEFUNC(_wrap_TaxesMap_select), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "values_at", VALUEFUNC(_wrap_TaxesMap_values_at), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "each_key", VALUEFUNC(_wrap_TaxesMap_each_key), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "values", VALUEFUNC(_wrap_TaxesMap_values), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "each_value", VALUEFUNC(_wrap_TaxesMap_each_value), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "entries", VALUEFUNC(_wrap_TaxesMap_entries), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "include?", VALUEFUNC(_wrap_TaxesMap_includeq___), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "key_iterator", VALUEFUNC(_wrap_TaxesMap_key_iterator), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "value_iterator", VALUEFUNC(_wrap_TaxesMap_value_iterator), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "[]", VALUEFUNC(_wrap_TaxesMap___getitem__), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "[]=", VALUEFUNC(_wrap_TaxesMap___setitem__), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "inspect", VALUEFUNC(_wrap_TaxesMap_inspect), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "to_a", VALUEFUNC(_wrap_TaxesMap_to_a), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "to_s", VALUEFUNC(_wrap_TaxesMap_to_s), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "empty?", VALUEFUNC(_wrap_TaxesMap_emptyq___), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "size", VALUEFUNC(_wrap_TaxesMap_size), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "swap", VALUEFUNC(_wrap_TaxesMap_swap), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "begin", VALUEFUNC(_wrap_TaxesMap_begin), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "end", VALUEFUNC(_wrap_TaxesMap_end), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "rbegin", VALUEFUNC(_wrap_TaxesMap_rbegin), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "rend", VALUEFUNC(_wrap_TaxesMap_rend), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "clear", VALUEFUNC(_wrap_TaxesMap_clear), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "get_allocator", VALUEFUNC(_wrap_TaxesMap_get_allocator), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "count", VALUEFUNC(_wrap_TaxesMap_count), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "erase", VALUEFUNC(_wrap_TaxesMap_erase), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "find", VALUEFUNC(_wrap_TaxesMap_find), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "lower_bound", VALUEFUNC(_wrap_TaxesMap_lower_bound), -1);
+  rb_define_method(SwigClassTaxesMap.klass, "upper_bound", VALUEFUNC(_wrap_TaxesMap_upper_bound), -1);
+  SwigClassTaxesMap.mark = 0;
+  SwigClassTaxesMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiTaxis_Sg_;
+  SwigClassTaxesMap.trackObjects = 0;
+  
+  SwigClassZaxesMap.klass = rb_define_class("ZaxesMap", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, (void *) &SwigClassZaxesMap);
+  rb_include_module(SwigClassZaxesMap.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassZaxesMap.klass, _wrap_ZaxesMap_allocate);
+  rb_define_method(SwigClassZaxesMap.klass, "initialize", VALUEFUNC(_wrap_new_ZaxesMap), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "dup", VALUEFUNC(_wrap_ZaxesMap_dup), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "delete", VALUEFUNC(_wrap_ZaxesMap_delete), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "has_key?", VALUEFUNC(_wrap_ZaxesMap_has_keyq___), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "keys", VALUEFUNC(_wrap_ZaxesMap_keys), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "each", VALUEFUNC(_wrap_ZaxesMap_each), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "select", VALUEFUNC(_wrap_ZaxesMap_select), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "values_at", VALUEFUNC(_wrap_ZaxesMap_values_at), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "each_key", VALUEFUNC(_wrap_ZaxesMap_each_key), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "values", VALUEFUNC(_wrap_ZaxesMap_values), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "each_value", VALUEFUNC(_wrap_ZaxesMap_each_value), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "entries", VALUEFUNC(_wrap_ZaxesMap_entries), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "include?", VALUEFUNC(_wrap_ZaxesMap_includeq___), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "key_iterator", VALUEFUNC(_wrap_ZaxesMap_key_iterator), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "value_iterator", VALUEFUNC(_wrap_ZaxesMap_value_iterator), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "[]", VALUEFUNC(_wrap_ZaxesMap___getitem__), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "[]=", VALUEFUNC(_wrap_ZaxesMap___setitem__), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "inspect", VALUEFUNC(_wrap_ZaxesMap_inspect), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "to_a", VALUEFUNC(_wrap_ZaxesMap_to_a), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "to_s", VALUEFUNC(_wrap_ZaxesMap_to_s), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "empty?", VALUEFUNC(_wrap_ZaxesMap_emptyq___), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "size", VALUEFUNC(_wrap_ZaxesMap_size), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "swap", VALUEFUNC(_wrap_ZaxesMap_swap), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "begin", VALUEFUNC(_wrap_ZaxesMap_begin), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "end", VALUEFUNC(_wrap_ZaxesMap_end), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "rbegin", VALUEFUNC(_wrap_ZaxesMap_rbegin), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "rend", VALUEFUNC(_wrap_ZaxesMap_rend), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "clear", VALUEFUNC(_wrap_ZaxesMap_clear), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "get_allocator", VALUEFUNC(_wrap_ZaxesMap_get_allocator), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "count", VALUEFUNC(_wrap_ZaxesMap_count), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "erase", VALUEFUNC(_wrap_ZaxesMap_erase), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "find", VALUEFUNC(_wrap_ZaxesMap_find), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "lower_bound", VALUEFUNC(_wrap_ZaxesMap_lower_bound), -1);
+  rb_define_method(SwigClassZaxesMap.klass, "upper_bound", VALUEFUNC(_wrap_ZaxesMap_upper_bound), -1);
+  SwigClassZaxesMap.mark = 0;
+  SwigClassZaxesMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiZaxis_Sg_;
+  SwigClassZaxesMap.trackObjects = 0;
+  
+  SwigClassGridsMap.klass = rb_define_class("GridsMap", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, (void *) &SwigClassGridsMap);
+  rb_include_module(SwigClassGridsMap.klass, rb_eval_string("Enumerable"));
+  rb_define_alloc_func(SwigClassGridsMap.klass, _wrap_GridsMap_allocate);
+  rb_define_method(SwigClassGridsMap.klass, "initialize", VALUEFUNC(_wrap_new_GridsMap), -1);
+  rb_define_method(SwigClassGridsMap.klass, "dup", VALUEFUNC(_wrap_GridsMap_dup), -1);
+  rb_define_method(SwigClassGridsMap.klass, "delete", VALUEFUNC(_wrap_GridsMap_delete), -1);
+  rb_define_method(SwigClassGridsMap.klass, "has_key?", VALUEFUNC(_wrap_GridsMap_has_keyq___), -1);
+  rb_define_method(SwigClassGridsMap.klass, "keys", VALUEFUNC(_wrap_GridsMap_keys), -1);
+  rb_define_method(SwigClassGridsMap.klass, "each", VALUEFUNC(_wrap_GridsMap_each), -1);
+  rb_define_method(SwigClassGridsMap.klass, "select", VALUEFUNC(_wrap_GridsMap_select), -1);
+  rb_define_method(SwigClassGridsMap.klass, "values_at", VALUEFUNC(_wrap_GridsMap_values_at), -1);
+  rb_define_method(SwigClassGridsMap.klass, "each_key", VALUEFUNC(_wrap_GridsMap_each_key), -1);
+  rb_define_method(SwigClassGridsMap.klass, "values", VALUEFUNC(_wrap_GridsMap_values), -1);
+  rb_define_method(SwigClassGridsMap.klass, "each_value", VALUEFUNC(_wrap_GridsMap_each_value), -1);
+  rb_define_method(SwigClassGridsMap.klass, "entries", VALUEFUNC(_wrap_GridsMap_entries), -1);
+  rb_define_method(SwigClassGridsMap.klass, "include?", VALUEFUNC(_wrap_GridsMap_includeq___), -1);
+  rb_define_method(SwigClassGridsMap.klass, "key_iterator", VALUEFUNC(_wrap_GridsMap_key_iterator), -1);
+  rb_define_method(SwigClassGridsMap.klass, "value_iterator", VALUEFUNC(_wrap_GridsMap_value_iterator), -1);
+  rb_define_method(SwigClassGridsMap.klass, "[]", VALUEFUNC(_wrap_GridsMap___getitem__), -1);
+  rb_define_method(SwigClassGridsMap.klass, "[]=", VALUEFUNC(_wrap_GridsMap___setitem__), -1);
+  rb_define_method(SwigClassGridsMap.klass, "inspect", VALUEFUNC(_wrap_GridsMap_inspect), -1);
+  rb_define_method(SwigClassGridsMap.klass, "to_a", VALUEFUNC(_wrap_GridsMap_to_a), -1);
+  rb_define_method(SwigClassGridsMap.klass, "to_s", VALUEFUNC(_wrap_GridsMap_to_s), -1);
+  rb_define_method(SwigClassGridsMap.klass, "empty?", VALUEFUNC(_wrap_GridsMap_emptyq___), -1);
+  rb_define_method(SwigClassGridsMap.klass, "size", VALUEFUNC(_wrap_GridsMap_size), -1);
+  rb_define_method(SwigClassGridsMap.klass, "swap", VALUEFUNC(_wrap_GridsMap_swap), -1);
+  rb_define_method(SwigClassGridsMap.klass, "begin", VALUEFUNC(_wrap_GridsMap_begin), -1);
+  rb_define_method(SwigClassGridsMap.klass, "end", VALUEFUNC(_wrap_GridsMap_end), -1);
+  rb_define_method(SwigClassGridsMap.klass, "rbegin", VALUEFUNC(_wrap_GridsMap_rbegin), -1);
+  rb_define_method(SwigClassGridsMap.klass, "rend", VALUEFUNC(_wrap_GridsMap_rend), -1);
+  rb_define_method(SwigClassGridsMap.klass, "clear", VALUEFUNC(_wrap_GridsMap_clear), -1);
+  rb_define_method(SwigClassGridsMap.klass, "get_allocator", VALUEFUNC(_wrap_GridsMap_get_allocator), -1);
+  rb_define_method(SwigClassGridsMap.klass, "count", VALUEFUNC(_wrap_GridsMap_count), -1);
+  rb_define_method(SwigClassGridsMap.klass, "erase", VALUEFUNC(_wrap_GridsMap_erase), -1);
+  rb_define_method(SwigClassGridsMap.klass, "find", VALUEFUNC(_wrap_GridsMap_find), -1);
+  rb_define_method(SwigClassGridsMap.klass, "lower_bound", VALUEFUNC(_wrap_GridsMap_lower_bound), -1);
+  rb_define_method(SwigClassGridsMap.klass, "upper_bound", VALUEFUNC(_wrap_GridsMap_upper_bound), -1);
+  SwigClassGridsMap.mark = 0;
+  SwigClassGridsMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiGrid_Sg_;
+  SwigClassGridsMap.trackObjects = 0;
+  
+  SwigClassCdiGrid.klass = rb_define_class("CdiGrid", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_CdiGrid, (void *) &SwigClassCdiGrid);
+  rb_define_alloc_func(SwigClassCdiGrid.klass, _wrap_CdiGrid_allocate);
+  rb_define_method(SwigClassCdiGrid.klass, "initialize", VALUEFUNC(_wrap_new_CdiGrid), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "gridID=", VALUEFUNC(_wrap_CdiGrid_gridID_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "gridID", VALUEFUNC(_wrap_CdiGrid_gridID_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "type=", VALUEFUNC(_wrap_CdiGrid_type_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "type", VALUEFUNC(_wrap_CdiGrid_type_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "size=", VALUEFUNC(_wrap_CdiGrid_size_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "size", VALUEFUNC(_wrap_CdiGrid_size_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xsize=", VALUEFUNC(_wrap_CdiGrid_xsize_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xsize", VALUEFUNC(_wrap_CdiGrid_xsize_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ysize=", VALUEFUNC(_wrap_CdiGrid_ysize_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ysize", VALUEFUNC(_wrap_CdiGrid_ysize_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "prec=", VALUEFUNC(_wrap_CdiGrid_prec_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "prec", VALUEFUNC(_wrap_CdiGrid_prec_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ncorner=", VALUEFUNC(_wrap_CdiGrid_ncorner_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ncorner", VALUEFUNC(_wrap_CdiGrid_ncorner_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasXValues=", VALUEFUNC(_wrap_CdiGrid_hasXValues_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasXValues", VALUEFUNC(_wrap_CdiGrid_hasXValues_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasYValues=", VALUEFUNC(_wrap_CdiGrid_hasYValues_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasYValues", VALUEFUNC(_wrap_CdiGrid_hasYValues_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasBounds=", VALUEFUNC(_wrap_CdiGrid_hasBounds_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "hasBounds", VALUEFUNC(_wrap_CdiGrid_hasBounds_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xvalues=", VALUEFUNC(_wrap_CdiGrid_xvalues_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xvalues", VALUEFUNC(_wrap_CdiGrid_xvalues_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yvalues=", VALUEFUNC(_wrap_CdiGrid_yvalues_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yvalues", VALUEFUNC(_wrap_CdiGrid_yvalues_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xbounds=", VALUEFUNC(_wrap_CdiGrid_xbounds_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xbounds", VALUEFUNC(_wrap_CdiGrid_xbounds_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ybounds=", VALUEFUNC(_wrap_CdiGrid_ybounds_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ybounds", VALUEFUNC(_wrap_CdiGrid_ybounds_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xname=", VALUEFUNC(_wrap_CdiGrid_xname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xname", VALUEFUNC(_wrap_CdiGrid_xname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xlongname=", VALUEFUNC(_wrap_CdiGrid_xlongname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xlongname", VALUEFUNC(_wrap_CdiGrid_xlongname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xstdname=", VALUEFUNC(_wrap_CdiGrid_xstdname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xstdname", VALUEFUNC(_wrap_CdiGrid_xstdname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xunits=", VALUEFUNC(_wrap_CdiGrid_xunits_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "xunits", VALUEFUNC(_wrap_CdiGrid_xunits_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yname=", VALUEFUNC(_wrap_CdiGrid_yname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yname", VALUEFUNC(_wrap_CdiGrid_yname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ylongname=", VALUEFUNC(_wrap_CdiGrid_ylongname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ylongname", VALUEFUNC(_wrap_CdiGrid_ylongname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ystdname=", VALUEFUNC(_wrap_CdiGrid_ystdname_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "ystdname", VALUEFUNC(_wrap_CdiGrid_ystdname_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yunits=", VALUEFUNC(_wrap_CdiGrid_yunits_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "yunits", VALUEFUNC(_wrap_CdiGrid_yunits_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "name=", VALUEFUNC(_wrap_CdiGrid_name_set), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "name", VALUEFUNC(_wrap_CdiGrid_name_get), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getValues", VALUEFUNC(_wrap_CdiGrid_getValues), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getBounds", VALUEFUNC(_wrap_CdiGrid_getBounds), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getValuesAsPointer", VALUEFUNC(_wrap_CdiGrid_getValuesAsPointer), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getBoundsAsPointer", VALUEFUNC(_wrap_CdiGrid_getBoundsAsPointer), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getFloatVals", VALUEFUNC(_wrap_CdiGrid_getFloatVals), -1);
+  rb_define_method(SwigClassCdiGrid.klass, "getFloatBounds", VALUEFUNC(_wrap_CdiGrid_getFloatBounds), -1);
+  SwigClassCdiGrid.mark = 0;
+  SwigClassCdiGrid.destroy = (void (*)(void *)) free_CdiGrid;
+  SwigClassCdiGrid.trackObjects = 0;
+  
+  SwigClassCdiTaxis.klass = rb_define_class("CdiTaxis", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_CdiTaxis, (void *) &SwigClassCdiTaxis);
+  rb_define_alloc_func(SwigClassCdiTaxis.klass, _wrap_CdiTaxis_allocate);
+  rb_define_method(SwigClassCdiTaxis.klass, "initialize", VALUEFUNC(_wrap_new_CdiTaxis), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "taxisID=", VALUEFUNC(_wrap_CdiTaxis_taxisID_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "taxisID", VALUEFUNC(_wrap_CdiTaxis_taxisID_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "ntsteps=", VALUEFUNC(_wrap_CdiTaxis_ntsteps_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "ntsteps", VALUEFUNC(_wrap_CdiTaxis_ntsteps_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "unit=", VALUEFUNC(_wrap_CdiTaxis_unit_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "unit", VALUEFUNC(_wrap_CdiTaxis_unit_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "rdate=", VALUEFUNC(_wrap_CdiTaxis_rdate_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "rdate", VALUEFUNC(_wrap_CdiTaxis_rdate_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "rtime=", VALUEFUNC(_wrap_CdiTaxis_rtime_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "rtime", VALUEFUNC(_wrap_CdiTaxis_rtime_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "vdate=", VALUEFUNC(_wrap_CdiTaxis_vdate_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "vdate", VALUEFUNC(_wrap_CdiTaxis_vdate_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "vtime=", VALUEFUNC(_wrap_CdiTaxis_vtime_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "vtime", VALUEFUNC(_wrap_CdiTaxis_vtime_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "type=", VALUEFUNC(_wrap_CdiTaxis_type_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "type", VALUEFUNC(_wrap_CdiTaxis_type_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "calendar=", VALUEFUNC(_wrap_CdiTaxis_calendar_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "calendar", VALUEFUNC(_wrap_CdiTaxis_calendar_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "hasBounds=", VALUEFUNC(_wrap_CdiTaxis_hasBounds_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "hasBounds", VALUEFUNC(_wrap_CdiTaxis_hasBounds_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "name=", VALUEFUNC(_wrap_CdiTaxis_name_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "name", VALUEFUNC(_wrap_CdiTaxis_name_get), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "unitname=", VALUEFUNC(_wrap_CdiTaxis_unitname_set), -1);
+  rb_define_method(SwigClassCdiTaxis.klass, "unitname", VALUEFUNC(_wrap_CdiTaxis_unitname_get), -1);
+  SwigClassCdiTaxis.mark = 0;
+  SwigClassCdiTaxis.destroy = (void (*)(void *)) free_CdiTaxis;
+  SwigClassCdiTaxis.trackObjects = 0;
+  
+  SwigClassCdiZaxis.klass = rb_define_class("CdiZaxis", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_CdiZaxis, (void *) &SwigClassCdiZaxis);
+  rb_define_alloc_func(SwigClassCdiZaxis.klass, _wrap_CdiZaxis_allocate);
+  rb_define_method(SwigClassCdiZaxis.klass, "initialize", VALUEFUNC(_wrap_new_CdiZaxis), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "zaxisID=", VALUEFUNC(_wrap_CdiZaxis_zaxisID_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "zaxisID", VALUEFUNC(_wrap_CdiZaxis_zaxisID_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "type=", VALUEFUNC(_wrap_CdiZaxis_type_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "type", VALUEFUNC(_wrap_CdiZaxis_type_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "ltype=", VALUEFUNC(_wrap_CdiZaxis_ltype_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "ltype", VALUEFUNC(_wrap_CdiZaxis_ltype_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "size=", VALUEFUNC(_wrap_CdiZaxis_size_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "size", VALUEFUNC(_wrap_CdiZaxis_size_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "prec=", VALUEFUNC(_wrap_CdiZaxis_prec_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "prec", VALUEFUNC(_wrap_CdiZaxis_prec_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "plevels=", VALUEFUNC(_wrap_CdiZaxis_plevels_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "plevels", VALUEFUNC(_wrap_CdiZaxis_plevels_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "plbounds=", VALUEFUNC(_wrap_CdiZaxis_plbounds_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "plbounds", VALUEFUNC(_wrap_CdiZaxis_plbounds_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "pubounds=", VALUEFUNC(_wrap_CdiZaxis_pubounds_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "pubounds", VALUEFUNC(_wrap_CdiZaxis_pubounds_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "pweights=", VALUEFUNC(_wrap_CdiZaxis_pweights_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "pweights", VALUEFUNC(_wrap_CdiZaxis_pweights_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "levels=", VALUEFUNC(_wrap_CdiZaxis_levels_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "levels", VALUEFUNC(_wrap_CdiZaxis_levels_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "lbounds=", VALUEFUNC(_wrap_CdiZaxis_lbounds_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "lbounds", VALUEFUNC(_wrap_CdiZaxis_lbounds_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "ubounds=", VALUEFUNC(_wrap_CdiZaxis_ubounds_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "ubounds", VALUEFUNC(_wrap_CdiZaxis_ubounds_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "weights=", VALUEFUNC(_wrap_CdiZaxis_weights_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "weights", VALUEFUNC(_wrap_CdiZaxis_weights_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "name=", VALUEFUNC(_wrap_CdiZaxis_name_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "name", VALUEFUNC(_wrap_CdiZaxis_name_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "longname=", VALUEFUNC(_wrap_CdiZaxis_longname_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "longname", VALUEFUNC(_wrap_CdiZaxis_longname_get), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "units=", VALUEFUNC(_wrap_CdiZaxis_units_set), -1);
+  rb_define_method(SwigClassCdiZaxis.klass, "units", VALUEFUNC(_wrap_CdiZaxis_units_get), -1);
+  SwigClassCdiZaxis.mark = 0;
+  SwigClassCdiZaxis.destroy = (void (*)(void *)) free_CdiZaxis;
+  SwigClassCdiZaxis.trackObjects = 0;
+  
+  SwigClassCdiVariable.klass = rb_define_class("CdiVariable", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_CdiVariable, (void *) &SwigClassCdiVariable);
+  rb_define_alloc_func(SwigClassCdiVariable.klass, _wrap_CdiVariable_allocate);
+  rb_define_method(SwigClassCdiVariable.klass, "initialize", VALUEFUNC(_wrap_new_CdiVariable), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "varID=", VALUEFUNC(_wrap_CdiVariable_varID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "varID", VALUEFUNC(_wrap_CdiVariable_varID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "zaxisID=", VALUEFUNC(_wrap_CdiVariable_zaxisID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "zaxisID", VALUEFUNC(_wrap_CdiVariable_zaxisID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "gridID=", VALUEFUNC(_wrap_CdiVariable_gridID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "gridID", VALUEFUNC(_wrap_CdiVariable_gridID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "taxisID=", VALUEFUNC(_wrap_CdiVariable_taxisID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "taxisID", VALUEFUNC(_wrap_CdiVariable_taxisID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "timeID=", VALUEFUNC(_wrap_CdiVariable_timeID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "timeID", VALUEFUNC(_wrap_CdiVariable_timeID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "vlistID=", VALUEFUNC(_wrap_CdiVariable_vlistID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "vlistID", VALUEFUNC(_wrap_CdiVariable_vlistID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "size=", VALUEFUNC(_wrap_CdiVariable_size_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "size", VALUEFUNC(_wrap_CdiVariable_size_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "code=", VALUEFUNC(_wrap_CdiVariable_code_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "code", VALUEFUNC(_wrap_CdiVariable_code_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "datatype=", VALUEFUNC(_wrap_CdiVariable_datatype_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "datatype", VALUEFUNC(_wrap_CdiVariable_datatype_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "streamID=", VALUEFUNC(_wrap_CdiVariable_streamID_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "streamID", VALUEFUNC(_wrap_CdiVariable_streamID_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "name=", VALUEFUNC(_wrap_CdiVariable_name_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "name", VALUEFUNC(_wrap_CdiVariable_name_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "longname=", VALUEFUNC(_wrap_CdiVariable_longname_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "longname", VALUEFUNC(_wrap_CdiVariable_longname_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "units=", VALUEFUNC(_wrap_CdiVariable_units_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "units", VALUEFUNC(_wrap_CdiVariable_units_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "stdname=", VALUEFUNC(_wrap_CdiVariable_stdname_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "stdname", VALUEFUNC(_wrap_CdiVariable_stdname_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "missval=", VALUEFUNC(_wrap_CdiVariable_missval_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "missval", VALUEFUNC(_wrap_CdiVariable_missval_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "values=", VALUEFUNC(_wrap_CdiVariable_values_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "values", VALUEFUNC(_wrap_CdiVariable_values_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "valuesWithLevel=", VALUEFUNC(_wrap_CdiVariable_valuesWithLevel_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "valuesWithLevel", VALUEFUNC(_wrap_CdiVariable_valuesWithLevel_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "grid=", VALUEFUNC(_wrap_CdiVariable_grid_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "grid", VALUEFUNC(_wrap_CdiVariable_grid_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "zaxis=", VALUEFUNC(_wrap_CdiVariable_zaxis_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "zaxis", VALUEFUNC(_wrap_CdiVariable_zaxis_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "taxis=", VALUEFUNC(_wrap_CdiVariable_taxis_set), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "taxis", VALUEFUNC(_wrap_CdiVariable_taxis_get), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "sinfo", VALUEFUNC(_wrap_CdiVariable_sinfo), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getValues", VALUEFUNC(_wrap_CdiVariable_getValues), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getValuesWithLevel", VALUEFUNC(_wrap_CdiVariable_getValuesWithLevel), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getFValues", VALUEFUNC(_wrap_CdiVariable_getFValues), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getFValuesWithLevel", VALUEFUNC(_wrap_CdiVariable_getFValuesWithLevel), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getValuesAsPointer", VALUEFUNC(_wrap_CdiVariable_getValuesAsPointer), -1);
+  rb_define_method(SwigClassCdiVariable.klass, "getValuesWithLevelAsPointer", VALUEFUNC(_wrap_CdiVariable_getValuesWithLevelAsPointer), -1);
+  SwigClassCdiVariable.mark = 0;
+  SwigClassCdiVariable.destroy = (void (*)(void *)) free_CdiVariable;
+  SwigClassCdiVariable.trackObjects = 0;
+  
+  SwigClassCdi.klass = rb_define_class("Cdi", rb_cObject);
+  SWIG_TypeClientData(SWIGTYPE_p_Cdi, (void *) &SwigClassCdi);
+  rb_define_alloc_func(SwigClassCdi.klass, _wrap_Cdi_allocate);
+  rb_define_method(SwigClassCdi.klass, "initialize", VALUEFUNC(_wrap_new_Cdi), -1);
+  rb_define_method(SwigClassCdi.klass, "streamID=", VALUEFUNC(_wrap_Cdi_streamID_set), -1);
+  rb_define_method(SwigClassCdi.klass, "streamID", VALUEFUNC(_wrap_Cdi_streamID_get), -1);
+  rb_define_method(SwigClassCdi.klass, "vlistID=", VALUEFUNC(_wrap_Cdi_vlistID_set), -1);
+  rb_define_method(SwigClassCdi.klass, "vlistID", VALUEFUNC(_wrap_Cdi_vlistID_get), -1);
+  rb_define_method(SwigClassCdi.klass, "nvars=", VALUEFUNC(_wrap_Cdi_nvars_set), -1);
+  rb_define_method(SwigClassCdi.klass, "nvars", VALUEFUNC(_wrap_Cdi_nvars_get), -1);
+  rb_define_method(SwigClassCdi.klass, "nzaxes=", VALUEFUNC(_wrap_Cdi_nzaxes_set), -1);
+  rb_define_method(SwigClassCdi.klass, "nzaxes", VALUEFUNC(_wrap_Cdi_nzaxes_get), -1);
+  rb_define_method(SwigClassCdi.klass, "ngrids=", VALUEFUNC(_wrap_Cdi_ngrids_set), -1);
+  rb_define_method(SwigClassCdi.klass, "ngrids", VALUEFUNC(_wrap_Cdi_ngrids_get), -1);
+  rb_define_method(SwigClassCdi.klass, "ntaxes=", VALUEFUNC(_wrap_Cdi_ntaxes_set), -1);
+  rb_define_method(SwigClassCdi.klass, "ntaxes", VALUEFUNC(_wrap_Cdi_ntaxes_get), -1);
+  rb_define_method(SwigClassCdi.klass, "taxisID=", VALUEFUNC(_wrap_Cdi_taxisID_set), -1);
+  rb_define_method(SwigClassCdi.klass, "taxisID", VALUEFUNC(_wrap_Cdi_taxisID_get), -1);
+  rb_define_method(SwigClassCdi.klass, "varnames=", VALUEFUNC(_wrap_Cdi_varnames_set), -1);
+  rb_define_method(SwigClassCdi.klass, "varnames", VALUEFUNC(_wrap_Cdi_varnames_get), -1);
+  rb_define_method(SwigClassCdi.klass, "codes=", VALUEFUNC(_wrap_Cdi_codes_set), -1);
+  rb_define_method(SwigClassCdi.klass, "codes", VALUEFUNC(_wrap_Cdi_codes_get), -1);
+  rb_define_method(SwigClassCdi.klass, "variables=", VALUEFUNC(_wrap_Cdi_variables_set), -1);
+  rb_define_method(SwigClassCdi.klass, "variables", VALUEFUNC(_wrap_Cdi_variables_get), -1);
+  rb_define_method(SwigClassCdi.klass, "var=", VALUEFUNC(_wrap_Cdi_var_set), -1);
+  rb_define_method(SwigClassCdi.klass, "var", VALUEFUNC(_wrap_Cdi_var_get), -1);
+  rb_define_method(SwigClassCdi.klass, "varByCode=", VALUEFUNC(_wrap_Cdi_varByCode_set), -1);
+  rb_define_method(SwigClassCdi.klass, "varByCode", VALUEFUNC(_wrap_Cdi_varByCode_get), -1);
+  rb_define_method(SwigClassCdi.klass, "taxes=", VALUEFUNC(_wrap_Cdi_taxes_set), -1);
+  rb_define_method(SwigClassCdi.klass, "taxes", VALUEFUNC(_wrap_Cdi_taxes_get), -1);
+  rb_define_method(SwigClassCdi.klass, "zaxes=", VALUEFUNC(_wrap_Cdi_zaxes_set), -1);
+  rb_define_method(SwigClassCdi.klass, "zaxes", VALUEFUNC(_wrap_Cdi_zaxes_get), -1);
+  rb_define_method(SwigClassCdi.klass, "grids=", VALUEFUNC(_wrap_Cdi_grids_set), -1);
+  rb_define_method(SwigClassCdi.klass, "grids", VALUEFUNC(_wrap_Cdi_grids_get), -1);
+  rb_define_method(SwigClassCdi.klass, "griddes", VALUEFUNC(_wrap_Cdi_griddes), -1);
+  SwigClassCdi.mark = 0;
+  SwigClassCdi.destroy = (void (*)(void *)) free_Cdi;
+  SwigClassCdi.trackObjects = 0;
+}
+
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 000000000..a644432f4
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,8372 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 58 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from 'configure', and 'config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain=$ac_aux_dir/ltmain.sh
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the 'libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags='_LT_TAGS'dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# '#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS=$save_LDFLAGS
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+    m4_if([$1], [CXX],
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+case $ECHO in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([$with_sysroot])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes = "$cross_compiling"; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen=shl_load],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen=dlopen],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x@S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Add ABI-specific directories to the system library path.
+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program that can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test no = "$withval" || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd*)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test yes = "$GCC"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd*)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	else
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC=$CC
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report what library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC=$lt_save_CC
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+              '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test no = "$F77"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test no = "$FC"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=$lt_simple_compile_test_code
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f "$lt_ac_sed" && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test 10 -lt "$lt_ac_count" && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 000000000..94b082976
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 8 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# LT_INIT options.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [pic_mode=m4_default([$1], [default])])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 000000000..48bc9344a
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59, which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 000000000..fa04b52a3
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 4179 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.6'
+macro_revision='2.4.6'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 000000000..c6b26f88f
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 000000000..7982bcd7a
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,1597 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+EXTRA_PROGRAMS = make_fint$(EXEEXT)
+@ENABLE_CDI_LIB_TRUE@am__append_1 = libcdi.la
+@ENABLE_CDI_LIB_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_2 = cdi.inc
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_3 = $(mo_cdi_mod)
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_4 = libcdi_f2003.la
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_5 = pkgconfig/cdi_f2003.pc
+@ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_6 = cdipio.h
+@ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_7 = libcdipio.la
+@ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_8 = pkgconfig/cdipio.pc
+@ENABLE_CDI_LIB_TRUE@@ENABLE_CF_INTERFACE_TRUE@@ENABLE_MPI_TRUE@am__append_9 = cdipio.inc
+@ENABLE_CDI_LIB_FALSE@am__append_10 = libcdi.la
+@ENABLE_CDI_LIB_FALSE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_11 = libcdi_f2003.la
+@ENABLE_CDI_LIB_FALSE@@ENABLE_MPI_TRUE@am__append_12 = libcdipio.la
+@with_on_demand_check_programs_TRUE@am__append_13 = libcdiresunpack.la
+@with_on_demand_check_programs_FALSE@am__append_14 = libcdiresunpack.la
+# TODO: this needs a refactoring but for now we set this macro here and not in
+# config.h because the macro is used in several files that do not include the
+# header file directly.
+@ENABLE_MPI_TRUE@am__append_15 = -DUSE_MPI
+@ENABLE_CF_INTERFACE_TRUE@am__append_16 = \
+@ENABLE_CF_INTERFACE_TRUE@  cdiFortran.c \
+@ENABLE_CF_INTERFACE_TRUE@  cfortran.h
+
+@HAVE_LIBGRIB_API_TRUE@am__append_17 = \
+@HAVE_LIBGRIB_API_TRUE@  gribapi_utilities.c \
+@HAVE_LIBGRIB_API_TRUE@  stream_gribapi.c
+
+@ENABLE_CF_INTERFACE_TRUE@am__append_18 = \
+@ENABLE_CF_INTERFACE_TRUE@  cdipioFortran.c \
+@ENABLE_CF_INTERFACE_TRUE@  cfortran.h
+
+@HAVE_PARALLEL_NC4_TRUE@am__append_19 = pio_cdf_int.c
+@ENABLE_ISOC_INTERFACE_TRUE@am__append_20 = $(mo_cdi_mod)
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__include_HEADERS_DIST) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cmakedir)" \
+	"$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \
+	"$(DESTDIR)$(includedir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+libcdi_la_LIBADD =
+am__libcdi_la_SOURCES_DIST = async_worker.c async_worker.h basetime.c \
+	basetime.h binary.c binary.h calendar.c calendar.h cdf.c cdf.h \
+	cdf_config.h cdf_filter.c cdf_filter.h cdf_int.c cdf_int.h \
+	cdf_lazy_grid.c cdf_lazy_grid.h cdf_read.c cdf_records.c \
+	cdf_util.c cdf_util.h cdf_write.c cdi.h cdi_across.c \
+	cdi_across.h cdi_att.c cdi_att.h cdi_cksum.c cdi_cksum.h \
+	cdi_datetime.c cdi_datetime.h cdi_error.c cdi_fdb.c cdi_fdb.h \
+	cdi_int.c cdi_int.h cdi_key.c cdi_key.h cdi_limits.h \
+	cdi_query.c cdi_util.c cdi_uuid.h cgribex.h cgribexlib.c \
+	cksum.c cksum.h dmemory.c dmemory.h error.c error.h exse.h \
+	extra.h extralib.c file.c file.h gaussian_latitudes.c \
+	get_num_missvals.c get_num_missvals.h grb_read.c grb_write.c \
+	gribapi.c gribapi.h gribapi_utilities.h grid.c grid.h ieg.h \
+	ieglib.c input_file.c input_file.h institution.c institution.h \
+	iterator.c iterator.h iterator_fallback.c iterator_fallback.h \
+	iterator_grib.c iterator_grib.h julian_date.c julian_date.h \
+	model.c model.h namespace.c namespace.h normalize_month.h \
+	referenceCounting.c referenceCounting.h resource_handle.c \
+	resource_handle.h serialize.c serialize.h service.h \
+	servicelib.c stream.c stream_cdf.h stream_cdf_i.c \
+	stream_cdf_o.c stream_cdf_postdef.h stream_cdf_time.c \
+	stream_cgribex.c stream_cgribex.h stream_ext.c stream_ext.h \
+	stream_grb.c stream_grb.h stream_gribapi.h stream_ieg.c \
+	stream_ieg.h stream_read.c stream_record.c stream_scan.c \
+	stream_scan.h stream_srv.c stream_srv.h stream_var.c \
+	stream_write.c subtype.c subtype.h swap.c swap.h table.c \
+	table.h tablepar.h taxis.c taxis.h tsteps.c util.c varscan.c \
+	varscan.h version.c vlist.c vlist.h vlist_var.c vlist_var.h \
+	vlist_var_key.c vlist_var_pack.c zaxis.c zaxis.h cdiFortran.c \
+	cfortran.h gribapi_utilities.c stream_gribapi.c
+@ENABLE_CF_INTERFACE_TRUE@am__objects_1 = cdiFortran.lo
+@HAVE_LIBGRIB_API_TRUE@am__objects_2 = gribapi_utilities.lo \
+@HAVE_LIBGRIB_API_TRUE@	stream_gribapi.lo
+am_libcdi_la_OBJECTS = async_worker.lo basetime.lo binary.lo \
+	calendar.lo cdf.lo cdf_filter.lo cdf_int.lo cdf_lazy_grid.lo \
+	cdf_read.lo cdf_records.lo cdf_util.lo cdf_write.lo \
+	cdi_across.lo cdi_att.lo cdi_cksum.lo cdi_datetime.lo \
+	cdi_error.lo cdi_fdb.lo cdi_int.lo cdi_key.lo cdi_query.lo \
+	cdi_util.lo cgribexlib.lo cksum.lo dmemory.lo error.lo \
+	extralib.lo file.lo gaussian_latitudes.lo get_num_missvals.lo \
+	grb_read.lo grb_write.lo gribapi.lo grid.lo ieglib.lo \
+	input_file.lo institution.lo iterator.lo iterator_fallback.lo \
+	iterator_grib.lo julian_date.lo model.lo namespace.lo \
+	referenceCounting.lo resource_handle.lo serialize.lo \
+	servicelib.lo stream.lo stream_cdf_i.lo stream_cdf_o.lo \
+	stream_cdf_time.lo stream_cgribex.lo stream_ext.lo \
+	stream_grb.lo stream_ieg.lo stream_read.lo stream_record.lo \
+	stream_scan.lo stream_srv.lo stream_var.lo stream_write.lo \
+	subtype.lo swap.lo table.lo taxis.lo tsteps.lo util.lo \
+	varscan.lo version.lo vlist.lo vlist_var.lo vlist_var_key.lo \
+	vlist_var_pack.lo zaxis.lo $(am__objects_1) $(am__objects_2)
+libcdi_la_OBJECTS = $(am_libcdi_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+@ENABLE_CDI_LIB_FALSE@am_libcdi_la_rpath =
+@ENABLE_CDI_LIB_TRUE@am_libcdi_la_rpath = -rpath $(libdir)
+libcdi_f2003_la_DEPENDENCIES = libcdi.la
+am_libcdi_f2003_la_OBJECTS = mo_cdi.lo
+libcdi_f2003_la_OBJECTS = $(am_libcdi_f2003_la_OBJECTS)
+@ENABLE_CDI_LIB_FALSE@@ENABLE_ISOC_INTERFACE_TRUE@am_libcdi_f2003_la_rpath =
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am_libcdi_f2003_la_rpath =  \
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@	-rpath \
+@ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@	$(libdir)
+am__DEPENDENCIES_1 =
+libcdipio_la_DEPENDENCIES = libcdi.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+am__libcdipio_la_SOURCES_DIST = cdipio.h pio.c pio.h pio_cdf_int.h \
+	pio_client.c pio_client.h pio_comm.c pio_comm.h pio_conf.c \
+	pio_conf.h pio_dbuffer.c pio_dbuffer.h pio_dist_grid.c \
+	pio_dist_grid.h pio_id_set.h pio_idxlist_cache.c \
+	pio_idxlist_cache.h pio_impl.h pio_interface.c pio_interface.h \
+	pio_mpi_fw_at_all.c pio_mpi_fw_at_reblock.c \
+	pio_mpi_fw_ordered.c pio_mpinonb.c pio_posixasynch.c \
+	pio_posixfpguardsendrecv.c pio_posixnonb.c pio_record_send.c \
+	pio_roles.c pio_rpc.c pio_rpc.h pio_serialize.c \
+	pio_serialize.h pio_server.c pio_server.h pio_util.c \
+	pio_util.h pio_xmap_cache.c pio_xmap_cache.h resource_unpack.c \
+	resource_unpack.h cdipioFortran.c cfortran.h pio_cdf_int.c
+@ENABLE_CF_INTERFACE_TRUE@am__objects_3 = cdipioFortran.lo
+@HAVE_PARALLEL_NC4_TRUE@am__objects_4 = pio_cdf_int.lo
+am_libcdipio_la_OBJECTS = pio.lo pio_client.lo pio_comm.lo pio_conf.lo \
+	pio_dbuffer.lo pio_dist_grid.lo pio_idxlist_cache.lo \
+	pio_interface.lo pio_mpi_fw_at_all.lo pio_mpi_fw_at_reblock.lo \
+	pio_mpi_fw_ordered.lo pio_mpinonb.lo pio_posixasynch.lo \
+	pio_posixfpguardsendrecv.lo pio_posixnonb.lo \
+	pio_record_send.lo pio_roles.lo pio_rpc.lo pio_serialize.lo \
+	pio_server.lo pio_util.lo pio_xmap_cache.lo resource_unpack.lo \
+	$(am__objects_3) $(am__objects_4)
+libcdipio_la_OBJECTS = $(am_libcdipio_la_OBJECTS)
+@ENABLE_CDI_LIB_FALSE@@ENABLE_MPI_TRUE@am_libcdipio_la_rpath =
+@ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am_libcdipio_la_rpath = -rpath \
+@ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@	$(libdir)
+libcdiresunpack_la_DEPENDENCIES = libcdi.la
+am_libcdiresunpack_la_OBJECTS = resource_unpack.lo
+libcdiresunpack_la_OBJECTS = $(am_libcdiresunpack_la_OBJECTS)
+@with_on_demand_check_programs_FALSE@am_libcdiresunpack_la_rpath =
+@with_on_demand_check_programs_TRUE@am_libcdiresunpack_la_rpath =
+am_make_fint_OBJECTS = make_fint.$(OBJEXT)
+make_fint_OBJECTS = $(am_make_fint_OBJECTS)
+make_fint_DEPENDENCIES = $(LIBOBJS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = $(DEPDIR)/getline.Po \
+	./$(DEPDIR)/async_worker.Plo ./$(DEPDIR)/basetime.Plo \
+	./$(DEPDIR)/binary.Plo ./$(DEPDIR)/calendar.Plo \
+	./$(DEPDIR)/cdf.Plo ./$(DEPDIR)/cdf_filter.Plo \
+	./$(DEPDIR)/cdf_int.Plo ./$(DEPDIR)/cdf_lazy_grid.Plo \
+	./$(DEPDIR)/cdf_read.Plo ./$(DEPDIR)/cdf_records.Plo \
+	./$(DEPDIR)/cdf_util.Plo ./$(DEPDIR)/cdf_write.Plo \
+	./$(DEPDIR)/cdiFortran.Plo ./$(DEPDIR)/cdi_across.Plo \
+	./$(DEPDIR)/cdi_att.Plo ./$(DEPDIR)/cdi_cksum.Plo \
+	./$(DEPDIR)/cdi_datetime.Plo ./$(DEPDIR)/cdi_error.Plo \
+	./$(DEPDIR)/cdi_fdb.Plo ./$(DEPDIR)/cdi_int.Plo \
+	./$(DEPDIR)/cdi_key.Plo ./$(DEPDIR)/cdi_query.Plo \
+	./$(DEPDIR)/cdi_util.Plo ./$(DEPDIR)/cdipioFortran.Plo \
+	./$(DEPDIR)/cgribexlib.Plo ./$(DEPDIR)/cksum.Plo \
+	./$(DEPDIR)/dmemory.Plo ./$(DEPDIR)/error.Plo \
+	./$(DEPDIR)/extralib.Plo ./$(DEPDIR)/file.Plo \
+	./$(DEPDIR)/gaussian_latitudes.Plo \
+	./$(DEPDIR)/get_num_missvals.Plo ./$(DEPDIR)/grb_read.Plo \
+	./$(DEPDIR)/grb_write.Plo ./$(DEPDIR)/gribapi.Plo \
+	./$(DEPDIR)/gribapi_utilities.Plo ./$(DEPDIR)/grid.Plo \
+	./$(DEPDIR)/ieglib.Plo ./$(DEPDIR)/input_file.Plo \
+	./$(DEPDIR)/institution.Plo ./$(DEPDIR)/iterator.Plo \
+	./$(DEPDIR)/iterator_fallback.Plo \
+	./$(DEPDIR)/iterator_grib.Plo ./$(DEPDIR)/julian_date.Plo \
+	./$(DEPDIR)/make_fint.Po ./$(DEPDIR)/model.Plo \
+	./$(DEPDIR)/namespace.Plo ./$(DEPDIR)/pio.Plo \
+	./$(DEPDIR)/pio_cdf_int.Plo ./$(DEPDIR)/pio_client.Plo \
+	./$(DEPDIR)/pio_comm.Plo ./$(DEPDIR)/pio_conf.Plo \
+	./$(DEPDIR)/pio_dbuffer.Plo ./$(DEPDIR)/pio_dist_grid.Plo \
+	./$(DEPDIR)/pio_idxlist_cache.Plo \
+	./$(DEPDIR)/pio_interface.Plo \
+	./$(DEPDIR)/pio_mpi_fw_at_all.Plo \
+	./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo \
+	./$(DEPDIR)/pio_mpi_fw_ordered.Plo ./$(DEPDIR)/pio_mpinonb.Plo \
+	./$(DEPDIR)/pio_posixasynch.Plo \
+	./$(DEPDIR)/pio_posixfpguardsendrecv.Plo \
+	./$(DEPDIR)/pio_posixnonb.Plo ./$(DEPDIR)/pio_record_send.Plo \
+	./$(DEPDIR)/pio_roles.Plo ./$(DEPDIR)/pio_rpc.Plo \
+	./$(DEPDIR)/pio_serialize.Plo ./$(DEPDIR)/pio_server.Plo \
+	./$(DEPDIR)/pio_util.Plo ./$(DEPDIR)/pio_xmap_cache.Plo \
+	./$(DEPDIR)/referenceCounting.Plo \
+	./$(DEPDIR)/resource_handle.Plo \
+	./$(DEPDIR)/resource_unpack.Plo ./$(DEPDIR)/serialize.Plo \
+	./$(DEPDIR)/servicelib.Plo ./$(DEPDIR)/stream.Plo \
+	./$(DEPDIR)/stream_cdf_i.Plo ./$(DEPDIR)/stream_cdf_o.Plo \
+	./$(DEPDIR)/stream_cdf_time.Plo ./$(DEPDIR)/stream_cgribex.Plo \
+	./$(DEPDIR)/stream_ext.Plo ./$(DEPDIR)/stream_grb.Plo \
+	./$(DEPDIR)/stream_gribapi.Plo ./$(DEPDIR)/stream_ieg.Plo \
+	./$(DEPDIR)/stream_read.Plo ./$(DEPDIR)/stream_record.Plo \
+	./$(DEPDIR)/stream_scan.Plo ./$(DEPDIR)/stream_srv.Plo \
+	./$(DEPDIR)/stream_var.Plo ./$(DEPDIR)/stream_write.Plo \
+	./$(DEPDIR)/subtype.Plo ./$(DEPDIR)/swap.Plo \
+	./$(DEPDIR)/table.Plo ./$(DEPDIR)/taxis.Plo \
+	./$(DEPDIR)/tsteps.Plo ./$(DEPDIR)/util.Plo \
+	./$(DEPDIR)/varscan.Plo ./$(DEPDIR)/version.Plo \
+	./$(DEPDIR)/vlist.Plo ./$(DEPDIR)/vlist_var.Plo \
+	./$(DEPDIR)/vlist_var_key.Plo ./$(DEPDIR)/vlist_var_pack.Plo \
+	./$(DEPDIR)/zaxis.Plo
+am__mv = mv -f
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+AM_V_FC = $(am__v_FC_@AM_V@)
+am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@)
+am__v_FC_0 = @echo "  FC      " $@;
+am__v_FC_1 =
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_@AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 =
+SOURCES = $(libcdi_la_SOURCES) $(libcdi_f2003_la_SOURCES) \
+	$(libcdipio_la_SOURCES) $(libcdiresunpack_la_SOURCES) \
+	$(make_fint_SOURCES)
+DIST_SOURCES = $(am__libcdi_la_SOURCES_DIST) \
+	$(libcdi_f2003_la_SOURCES) $(am__libcdipio_la_SOURCES_DIST) \
+	$(libcdiresunpack_la_SOURCES) $(make_fint_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(nodist_cmake_DATA) $(nodist_pkgconfig_DATA)
+am__include_HEADERS_DIST = calendar.h cdi.h cdi_datetime.h \
+	julian_date.h cdi.inc cdipio.h cdipio.inc
+HEADERS = $(include_HEADERS) $(nodist_include_HEADERS)
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)config.h.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(top_srcdir)/config/depcomp getline.c
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+lib_LTLIBRARIES = $(am__append_1) $(am__append_4) $(am__append_7)
+check_LTLIBRARIES = $(am__append_13)
+noinst_LTLIBRARIES = $(am__append_10) $(am__append_11) \
+	$(am__append_12) $(am__append_14)
+EXTRA_DIST = \
+  cdilib.c \
+  make_cdilib
+
+@FC_MOD_UPPERCASE_FALSE@mo_cdi_mod = mo_cdi.$(FCMODEXT)
+@FC_MOD_UPPERCASE_TRUE@mo_cdi_mod = MO_CDI.$(FCMODEXT)
+@ENABLE_CDI_LIB_TRUE@include_HEADERS = calendar.h cdi.h cdi_datetime.h \
+@ENABLE_CDI_LIB_TRUE@	julian_date.h $(am__append_2) \
+@ENABLE_CDI_LIB_TRUE@	$(am__append_6) $(am__append_9)
+@ENABLE_CDI_LIB_TRUE@nodist_include_HEADERS = $(am__append_3)
+@ENABLE_CDI_LIB_TRUE@pkgconfigdir = $(libdir)/pkgconfig
+@ENABLE_CDI_LIB_TRUE@nodist_pkgconfig_DATA = pkgconfig/cdi.pc \
+@ENABLE_CDI_LIB_TRUE@	$(am__append_5) $(am__append_8)
+@ENABLE_CDI_LIB_TRUE@cmakedir = $(libdir)/cmake/cdi
+@ENABLE_CDI_LIB_TRUE@nodist_cmake_DATA = \
+@ENABLE_CDI_LIB_TRUE@  cmake/cdi/cdi-config-version.cmake \
+@ENABLE_CDI_LIB_TRUE@  cmake/cdi/cdi-config.cmake
+
+AM_CPPFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) \
+	$(am__append_15)
+libcdiresunpack_la_SOURCES = \
+  resource_unpack.c \
+  resource_unpack.h
+
+libcdiresunpack_la_LIBADD = libcdi.la
+make_fint_SOURCES = make_fint.c
+# the following must be passed via AM_CFLAGS, or the generic libtool recipes won't
+# be used (but a custom, non-libtool one instead)
+# make_fint_CFLAGS = -static
+make_fint_LDADD = $(LIBOBJS)
+libcdi_la_SOURCES = async_worker.c async_worker.h basetime.c \
+	basetime.h binary.c binary.h calendar.c calendar.h cdf.c cdf.h \
+	cdf_config.h cdf_filter.c cdf_filter.h cdf_int.c cdf_int.h \
+	cdf_lazy_grid.c cdf_lazy_grid.h cdf_read.c cdf_records.c \
+	cdf_util.c cdf_util.h cdf_write.c cdi.h cdi_across.c \
+	cdi_across.h cdi_att.c cdi_att.h cdi_cksum.c cdi_cksum.h \
+	cdi_datetime.c cdi_datetime.h cdi_error.c cdi_fdb.c cdi_fdb.h \
+	cdi_int.c cdi_int.h cdi_key.c cdi_key.h cdi_limits.h \
+	cdi_query.c cdi_util.c cdi_uuid.h cgribex.h cgribexlib.c \
+	cksum.c cksum.h dmemory.c dmemory.h error.c error.h exse.h \
+	extra.h extralib.c file.c file.h gaussian_latitudes.c \
+	get_num_missvals.c get_num_missvals.h grb_read.c grb_write.c \
+	gribapi.c gribapi.h gribapi_utilities.h grid.c grid.h ieg.h \
+	ieglib.c input_file.c input_file.h institution.c institution.h \
+	iterator.c iterator.h iterator_fallback.c iterator_fallback.h \
+	iterator_grib.c iterator_grib.h julian_date.c julian_date.h \
+	model.c model.h namespace.c namespace.h normalize_month.h \
+	referenceCounting.c referenceCounting.h resource_handle.c \
+	resource_handle.h serialize.c serialize.h service.h \
+	servicelib.c stream.c stream_cdf.h stream_cdf_i.c \
+	stream_cdf_o.c stream_cdf_postdef.h stream_cdf_time.c \
+	stream_cgribex.c stream_cgribex.h stream_ext.c stream_ext.h \
+	stream_grb.c stream_grb.h stream_gribapi.h stream_ieg.c \
+	stream_ieg.h stream_read.c stream_record.c stream_scan.c \
+	stream_scan.h stream_srv.c stream_srv.h stream_var.c \
+	stream_write.c subtype.c subtype.h swap.c swap.h table.c \
+	table.h tablepar.h taxis.c taxis.h tsteps.c util.c varscan.c \
+	varscan.h version.c vlist.c vlist.h vlist_var.c vlist_var.h \
+	vlist_var_key.c vlist_var_pack.c zaxis.c zaxis.h \
+	$(am__append_16) $(am__append_17)
+libcdi_f2003_la_SOURCES = mo_cdi.f90
+libcdi_f2003_la_LIBADD = libcdi.la
+libcdipio_la_SOURCES = cdipio.h pio.c pio.h pio_cdf_int.h pio_client.c \
+	pio_client.h pio_comm.c pio_comm.h pio_conf.c pio_conf.h \
+	pio_dbuffer.c pio_dbuffer.h pio_dist_grid.c pio_dist_grid.h \
+	pio_id_set.h pio_idxlist_cache.c pio_idxlist_cache.h \
+	pio_impl.h pio_interface.c pio_interface.h pio_mpi_fw_at_all.c \
+	pio_mpi_fw_at_reblock.c pio_mpi_fw_ordered.c pio_mpinonb.c \
+	pio_posixasynch.c pio_posixfpguardsendrecv.c pio_posixnonb.c \
+	pio_record_send.c pio_roles.c pio_rpc.c pio_rpc.h \
+	pio_serialize.c pio_serialize.h pio_server.c pio_server.h \
+	pio_util.c pio_util.h pio_xmap_cache.c pio_xmap_cache.h \
+	resource_unpack.c resource_unpack.h $(am__append_18) \
+	$(am__append_19)
+libcdipio_la_LIBADD = libcdi.la $(LIBRT) $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(MPI_C_LIB)
+MOSTLYCLEANFILES = make_fint $(am__append_20)
+MAINTAINERCLEANFILES = \
+  cdi.inc \
+  cdiFortran.c \
+  cdilib.c \
+  cdipio.inc \
+  cdipioFortran.c \
+  mo_cdi.f90
+
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .f90 .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+clean-checkLTLIBRARIES:
+	-test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES)
+	@list='$(check_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libcdi.la: $(libcdi_la_OBJECTS) $(libcdi_la_DEPENDENCIES) $(EXTRA_libcdi_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(LINK) $(am_libcdi_la_rpath) $(libcdi_la_OBJECTS) $(libcdi_la_LIBADD) $(LIBS)
+
+libcdi_f2003.la: $(libcdi_f2003_la_OBJECTS) $(libcdi_f2003_la_DEPENDENCIES) $(EXTRA_libcdi_f2003_la_DEPENDENCIES)
+	$(AM_V_FCLD)$(FCLINK) $(am_libcdi_f2003_la_rpath) $(libcdi_f2003_la_OBJECTS) $(libcdi_f2003_la_LIBADD) $(LIBS)
+
+libcdipio.la: $(libcdipio_la_OBJECTS) $(libcdipio_la_DEPENDENCIES) $(EXTRA_libcdipio_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(LINK) $(am_libcdipio_la_rpath) $(libcdipio_la_OBJECTS) $(libcdipio_la_LIBADD) $(LIBS)
+
+libcdiresunpack.la: $(libcdiresunpack_la_OBJECTS) $(libcdiresunpack_la_DEPENDENCIES) $(EXTRA_libcdiresunpack_la_DEPENDENCIES)
+	$(AM_V_CCLD)$(LINK) $(am_libcdiresunpack_la_rpath) $(libcdiresunpack_la_OBJECTS) $(libcdiresunpack_la_LIBADD) $(LIBS)
+
+make_fint$(EXEEXT): $(make_fint_OBJECTS) $(make_fint_DEPENDENCIES) $(EXTRA_make_fint_DEPENDENCIES)
+	@rm -f make_fint$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(make_fint_OBJECTS) $(make_fint_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_worker.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basetime.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calendar.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_filter.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_int.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_lazy_grid.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_read.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_records.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_write.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdiFortran.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_across.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_att.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_cksum.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_datetime.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_error.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_fdb.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_int.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_key.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_query.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdipioFortran.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgribexlib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dmemory.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extralib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussian_latitudes.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_num_missvals.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grb_read.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grb_write.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gribapi.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gribapi_utilities.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ieglib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input_file.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/institution.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator_fallback.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator_grib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/julian_date.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_fint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/namespace.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_cdf_int.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_client.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_comm.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_conf.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_dbuffer.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_dist_grid.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_idxlist_cache.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_interface.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_at_all.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_ordered.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpinonb.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixasynch.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixfpguardsendrecv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixnonb.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_record_send.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_roles.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_rpc.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_serialize.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_server.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_xmap_cache.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/referenceCounting.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resource_handle.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resource_unpack.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serialize.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/servicelib.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_i.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_o.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_time.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cgribex.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_ext.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_grb.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_gribapi.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_ieg.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_read.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_record.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_scan.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_srv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_var.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_write.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subtype.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/table.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taxis.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsteps.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varscan.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var_key.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var_pack.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaxis.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+.f90.o:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+.f90.obj:
+	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
+
+.f90.lo:
+	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-nodist_cmakeDATA: $(nodist_cmake_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(cmakedir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \
+	done
+
+uninstall-nodist_cmakeDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir)
+install-nodist_pkgconfigDATA: $(nodist_pkgconfig_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+	done
+
+uninstall-nodist_pkgconfigDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+install-nodist_includeHEADERS: $(nodist_include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-nodist_includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES)
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkLTLIBRARIES clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+		-rm -f $(DEPDIR)/getline.Po
+	-rm -f ./$(DEPDIR)/async_worker.Plo
+	-rm -f ./$(DEPDIR)/basetime.Plo
+	-rm -f ./$(DEPDIR)/binary.Plo
+	-rm -f ./$(DEPDIR)/calendar.Plo
+	-rm -f ./$(DEPDIR)/cdf.Plo
+	-rm -f ./$(DEPDIR)/cdf_filter.Plo
+	-rm -f ./$(DEPDIR)/cdf_int.Plo
+	-rm -f ./$(DEPDIR)/cdf_lazy_grid.Plo
+	-rm -f ./$(DEPDIR)/cdf_read.Plo
+	-rm -f ./$(DEPDIR)/cdf_records.Plo
+	-rm -f ./$(DEPDIR)/cdf_util.Plo
+	-rm -f ./$(DEPDIR)/cdf_write.Plo
+	-rm -f ./$(DEPDIR)/cdiFortran.Plo
+	-rm -f ./$(DEPDIR)/cdi_across.Plo
+	-rm -f ./$(DEPDIR)/cdi_att.Plo
+	-rm -f ./$(DEPDIR)/cdi_cksum.Plo
+	-rm -f ./$(DEPDIR)/cdi_datetime.Plo
+	-rm -f ./$(DEPDIR)/cdi_error.Plo
+	-rm -f ./$(DEPDIR)/cdi_fdb.Plo
+	-rm -f ./$(DEPDIR)/cdi_int.Plo
+	-rm -f ./$(DEPDIR)/cdi_key.Plo
+	-rm -f ./$(DEPDIR)/cdi_query.Plo
+	-rm -f ./$(DEPDIR)/cdi_util.Plo
+	-rm -f ./$(DEPDIR)/cdipioFortran.Plo
+	-rm -f ./$(DEPDIR)/cgribexlib.Plo
+	-rm -f ./$(DEPDIR)/cksum.Plo
+	-rm -f ./$(DEPDIR)/dmemory.Plo
+	-rm -f ./$(DEPDIR)/error.Plo
+	-rm -f ./$(DEPDIR)/extralib.Plo
+	-rm -f ./$(DEPDIR)/file.Plo
+	-rm -f ./$(DEPDIR)/gaussian_latitudes.Plo
+	-rm -f ./$(DEPDIR)/get_num_missvals.Plo
+	-rm -f ./$(DEPDIR)/grb_read.Plo
+	-rm -f ./$(DEPDIR)/grb_write.Plo
+	-rm -f ./$(DEPDIR)/gribapi.Plo
+	-rm -f ./$(DEPDIR)/gribapi_utilities.Plo
+	-rm -f ./$(DEPDIR)/grid.Plo
+	-rm -f ./$(DEPDIR)/ieglib.Plo
+	-rm -f ./$(DEPDIR)/input_file.Plo
+	-rm -f ./$(DEPDIR)/institution.Plo
+	-rm -f ./$(DEPDIR)/iterator.Plo
+	-rm -f ./$(DEPDIR)/iterator_fallback.Plo
+	-rm -f ./$(DEPDIR)/iterator_grib.Plo
+	-rm -f ./$(DEPDIR)/julian_date.Plo
+	-rm -f ./$(DEPDIR)/make_fint.Po
+	-rm -f ./$(DEPDIR)/model.Plo
+	-rm -f ./$(DEPDIR)/namespace.Plo
+	-rm -f ./$(DEPDIR)/pio.Plo
+	-rm -f ./$(DEPDIR)/pio_cdf_int.Plo
+	-rm -f ./$(DEPDIR)/pio_client.Plo
+	-rm -f ./$(DEPDIR)/pio_comm.Plo
+	-rm -f ./$(DEPDIR)/pio_conf.Plo
+	-rm -f ./$(DEPDIR)/pio_dbuffer.Plo
+	-rm -f ./$(DEPDIR)/pio_dist_grid.Plo
+	-rm -f ./$(DEPDIR)/pio_idxlist_cache.Plo
+	-rm -f ./$(DEPDIR)/pio_interface.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_at_all.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_ordered.Plo
+	-rm -f ./$(DEPDIR)/pio_mpinonb.Plo
+	-rm -f ./$(DEPDIR)/pio_posixasynch.Plo
+	-rm -f ./$(DEPDIR)/pio_posixfpguardsendrecv.Plo
+	-rm -f ./$(DEPDIR)/pio_posixnonb.Plo
+	-rm -f ./$(DEPDIR)/pio_record_send.Plo
+	-rm -f ./$(DEPDIR)/pio_roles.Plo
+	-rm -f ./$(DEPDIR)/pio_rpc.Plo
+	-rm -f ./$(DEPDIR)/pio_serialize.Plo
+	-rm -f ./$(DEPDIR)/pio_server.Plo
+	-rm -f ./$(DEPDIR)/pio_util.Plo
+	-rm -f ./$(DEPDIR)/pio_xmap_cache.Plo
+	-rm -f ./$(DEPDIR)/referenceCounting.Plo
+	-rm -f ./$(DEPDIR)/resource_handle.Plo
+	-rm -f ./$(DEPDIR)/resource_unpack.Plo
+	-rm -f ./$(DEPDIR)/serialize.Plo
+	-rm -f ./$(DEPDIR)/servicelib.Plo
+	-rm -f ./$(DEPDIR)/stream.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_i.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_o.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_time.Plo
+	-rm -f ./$(DEPDIR)/stream_cgribex.Plo
+	-rm -f ./$(DEPDIR)/stream_ext.Plo
+	-rm -f ./$(DEPDIR)/stream_grb.Plo
+	-rm -f ./$(DEPDIR)/stream_gribapi.Plo
+	-rm -f ./$(DEPDIR)/stream_ieg.Plo
+	-rm -f ./$(DEPDIR)/stream_read.Plo
+	-rm -f ./$(DEPDIR)/stream_record.Plo
+	-rm -f ./$(DEPDIR)/stream_scan.Plo
+	-rm -f ./$(DEPDIR)/stream_srv.Plo
+	-rm -f ./$(DEPDIR)/stream_var.Plo
+	-rm -f ./$(DEPDIR)/stream_write.Plo
+	-rm -f ./$(DEPDIR)/subtype.Plo
+	-rm -f ./$(DEPDIR)/swap.Plo
+	-rm -f ./$(DEPDIR)/table.Plo
+	-rm -f ./$(DEPDIR)/taxis.Plo
+	-rm -f ./$(DEPDIR)/tsteps.Plo
+	-rm -f ./$(DEPDIR)/util.Plo
+	-rm -f ./$(DEPDIR)/varscan.Plo
+	-rm -f ./$(DEPDIR)/version.Plo
+	-rm -f ./$(DEPDIR)/vlist.Plo
+	-rm -f ./$(DEPDIR)/vlist_var.Plo
+	-rm -f ./$(DEPDIR)/vlist_var_key.Plo
+	-rm -f ./$(DEPDIR)/vlist_var_pack.Plo
+	-rm -f ./$(DEPDIR)/zaxis.Plo
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+examples: examples-am
+
+examples-am: examples-local
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS install-nodist_cmakeDATA \
+	install-nodist_includeHEADERS install-nodist_pkgconfigDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f $(DEPDIR)/getline.Po
+	-rm -f ./$(DEPDIR)/async_worker.Plo
+	-rm -f ./$(DEPDIR)/basetime.Plo
+	-rm -f ./$(DEPDIR)/binary.Plo
+	-rm -f ./$(DEPDIR)/calendar.Plo
+	-rm -f ./$(DEPDIR)/cdf.Plo
+	-rm -f ./$(DEPDIR)/cdf_filter.Plo
+	-rm -f ./$(DEPDIR)/cdf_int.Plo
+	-rm -f ./$(DEPDIR)/cdf_lazy_grid.Plo
+	-rm -f ./$(DEPDIR)/cdf_read.Plo
+	-rm -f ./$(DEPDIR)/cdf_records.Plo
+	-rm -f ./$(DEPDIR)/cdf_util.Plo
+	-rm -f ./$(DEPDIR)/cdf_write.Plo
+	-rm -f ./$(DEPDIR)/cdiFortran.Plo
+	-rm -f ./$(DEPDIR)/cdi_across.Plo
+	-rm -f ./$(DEPDIR)/cdi_att.Plo
+	-rm -f ./$(DEPDIR)/cdi_cksum.Plo
+	-rm -f ./$(DEPDIR)/cdi_datetime.Plo
+	-rm -f ./$(DEPDIR)/cdi_error.Plo
+	-rm -f ./$(DEPDIR)/cdi_fdb.Plo
+	-rm -f ./$(DEPDIR)/cdi_int.Plo
+	-rm -f ./$(DEPDIR)/cdi_key.Plo
+	-rm -f ./$(DEPDIR)/cdi_query.Plo
+	-rm -f ./$(DEPDIR)/cdi_util.Plo
+	-rm -f ./$(DEPDIR)/cdipioFortran.Plo
+	-rm -f ./$(DEPDIR)/cgribexlib.Plo
+	-rm -f ./$(DEPDIR)/cksum.Plo
+	-rm -f ./$(DEPDIR)/dmemory.Plo
+	-rm -f ./$(DEPDIR)/error.Plo
+	-rm -f ./$(DEPDIR)/extralib.Plo
+	-rm -f ./$(DEPDIR)/file.Plo
+	-rm -f ./$(DEPDIR)/gaussian_latitudes.Plo
+	-rm -f ./$(DEPDIR)/get_num_missvals.Plo
+	-rm -f ./$(DEPDIR)/grb_read.Plo
+	-rm -f ./$(DEPDIR)/grb_write.Plo
+	-rm -f ./$(DEPDIR)/gribapi.Plo
+	-rm -f ./$(DEPDIR)/gribapi_utilities.Plo
+	-rm -f ./$(DEPDIR)/grid.Plo
+	-rm -f ./$(DEPDIR)/ieglib.Plo
+	-rm -f ./$(DEPDIR)/input_file.Plo
+	-rm -f ./$(DEPDIR)/institution.Plo
+	-rm -f ./$(DEPDIR)/iterator.Plo
+	-rm -f ./$(DEPDIR)/iterator_fallback.Plo
+	-rm -f ./$(DEPDIR)/iterator_grib.Plo
+	-rm -f ./$(DEPDIR)/julian_date.Plo
+	-rm -f ./$(DEPDIR)/make_fint.Po
+	-rm -f ./$(DEPDIR)/model.Plo
+	-rm -f ./$(DEPDIR)/namespace.Plo
+	-rm -f ./$(DEPDIR)/pio.Plo
+	-rm -f ./$(DEPDIR)/pio_cdf_int.Plo
+	-rm -f ./$(DEPDIR)/pio_client.Plo
+	-rm -f ./$(DEPDIR)/pio_comm.Plo
+	-rm -f ./$(DEPDIR)/pio_conf.Plo
+	-rm -f ./$(DEPDIR)/pio_dbuffer.Plo
+	-rm -f ./$(DEPDIR)/pio_dist_grid.Plo
+	-rm -f ./$(DEPDIR)/pio_idxlist_cache.Plo
+	-rm -f ./$(DEPDIR)/pio_interface.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_at_all.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo
+	-rm -f ./$(DEPDIR)/pio_mpi_fw_ordered.Plo
+	-rm -f ./$(DEPDIR)/pio_mpinonb.Plo
+	-rm -f ./$(DEPDIR)/pio_posixasynch.Plo
+	-rm -f ./$(DEPDIR)/pio_posixfpguardsendrecv.Plo
+	-rm -f ./$(DEPDIR)/pio_posixnonb.Plo
+	-rm -f ./$(DEPDIR)/pio_record_send.Plo
+	-rm -f ./$(DEPDIR)/pio_roles.Plo
+	-rm -f ./$(DEPDIR)/pio_rpc.Plo
+	-rm -f ./$(DEPDIR)/pio_serialize.Plo
+	-rm -f ./$(DEPDIR)/pio_server.Plo
+	-rm -f ./$(DEPDIR)/pio_util.Plo
+	-rm -f ./$(DEPDIR)/pio_xmap_cache.Plo
+	-rm -f ./$(DEPDIR)/referenceCounting.Plo
+	-rm -f ./$(DEPDIR)/resource_handle.Plo
+	-rm -f ./$(DEPDIR)/resource_unpack.Plo
+	-rm -f ./$(DEPDIR)/serialize.Plo
+	-rm -f ./$(DEPDIR)/servicelib.Plo
+	-rm -f ./$(DEPDIR)/stream.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_i.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_o.Plo
+	-rm -f ./$(DEPDIR)/stream_cdf_time.Plo
+	-rm -f ./$(DEPDIR)/stream_cgribex.Plo
+	-rm -f ./$(DEPDIR)/stream_ext.Plo
+	-rm -f ./$(DEPDIR)/stream_grb.Plo
+	-rm -f ./$(DEPDIR)/stream_gribapi.Plo
+	-rm -f ./$(DEPDIR)/stream_ieg.Plo
+	-rm -f ./$(DEPDIR)/stream_read.Plo
+	-rm -f ./$(DEPDIR)/stream_record.Plo
+	-rm -f ./$(DEPDIR)/stream_scan.Plo
+	-rm -f ./$(DEPDIR)/stream_srv.Plo
+	-rm -f ./$(DEPDIR)/stream_var.Plo
+	-rm -f ./$(DEPDIR)/stream_write.Plo
+	-rm -f ./$(DEPDIR)/subtype.Plo
+	-rm -f ./$(DEPDIR)/swap.Plo
+	-rm -f ./$(DEPDIR)/table.Plo
+	-rm -f ./$(DEPDIR)/taxis.Plo
+	-rm -f ./$(DEPDIR)/tsteps.Plo
+	-rm -f ./$(DEPDIR)/util.Plo
+	-rm -f ./$(DEPDIR)/varscan.Plo
+	-rm -f ./$(DEPDIR)/version.Plo
+	-rm -f ./$(DEPDIR)/vlist.Plo
+	-rm -f ./$(DEPDIR)/vlist_var.Plo
+	-rm -f ./$(DEPDIR)/vlist_var_key.Plo
+	-rm -f ./$(DEPDIR)/vlist_var_pack.Plo
+	-rm -f ./$(DEPDIR)/zaxis.Plo
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
+	uninstall-nodist_cmakeDATA uninstall-nodist_includeHEADERS \
+	uninstall-nodist_pkgconfigDATA
+
+.MAKE: all check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-checkLTLIBRARIES clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distdir dvi \
+	dvi-am examples-am examples-local html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-includeHEADERS install-info \
+	install-info-am install-libLTLIBRARIES install-man \
+	install-nodist_cmakeDATA install-nodist_includeHEADERS \
+	install-nodist_pkgconfigDATA install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-includeHEADERS \
+	uninstall-libLTLIBRARIES uninstall-nodist_cmakeDATA \
+	uninstall-nodist_includeHEADERS uninstall-nodist_pkgconfigDATA
+
+.PRECIOUS: Makefile
+
+
+@MAINTAINER_MODE_TRUE@cdi.inc: cdi.h make_fint.c
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $<
+@MAINTAINER_MODE_TRUE@cdiFortran.c: cdi.inc
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || rm -f $<
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $<
+
+@MAINTAINER_MODE_TRUE@cdipio.inc: cdipio.h make_fint.c cdi.inc
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $<
+@MAINTAINER_MODE_TRUE@cdipioFortran.c: cdipio.inc
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || rm -f $<
+@MAINTAINER_MODE_TRUE@	$(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $<
+
+@MAINTAINER_MODE_TRUE@mo_cdi.f90: cdi.h $(top_srcdir)/interfaces/f2003/bindGen.rb
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)$(RUBY) $(top_srcdir)/interfaces/f2003/bindGen.rb $< $@
+
+@MAINTAINER_MODE_TRUE@cdilib.c: $(libcdi_la_SOURCES) $(srcdir)/make_cdilib
+@MAINTAINER_MODE_TRUE@	$(AM_V_GEN)CPP='$(CPP)' $(srcdir)/make_cdilib $(srcdir)
+@MAINTAINER_MODE_FALSE@cdiFortran.c cdi.inc cdipioFortran.c cdipio.inc mo_cdi.f90 cdilib.c:
+@MAINTAINER_MODE_FALSE@	@:;{ \
+@MAINTAINER_MODE_FALSE@	  echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \
+@MAINTAINER_MODE_FALSE@          echo "       re-configure with the '--enable-maintainer-mode' option"; \
+@MAINTAINER_MODE_FALSE@	} >&2; exit 1
+
+$(mo_cdi_mod): mo_cdi.lo
+	$(AM_V_at)test -f $@ || rm -f $<
+	$(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $<
+
+cmake/cdi/cdi-config.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config.cmake.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+cmake/cdi/cdi-config-version.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config-version.cmake.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+pkgconfig/cdi.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+pkgconfig/cdipio.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdipio.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+pkgconfig/cdi_f2003.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi_f2003.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/src/cdi.inc b/src/cdi.inc
new file mode 100644
index 000000000..15772e59f
--- /dev/null
+++ b/src/cdi.inc
@@ -0,0 +1,2626 @@
+! This file was automatically generated, don't edit!
+!
+! Fortran interface for CDI library version 2.4.3
+!
+! Author:
+! -------
+! Uwe Schulzweida, MPI-MET, Hamburg,   September 2024
+!
+
+!
+!  Start of fortran interface for the following routines (make_fint.c)
+!
+      INTEGER    CDI_MAX_NAME
+      PARAMETER (CDI_MAX_NAME           = 256)
+      INTEGER    CDI_UNDEFID
+      PARAMETER (CDI_UNDEFID            = -1)
+      INTEGER    CDI_GLOBAL
+      PARAMETER (CDI_GLOBAL             = -1)
+      INTEGER    CDI_XAXIS
+      PARAMETER (CDI_XAXIS              =  1)
+      INTEGER    CDI_YAXIS
+      PARAMETER (CDI_YAXIS              =  2)
+!
+!  Byte order
+!
+      INTEGER    CDI_BIGENDIAN
+      PARAMETER (CDI_BIGENDIAN          =  0)
+      INTEGER    CDI_LITTLEENDIAN
+      PARAMETER (CDI_LITTLEENDIAN       =  1)
+      INTEGER    CDI_PDPENDIAN
+      PARAMETER (CDI_PDPENDIAN          =  2)
+      INTEGER    CDI_REAL
+      PARAMETER (CDI_REAL               =  1)
+      INTEGER    CDI_COMP
+      PARAMETER (CDI_COMP               =  2)
+      INTEGER    CDI_BOTH
+      PARAMETER (CDI_BOTH               =  3)
+!
+!  Error identifier
+!
+      INTEGER    CDI_NOERR
+      PARAMETER (CDI_NOERR              =  0)
+      INTEGER    CDI_EEOF
+      PARAMETER (CDI_EEOF               = -1)
+      INTEGER    CDI_ETMOF
+      PARAMETER (CDI_ETMOF              = -9)
+      INTEGER    CDI_ESYSTEM
+      PARAMETER (CDI_ESYSTEM            = -10)
+      INTEGER    CDI_EINVAL
+      PARAMETER (CDI_EINVAL             = -20)
+      INTEGER    CDI_EISDIR
+      PARAMETER (CDI_EISDIR             = -21)
+      INTEGER    CDI_EISEMPTY
+      PARAMETER (CDI_EISEMPTY           = -22)
+      INTEGER    CDI_EUFTYPE
+      PARAMETER (CDI_EUFTYPE            = -23)
+      INTEGER    CDI_ELIBNAVAIL
+      PARAMETER (CDI_ELIBNAVAIL         = -24)
+      INTEGER    CDI_EUFSTRUCT
+      PARAMETER (CDI_EUFSTRUCT          = -25)
+      INTEGER    CDI_EUNC4
+      PARAMETER (CDI_EUNC4              = -26)
+      INTEGER    CDI_EDIMSIZE
+      PARAMETER (CDI_EDIMSIZE           = -27)
+      INTEGER    CDI_EQENF
+      PARAMETER (CDI_EQENF              = -50)
+      INTEGER    CDI_EQNAVAIL
+      PARAMETER (CDI_EQNAVAIL           = -51)
+      INTEGER    CDI_ELIMIT
+      PARAMETER (CDI_ELIMIT             = -99)
+!
+!  File types
+!
+      INTEGER    CDI_FILETYPE_GRB
+      PARAMETER (CDI_FILETYPE_GRB       =  1)
+      INTEGER    CDI_FILETYPE_GRB2
+      PARAMETER (CDI_FILETYPE_GRB2      =  2)
+      INTEGER    CDI_FILETYPE_NC
+      PARAMETER (CDI_FILETYPE_NC        =  3)
+      INTEGER    CDI_FILETYPE_NC2
+      PARAMETER (CDI_FILETYPE_NC2       =  4)
+      INTEGER    CDI_FILETYPE_NC4
+      PARAMETER (CDI_FILETYPE_NC4       =  5)
+      INTEGER    CDI_FILETYPE_NC4C
+      PARAMETER (CDI_FILETYPE_NC4C      =  6)
+      INTEGER    CDI_FILETYPE_NC5
+      PARAMETER (CDI_FILETYPE_NC5       =  7)
+      INTEGER    CDI_FILETYPE_SRV
+      PARAMETER (CDI_FILETYPE_SRV       =  8)
+      INTEGER    CDI_FILETYPE_EXT
+      PARAMETER (CDI_FILETYPE_EXT       =  9)
+      INTEGER    CDI_FILETYPE_IEG
+      PARAMETER (CDI_FILETYPE_IEG       = 10)
+      INTEGER    CDI_FILETYPE_NCZARR
+      PARAMETER (CDI_FILETYPE_NCZARR    = 11)
+!
+!  Compatibility defines for release 1.8.3 (obsolete defines)
+!
+      INTEGER    FILETYPE_GRB
+      PARAMETER (FILETYPE_GRB           =  1)
+      INTEGER    FILETYPE_GRB2
+      PARAMETER (FILETYPE_GRB2          =  2)
+      INTEGER    FILETYPE_NC
+      PARAMETER (FILETYPE_NC            =  3)
+      INTEGER    FILETYPE_NC2
+      PARAMETER (FILETYPE_NC2           =  4)
+      INTEGER    FILETYPE_NC4
+      PARAMETER (FILETYPE_NC4           =  5)
+!
+!  Protocols (in filename/URI)
+!
+      INTEGER    CDI_PROTOCOL_OTHER
+      PARAMETER (CDI_PROTOCOL_OTHER     =  0)
+      INTEGER    CDI_PROTOCOL_FILE
+      PARAMETER (CDI_PROTOCOL_FILE      =  1)
+      INTEGER    CDI_PROTOCOL_FDB
+      PARAMETER (CDI_PROTOCOL_FDB       =  2)
+      INTEGER    CDI_PROTOCOL_ACROSS
+      PARAMETER (CDI_PROTOCOL_ACROSS    =  3)
+!
+!  Compress types
+!
+      INTEGER    CDI_COMPRESS_NONE
+      PARAMETER (CDI_COMPRESS_NONE      =  0)
+      INTEGER    CDI_COMPRESS_SZIP
+      PARAMETER (CDI_COMPRESS_SZIP      =  1)
+      INTEGER    CDI_COMPRESS_AEC
+      PARAMETER (CDI_COMPRESS_AEC       =  2)
+      INTEGER    CDI_COMPRESS_ZIP
+      PARAMETER (CDI_COMPRESS_ZIP       =  3)
+      INTEGER    CDI_COMPRESS_JPEG
+      PARAMETER (CDI_COMPRESS_JPEG      =  4)
+      INTEGER    CDI_COMPRESS_FILTER
+      PARAMETER (CDI_COMPRESS_FILTER    =  5)
+!
+!  external data types
+!
+!
+!  Compatibility defines for release 1.8.3 (obsolete defines)
+!
+      INTEGER    DATATYPE_PACK16
+      PARAMETER (DATATYPE_PACK16        = 16)
+      INTEGER    DATATYPE_PACK24
+      PARAMETER (DATATYPE_PACK24        = 24)
+      INTEGER    DATATYPE_FLT32
+      PARAMETER (DATATYPE_FLT32         = 132)
+      INTEGER    DATATYPE_FLT64
+      PARAMETER (DATATYPE_FLT64         = 164)
+      INTEGER    DATATYPE_INT32
+      PARAMETER (DATATYPE_INT32         = 232)
+      INTEGER    DATATYPE_INT
+      PARAMETER (DATATYPE_INT           = 251)
+      INTEGER    CDI_DATATYPE_PACK
+      PARAMETER (CDI_DATATYPE_PACK      =  0)
+      INTEGER    CDI_DATATYPE_PACK1
+      PARAMETER (CDI_DATATYPE_PACK1     =  1)
+      INTEGER    CDI_DATATYPE_PACK2
+      PARAMETER (CDI_DATATYPE_PACK2     =  2)
+      INTEGER    CDI_DATATYPE_PACK3
+      PARAMETER (CDI_DATATYPE_PACK3     =  3)
+      INTEGER    CDI_DATATYPE_PACK4
+      PARAMETER (CDI_DATATYPE_PACK4     =  4)
+      INTEGER    CDI_DATATYPE_PACK5
+      PARAMETER (CDI_DATATYPE_PACK5     =  5)
+      INTEGER    CDI_DATATYPE_PACK6
+      PARAMETER (CDI_DATATYPE_PACK6     =  6)
+      INTEGER    CDI_DATATYPE_PACK7
+      PARAMETER (CDI_DATATYPE_PACK7     =  7)
+      INTEGER    CDI_DATATYPE_PACK8
+      PARAMETER (CDI_DATATYPE_PACK8     =  8)
+      INTEGER    CDI_DATATYPE_PACK9
+      PARAMETER (CDI_DATATYPE_PACK9     =  9)
+      INTEGER    CDI_DATATYPE_PACK10
+      PARAMETER (CDI_DATATYPE_PACK10    = 10)
+      INTEGER    CDI_DATATYPE_PACK11
+      PARAMETER (CDI_DATATYPE_PACK11    = 11)
+      INTEGER    CDI_DATATYPE_PACK12
+      PARAMETER (CDI_DATATYPE_PACK12    = 12)
+      INTEGER    CDI_DATATYPE_PACK13
+      PARAMETER (CDI_DATATYPE_PACK13    = 13)
+      INTEGER    CDI_DATATYPE_PACK14
+      PARAMETER (CDI_DATATYPE_PACK14    = 14)
+      INTEGER    CDI_DATATYPE_PACK15
+      PARAMETER (CDI_DATATYPE_PACK15    = 15)
+      INTEGER    CDI_DATATYPE_PACK16
+      PARAMETER (CDI_DATATYPE_PACK16    = 16)
+      INTEGER    CDI_DATATYPE_PACK17
+      PARAMETER (CDI_DATATYPE_PACK17    = 17)
+      INTEGER    CDI_DATATYPE_PACK18
+      PARAMETER (CDI_DATATYPE_PACK18    = 18)
+      INTEGER    CDI_DATATYPE_PACK19
+      PARAMETER (CDI_DATATYPE_PACK19    = 19)
+      INTEGER    CDI_DATATYPE_PACK20
+      PARAMETER (CDI_DATATYPE_PACK20    = 20)
+      INTEGER    CDI_DATATYPE_PACK21
+      PARAMETER (CDI_DATATYPE_PACK21    = 21)
+      INTEGER    CDI_DATATYPE_PACK22
+      PARAMETER (CDI_DATATYPE_PACK22    = 22)
+      INTEGER    CDI_DATATYPE_PACK23
+      PARAMETER (CDI_DATATYPE_PACK23    = 23)
+      INTEGER    CDI_DATATYPE_PACK24
+      PARAMETER (CDI_DATATYPE_PACK24    = 24)
+      INTEGER    CDI_DATATYPE_PACK25
+      PARAMETER (CDI_DATATYPE_PACK25    = 25)
+      INTEGER    CDI_DATATYPE_PACK26
+      PARAMETER (CDI_DATATYPE_PACK26    = 26)
+      INTEGER    CDI_DATATYPE_PACK27
+      PARAMETER (CDI_DATATYPE_PACK27    = 27)
+      INTEGER    CDI_DATATYPE_PACK28
+      PARAMETER (CDI_DATATYPE_PACK28    = 28)
+      INTEGER    CDI_DATATYPE_PACK29
+      PARAMETER (CDI_DATATYPE_PACK29    = 29)
+      INTEGER    CDI_DATATYPE_PACK30
+      PARAMETER (CDI_DATATYPE_PACK30    = 30)
+      INTEGER    CDI_DATATYPE_PACK31
+      PARAMETER (CDI_DATATYPE_PACK31    = 31)
+      INTEGER    CDI_DATATYPE_PACK32
+      PARAMETER (CDI_DATATYPE_PACK32    = 32)
+      INTEGER    CDI_DATATYPE_CPX32
+      PARAMETER (CDI_DATATYPE_CPX32     = 64)
+      INTEGER    CDI_DATATYPE_CPX64
+      PARAMETER (CDI_DATATYPE_CPX64     = 128)
+      INTEGER    CDI_DATATYPE_FLT32
+      PARAMETER (CDI_DATATYPE_FLT32     = 132)
+      INTEGER    CDI_DATATYPE_FLT64
+      PARAMETER (CDI_DATATYPE_FLT64     = 164)
+      INTEGER    CDI_DATATYPE_INT8
+      PARAMETER (CDI_DATATYPE_INT8      = 208)
+      INTEGER    CDI_DATATYPE_INT16
+      PARAMETER (CDI_DATATYPE_INT16     = 216)
+      INTEGER    CDI_DATATYPE_INT32
+      PARAMETER (CDI_DATATYPE_INT32     = 232)
+      INTEGER    CDI_DATATYPE_UINT8
+      PARAMETER (CDI_DATATYPE_UINT8     = 308)
+      INTEGER    CDI_DATATYPE_UINT16
+      PARAMETER (CDI_DATATYPE_UINT16    = 316)
+      INTEGER    CDI_DATATYPE_UINT32
+      PARAMETER (CDI_DATATYPE_UINT32    = 332)
+!
+!  internal data types
+!
+      INTEGER    CDI_DATATYPE_INT
+      PARAMETER (CDI_DATATYPE_INT       = 251)
+      INTEGER    CDI_DATATYPE_FLT
+      PARAMETER (CDI_DATATYPE_FLT       = 252)
+      INTEGER    CDI_DATATYPE_TXT
+      PARAMETER (CDI_DATATYPE_TXT       = 253)
+      INTEGER    CDI_DATATYPE_CPX
+      PARAMETER (CDI_DATATYPE_CPX       = 254)
+      INTEGER    CDI_DATATYPE_UCHAR
+      PARAMETER (CDI_DATATYPE_UCHAR     = 255)
+      INTEGER    CDI_DATATYPE_LONG
+      PARAMETER (CDI_DATATYPE_LONG      = 256)
+      INTEGER    CDI_DATATYPE_UINT
+      PARAMETER (CDI_DATATYPE_UINT      = 257)
+!
+!  Chunk types
+!
+      INTEGER    CDI_CHUNK_AUTO
+      PARAMETER (CDI_CHUNK_AUTO         =  1)
+      INTEGER    CDI_CHUNK_GRID
+      PARAMETER (CDI_CHUNK_GRID         =  2)
+      INTEGER    CDI_CHUNK_LINES
+      PARAMETER (CDI_CHUNK_LINES        =  3)
+!
+!  GRID types
+!
+      INTEGER    GRID_GENERIC
+      PARAMETER (GRID_GENERIC           =  1)
+      INTEGER    GRID_GAUSSIAN
+      PARAMETER (GRID_GAUSSIAN          =  2)
+      INTEGER    GRID_GAUSSIAN_REDUCED
+      PARAMETER (GRID_GAUSSIAN_REDUCED  =  3)
+      INTEGER    GRID_LONLAT
+      PARAMETER (GRID_LONLAT            =  4)
+      INTEGER    GRID_SPECTRAL
+      PARAMETER (GRID_SPECTRAL          =  5)
+      INTEGER    GRID_FOURIER
+      PARAMETER (GRID_FOURIER           =  6)
+      INTEGER    GRID_GME
+      PARAMETER (GRID_GME               =  7)
+      INTEGER    GRID_TRAJECTORY
+      PARAMETER (GRID_TRAJECTORY        =  8)
+      INTEGER    GRID_UNSTRUCTURED
+      PARAMETER (GRID_UNSTRUCTURED      =  9)
+      INTEGER    GRID_CURVILINEAR
+      PARAMETER (GRID_CURVILINEAR       = 10)
+      INTEGER    GRID_PROJECTION
+      PARAMETER (GRID_PROJECTION        = 12)
+      INTEGER    GRID_CHARXY
+      PARAMETER (GRID_CHARXY            = 13)
+      INTEGER    CDI_PROJ_RLL
+      PARAMETER (CDI_PROJ_RLL           = 21)
+      INTEGER    CDI_PROJ_LCC
+      PARAMETER (CDI_PROJ_LCC           = 22)
+      INTEGER    CDI_PROJ_LAEA
+      PARAMETER (CDI_PROJ_LAEA          = 23)
+      INTEGER    CDI_PROJ_SINU
+      PARAMETER (CDI_PROJ_SINU          = 24)
+      INTEGER    CDI_PROJ_STERE
+      PARAMETER (CDI_PROJ_STERE         = 25)
+      INTEGER    CDI_PROJ_HEALPIX
+      PARAMETER (CDI_PROJ_HEALPIX       = 26)
+!
+!  ZAXIS types
+!
+      INTEGER    ZAXIS_SURFACE
+      PARAMETER (ZAXIS_SURFACE          =  0)
+      INTEGER    ZAXIS_GENERIC
+      PARAMETER (ZAXIS_GENERIC          =  1)
+      INTEGER    ZAXIS_HYBRID
+      PARAMETER (ZAXIS_HYBRID           =  2)
+      INTEGER    ZAXIS_HYBRID_HALF
+      PARAMETER (ZAXIS_HYBRID_HALF      =  3)
+      INTEGER    ZAXIS_PRESSURE
+      PARAMETER (ZAXIS_PRESSURE         =  4)
+      INTEGER    ZAXIS_HEIGHT
+      PARAMETER (ZAXIS_HEIGHT           =  5)
+      INTEGER    ZAXIS_DEPTH_BELOW_SEA
+      PARAMETER (ZAXIS_DEPTH_BELOW_SEA  =  6)
+      INTEGER    ZAXIS_DEPTH_BELOW_LAND
+      PARAMETER (ZAXIS_DEPTH_BELOW_LAND =  7)
+      INTEGER    ZAXIS_ISENTROPIC
+      PARAMETER (ZAXIS_ISENTROPIC       =  8)
+      INTEGER    ZAXIS_TRAJECTORY
+      PARAMETER (ZAXIS_TRAJECTORY       =  9)
+      INTEGER    ZAXIS_ALTITUDE
+      PARAMETER (ZAXIS_ALTITUDE         = 10)
+      INTEGER    ZAXIS_SIGMA
+      PARAMETER (ZAXIS_SIGMA            = 11)
+      INTEGER    ZAXIS_MEANSEA
+      PARAMETER (ZAXIS_MEANSEA          = 12)
+      INTEGER    ZAXIS_TOA
+      PARAMETER (ZAXIS_TOA              = 13)
+      INTEGER    ZAXIS_SEA_BOTTOM
+      PARAMETER (ZAXIS_SEA_BOTTOM       = 14)
+      INTEGER    ZAXIS_ATMOSPHERE
+      PARAMETER (ZAXIS_ATMOSPHERE       = 15)
+      INTEGER    ZAXIS_CLOUD_BASE
+      PARAMETER (ZAXIS_CLOUD_BASE       = 16)
+      INTEGER    ZAXIS_CLOUD_TOP
+      PARAMETER (ZAXIS_CLOUD_TOP        = 17)
+      INTEGER    ZAXIS_ISOTHERM_ZERO
+      PARAMETER (ZAXIS_ISOTHERM_ZERO    = 18)
+      INTEGER    ZAXIS_SNOW
+      PARAMETER (ZAXIS_SNOW             = 19)
+      INTEGER    ZAXIS_LAKE_BOTTOM
+      PARAMETER (ZAXIS_LAKE_BOTTOM      = 20)
+      INTEGER    ZAXIS_SEDIMENT_BOTTOM
+      PARAMETER (ZAXIS_SEDIMENT_BOTTOM  = 21)
+      INTEGER    ZAXIS_SEDIMENT_BOTTOM_TA
+      PARAMETER (ZAXIS_SEDIMENT_BOTTOM_TA = 22)
+      INTEGER    ZAXIS_SEDIMENT_BOTTOM_TW
+      PARAMETER (ZAXIS_SEDIMENT_BOTTOM_TW = 23)
+      INTEGER    ZAXIS_MIX_LAYER
+      PARAMETER (ZAXIS_MIX_LAYER        = 24)
+      INTEGER    ZAXIS_REFERENCE
+      PARAMETER (ZAXIS_REFERENCE        = 25)
+      INTEGER    ZAXIS_CHAR
+      PARAMETER (ZAXIS_CHAR             = 26)
+      INTEGER    ZAXIS_TROPOPAUSE
+      PARAMETER (ZAXIS_TROPOPAUSE       = 27)
+!
+!  SUBTYPE types
+!
+      INTEGER    MAX_KV_PAIRS_MATCH
+      PARAMETER (MAX_KV_PAIRS_MATCH     = 10)
+!
+!  Data structure defining a key-value search, possibly with multiple
+!  key-value pairs in combination.
+!  
+!  Currently, only multiple pairs combined by AND are supported.
+!
+!
+!  TIME types
+!
+      INTEGER    TIME_CONSTANT
+      PARAMETER (TIME_CONSTANT          =  0)
+      INTEGER    TIME_VARYING
+      PARAMETER (TIME_VARYING           =  1)
+      INTEGER    TIME_VARIABLE
+      PARAMETER (TIME_VARIABLE          =  1)
+!
+!  TSTEP types
+!
+      INTEGER    TSTEP_CONSTANT
+      PARAMETER (TSTEP_CONSTANT         =  0)
+      INTEGER    TSTEP_INSTANT
+      PARAMETER (TSTEP_INSTANT          =  1)
+      INTEGER    TSTEP_AVG
+      PARAMETER (TSTEP_AVG              =  2)
+      INTEGER    TSTEP_ACCUM
+      PARAMETER (TSTEP_ACCUM            =  3)
+      INTEGER    TSTEP_MAX
+      PARAMETER (TSTEP_MAX              =  4)
+      INTEGER    TSTEP_MIN
+      PARAMETER (TSTEP_MIN              =  5)
+      INTEGER    TSTEP_DIFF
+      PARAMETER (TSTEP_DIFF             =  6)
+      INTEGER    TSTEP_RMS
+      PARAMETER (TSTEP_RMS              =  7)
+      INTEGER    TSTEP_SD
+      PARAMETER (TSTEP_SD               =  8)
+      INTEGER    TSTEP_COV
+      PARAMETER (TSTEP_COV              =  9)
+      INTEGER    TSTEP_RATIO
+      PARAMETER (TSTEP_RATIO            = 10)
+      INTEGER    TSTEP_SUM
+      PARAMETER (TSTEP_SUM              = 11)
+      INTEGER    TSTEP_RANGE
+      PARAMETER (TSTEP_RANGE            = 12)
+      INTEGER    TSTEP_INSTANT2
+      PARAMETER (TSTEP_INSTANT2         = 13)
+      INTEGER    TSTEP_INSTANT3
+      PARAMETER (TSTEP_INSTANT3         = 14)
+!
+!  TAXIS types
+!
+      INTEGER    TAXIS_ABSOLUTE
+      PARAMETER (TAXIS_ABSOLUTE         =  1)
+      INTEGER    TAXIS_RELATIVE
+      PARAMETER (TAXIS_RELATIVE         =  2)
+      INTEGER    TAXIS_FORECAST
+      PARAMETER (TAXIS_FORECAST         =  3)
+!
+!  TUNIT types
+!
+      INTEGER    TUNIT_SECOND
+      PARAMETER (TUNIT_SECOND           =  1)
+      INTEGER    TUNIT_MINUTE
+      PARAMETER (TUNIT_MINUTE           =  2)
+      INTEGER    TUNIT_QUARTER
+      PARAMETER (TUNIT_QUARTER          =  3)
+      INTEGER    TUNIT_30MINUTES
+      PARAMETER (TUNIT_30MINUTES        =  4)
+      INTEGER    TUNIT_HOUR
+      PARAMETER (TUNIT_HOUR             =  5)
+      INTEGER    TUNIT_3HOURS
+      PARAMETER (TUNIT_3HOURS           =  6)
+      INTEGER    TUNIT_6HOURS
+      PARAMETER (TUNIT_6HOURS           =  7)
+      INTEGER    TUNIT_12HOURS
+      PARAMETER (TUNIT_12HOURS          =  8)
+      INTEGER    TUNIT_DAY
+      PARAMETER (TUNIT_DAY              =  9)
+      INTEGER    TUNIT_MONTH
+      PARAMETER (TUNIT_MONTH            = 10)
+      INTEGER    TUNIT_YEAR
+      PARAMETER (TUNIT_YEAR             = 11)
+!
+!  CALENDAR types
+!
+      INTEGER    CALENDAR_STANDARD
+      PARAMETER (CALENDAR_STANDARD      =  0)
+      INTEGER    CALENDAR_GREGORIAN
+      PARAMETER (CALENDAR_GREGORIAN     =  1)
+      INTEGER    CALENDAR_PROLEPTIC
+      PARAMETER (CALENDAR_PROLEPTIC     =  2)
+      INTEGER    CALENDAR_360DAYS
+      PARAMETER (CALENDAR_360DAYS       =  3)
+      INTEGER    CALENDAR_365DAYS
+      PARAMETER (CALENDAR_365DAYS       =  4)
+      INTEGER    CALENDAR_366DAYS
+      PARAMETER (CALENDAR_366DAYS       =  5)
+      INTEGER    CALENDAR_NONE
+      PARAMETER (CALENDAR_NONE          =  6)
+!
+!  number of unsigned char needed to store UUID
+!
+      INTEGER    CDI_UUID_SIZE
+      PARAMETER (CDI_UUID_SIZE          = 16)
+!
+!  Structs that are used to return data to the user
+!
+!
+!  Opaque types
+!
+!
+!  CDI control routines
+!
+!                     cdiReset
+      EXTERNAL        cdiReset
+
+      CHARACTER(80)   cdiStringError
+!                                    (INTEGER         cdiErrno)
+      EXTERNAL        cdiStringError
+
+!                     cdiDebug
+!                                    (INTEGER         debug)
+      EXTERNAL        cdiDebug
+
+      CHARACTER(80)   cdiLibraryVersion
+      EXTERNAL        cdiLibraryVersion
+
+!                     cdiPrintVersion
+      EXTERNAL        cdiPrintVersion
+
+      INTEGER         cdiHaveFiletype
+!                                    (INTEGER         filetype)
+      EXTERNAL        cdiHaveFiletype
+
+!                     cdiDefMissval
+!                                    (DOUBLEPRECISION missval)
+      EXTERNAL        cdiDefMissval
+
+      DOUBLEPRECISION cdiInqMissval
+      EXTERNAL        cdiInqMissval
+
+!                     cdiDefGlobal
+!                                    (CHARACTER*(*)   string,
+!                                     INTEGER         val)
+      EXTERNAL        cdiDefGlobal
+
+      INTEGER         namespaceNew
+      EXTERNAL        namespaceNew
+
+!                     namespaceSetActive
+!                                    (INTEGER         namespaceID)
+      EXTERNAL        namespaceSetActive
+
+      INTEGER         namespaceGetActive
+      EXTERNAL        namespaceGetActive
+
+!                     namespaceDelete
+!                                    (INTEGER         namespaceID)
+      EXTERNAL        namespaceDelete
+
+!
+!  CDI converter routines
+!
+!
+!  parameter
+!
+!                     cdiParamToString
+!                                    (INTEGER         param,
+!                                     CHARACTER*(*)   paramstr,
+!                                     INTEGER         maxlen)
+      EXTERNAL        cdiParamToString
+
+!                     cdiDecodeParam
+!                                    (INTEGER         param,
+!                                     INTEGER         pnum,
+!                                     INTEGER         pcat,
+!                                     INTEGER         pdis)
+      EXTERNAL        cdiDecodeParam
+
+      INTEGER         cdiEncodeParam
+!                                    (INTEGER         pnum,
+!                                     INTEGER         pcat,
+!                                     INTEGER         pdis)
+      EXTERNAL        cdiEncodeParam
+
+!
+!  date format:  YYYYMMDD
+!
+!
+!  time format:    hhmmss
+!
+!                     cdiDecodeDate
+!                                    (INTEGER         date,
+!                                     INTEGER         year,
+!                                     INTEGER         month,
+!                                     INTEGER         day)
+      EXTERNAL        cdiDecodeDate
+
+      INTEGER         cdiEncodeDate
+!                                    (INTEGER         year,
+!                                     INTEGER         month,
+!                                     INTEGER         day)
+      EXTERNAL        cdiEncodeDate
+
+!                     cdiDecodeTime
+!                                    (INTEGER         time,
+!                                     INTEGER         hour,
+!                                     INTEGER         minute,
+!                                     INTEGER         second)
+      EXTERNAL        cdiDecodeTime
+
+      INTEGER         cdiEncodeTime
+!                                    (INTEGER         hour,
+!                                     INTEGER         minute,
+!                                     INTEGER         second)
+      EXTERNAL        cdiEncodeTime
+
+!
+!  STREAM control routines
+!
+      INTEGER         cdiGetFiletype
+!                                    (CHARACTER*(*)   uri,
+!                                     INTEGER         byteorder)
+      EXTERNAL        cdiGetFiletype
+
+      INTEGER         streamOpenRead
+!                                    (CHARACTER*(*)   path)
+      EXTERNAL        streamOpenRead
+
+      INTEGER         streamOpenWrite
+!                                    (CHARACTER*(*)   path,
+!                                     INTEGER         filetype)
+      EXTERNAL        streamOpenWrite
+
+      INTEGER         streamOpenAppend
+!                                    (CHARACTER*(*)   path)
+      EXTERNAL        streamOpenAppend
+
+!                     streamClose
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamClose
+
+!                     streamSync
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamSync
+
+!                     streamDefMaxSteps
+!                                    (INTEGER         streamID,
+!                                     INTEGER         maxSteps)
+      EXTERNAL        streamDefMaxSteps
+
+!                     streamDefNumWorker
+!                                    (INTEGER         streamID,
+!                                     INTEGER         numWorker)
+      EXTERNAL        streamDefNumWorker
+
+      INTEGER         streamInqNumSteps
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqNumSteps
+
+!                     streamDefVlist
+!                                    (INTEGER         streamID,
+!                                     INTEGER         vlistID)
+      EXTERNAL        streamDefVlist
+
+      INTEGER         streamInqVlist
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqVlist
+
+      INTEGER         streamInqFiletype
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqFiletype
+
+!                     streamDefByteorder
+!                                    (INTEGER         streamID,
+!                                     INTEGER         byteorder)
+      EXTERNAL        streamDefByteorder
+
+      INTEGER         streamInqByteorder
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqByteorder
+
+!                     streamDefShuffle
+!                                    (INTEGER         streamID,
+!                                     INTEGER         shuffle)
+      EXTERNAL        streamDefShuffle
+
+!                     streamDefFilter
+!                                    (INTEGER         streamID,
+!                                     CHARACTER*(*)   filterSpec)
+      EXTERNAL        streamDefFilter
+
+!                     streamDefCompType
+!                                    (INTEGER         streamID,
+!                                     INTEGER         comptype)
+      EXTERNAL        streamDefCompType
+
+      INTEGER         streamInqCompType
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqCompType
+
+!                     streamDefCompLevel
+!                                    (INTEGER         streamID,
+!                                     INTEGER         complevel)
+      EXTERNAL        streamDefCompLevel
+
+      INTEGER         streamInqCompLevel
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqCompLevel
+
+      INTEGER         streamDefTimestep
+!                                    (INTEGER         streamID,
+!                                     INTEGER         tsID)
+      EXTERNAL        streamDefTimestep
+
+      INTEGER         streamInqTimestep
+!                                    (INTEGER         streamID,
+!                                     INTEGER         tsID)
+      EXTERNAL        streamInqTimestep
+
+      INTEGER         streamInqCurTimestepID
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqCurTimestepID
+
+      CHARACTER(80)   streamFilename
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamFilename
+
+      CHARACTER(80)   streamFilesuffix
+!                                    (INTEGER         filetype)
+      EXTERNAL        streamFilesuffix
+
+      INTEGER         streamNvals
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamNvals
+
+      INTEGER         streamInqNvars
+!                                    (INTEGER         streamID)
+      EXTERNAL        streamInqNvars
+
+!
+!  STREAM var I/O routines (random access)
+!
+!                     streamWriteVar
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVar
+
+!                     streamWriteVarF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVarF
+
+!                     streamReadVar
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadVar
+
+!                     streamReadVarF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadVarF
+
+!                     streamWriteVarSlice
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVarSlice
+
+!                     streamWriteVarSliceF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVarSliceF
+
+!                     streamReadVarSlice
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadVarSlice
+
+!                     streamReadVarSliceF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadVarSliceF
+
+!                     streamWriteVarChunk
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         rect(2,*),
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVarChunk
+
+!                     streamWriteVarChunkF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         rect(2,*),
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteVarChunkF
+
+!
+!  STREAM record I/O routines (sequential access)
+!
+!                     streamDefRecord
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID)
+      EXTERNAL        streamDefRecord
+
+!                     streamInqRecord
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID)
+      EXTERNAL        streamInqRecord
+
+!                     streamWriteRecord
+!                                    (INTEGER         streamID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteRecord
+
+!                     streamWriteRecordF
+!                                    (INTEGER         streamID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamWriteRecordF
+
+!                     streamReadRecord
+!                                    (INTEGER         streamID,
+!                                     DOUBLEPRECISION data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadRecord
+
+!                     streamReadRecordF
+!                                    (INTEGER         streamID,
+!                                     REAL            data(*),
+!                                     INTEGER         numMissVals)
+      EXTERNAL        streamReadRecordF
+
+!                     streamCopyRecord
+!                                    (INTEGER         streamIDdest,
+!                                     INTEGER         streamIDsrc)
+      EXTERNAL        streamCopyRecord
+
+!
+!  File driven I/O (may yield better performance than using the streamXXX functions)
+!
+!
+!  Creation & Destruction
+!
+!
+!  Advancing an iterator
+!
+!
+!  Introspecting metadata
+!
+!
+!  All outXXX arguments to these functions may be NULL.
+!
+!
+!  Reading data
+!
+!
+!  TODO[NH]: Add functions to read partial fields.
+!
+!
+!  Direct access to grib fields
+!
+!
+!  Callthroughs to GRIB-API
+!
+!
+!  Convenience functions for accessing GRIB-API keys
+!
+!
+!  VLIST routines
+!
+      INTEGER         vlistCreate
+      EXTERNAL        vlistCreate
+
+!                     vlistDestroy
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistDestroy
+
+      INTEGER         vlistDuplicate
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistDuplicate
+
+!                     vlistCopyFlag
+!                                    (INTEGER         vlistID2,
+!                                     INTEGER         vlistID1)
+      EXTERNAL        vlistCopyFlag
+
+!                     vlistClearFlag
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistClearFlag
+
+!                     vlistCat
+!                                    (INTEGER         vlistID2,
+!                                     INTEGER         vlistID1)
+      EXTERNAL        vlistCat
+
+!                     vlistMerge
+!                                    (INTEGER         vlistID2,
+!                                     INTEGER         vlistID1)
+      EXTERNAL        vlistMerge
+
+!                     vlistPrint
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistPrint
+
+      INTEGER         vlistNumber
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNumber
+
+      INTEGER         vlistNvars
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNvars
+
+      INTEGER         vlistNumGrids
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNumGrids
+
+      INTEGER         vlistNumZaxis
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNumZaxis
+
+      INTEGER         vlistNsubtypes
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNsubtypes
+
+!                     vlistDefNtsteps
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         nts)
+      EXTERNAL        vlistDefNtsteps
+
+      INTEGER         vlistNtsteps
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNtsteps
+
+      INTEGER         vlistGridsizeMax
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistGridsizeMax
+
+      INTEGER         vlistGrid
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         index)
+      EXTERNAL        vlistGrid
+
+      INTEGER         vlistGridIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         gridID)
+      EXTERNAL        vlistGridIndex
+
+!                     vlistChangeGridIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         index,
+!                                     INTEGER         gridID)
+      EXTERNAL        vlistChangeGridIndex
+
+!                     vlistChangeGrid
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         gridID1,
+!                                     INTEGER         gridID2)
+      EXTERNAL        vlistChangeGrid
+
+      INTEGER         vlistZaxis
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         index)
+      EXTERNAL        vlistZaxis
+
+      INTEGER         vlistZaxisIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         zaxisID)
+      EXTERNAL        vlistZaxisIndex
+
+!                     vlistChangeZaxisIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         index,
+!                                     INTEGER         zaxisID)
+      EXTERNAL        vlistChangeZaxisIndex
+
+!                     vlistChangeZaxis
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         zaxisID1,
+!                                     INTEGER         zaxisID2)
+      EXTERNAL        vlistChangeZaxis
+
+      INTEGER         vlistNumRecords
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistNumRecords
+
+      INTEGER         vlistSubtype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         index)
+      EXTERNAL        vlistSubtype
+
+      INTEGER         vlistSubtypeIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         subtypeID)
+      EXTERNAL        vlistSubtypeIndex
+
+!                     vlistDefTaxis
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         taxisID)
+      EXTERNAL        vlistDefTaxis
+
+      INTEGER         vlistInqTaxis
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistInqTaxis
+
+!                     vlistDefTable
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         tableID)
+      EXTERNAL        vlistDefTable
+
+      INTEGER         vlistInqTable
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistInqTable
+
+!                     vlistDefInstitut
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         instID)
+      EXTERNAL        vlistDefInstitut
+
+      INTEGER         vlistInqInstitut
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistInqInstitut
+
+!                     vlistDefModel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         modelID)
+      EXTERNAL        vlistDefModel
+
+      INTEGER         vlistInqModel
+!                                    (INTEGER         vlistID)
+      EXTERNAL        vlistInqModel
+
+!
+!  VLIST VAR routines
+!
+      INTEGER         vlistDefVarTiles
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         gridID,
+!                                     INTEGER         zaxisID,
+!                                     INTEGER         timetype,
+!                                     INTEGER         tilesetID)
+      EXTERNAL        vlistDefVarTiles
+
+      INTEGER         vlistDefVar
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         gridID,
+!                                     INTEGER         zaxisID,
+!                                     INTEGER         timetype)
+      EXTERNAL        vlistDefVar
+
+!                     vlistChangeVarGrid
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         gridID)
+      EXTERNAL        vlistChangeVarGrid
+
+!                     vlistChangeVarZaxis
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         zaxisID)
+      EXTERNAL        vlistChangeVarZaxis
+
+!                     vlistInqVar
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         gridID,
+!                                     INTEGER         zaxisID,
+!                                     INTEGER         timetype)
+      EXTERNAL        vlistInqVar
+
+      INTEGER         vlistInqVarGrid
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarGrid
+
+      INTEGER         vlistInqVarZaxis
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarZaxis
+
+!
+!  used in MPIOM
+!
+      INTEGER         vlistInqVarID
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         code)
+      EXTERNAL        vlistInqVarID
+
+!                     vlistDefVarTimetype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         timetype)
+      EXTERNAL        vlistDefVarTimetype
+
+      INTEGER         vlistInqVarTimetype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarTimetype
+
+!                     vlistDefVarTsteptype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         tsteptype)
+      EXTERNAL        vlistDefVarTsteptype
+
+      INTEGER         vlistInqVarTsteptype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarTsteptype
+
+!                     vlistDefVarCompType
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         comptype)
+      EXTERNAL        vlistDefVarCompType
+
+      INTEGER         vlistInqVarCompType
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarCompType
+
+!                     vlistDefVarCompLevel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         complevel)
+      EXTERNAL        vlistDefVarCompLevel
+
+      INTEGER         vlistInqVarCompLevel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarCompLevel
+
+!                     vlistDefVarParam
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         param)
+      EXTERNAL        vlistDefVarParam
+
+      INTEGER         vlistInqVarParam
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarParam
+
+!                     vlistDefVarCode
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         code)
+      EXTERNAL        vlistDefVarCode
+
+      INTEGER         vlistInqVarCode
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarCode
+
+!                     vlistDefVarDatatype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         datatype)
+      EXTERNAL        vlistDefVarDatatype
+
+      INTEGER         vlistInqVarDatatype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarDatatype
+
+!                     vlistDefVarXYZ
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         xyz)
+      EXTERNAL        vlistDefVarXYZ
+
+      INTEGER         vlistInqVarXYZ
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarXYZ
+
+!                     vlistDefVarNSB
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         nsb)
+      EXTERNAL        vlistDefVarNSB
+
+      INTEGER         vlistInqVarNSB
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarNSB
+
+      INTEGER         vlistInqVarNumber
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarNumber
+
+!                     vlistDefVarInstitut
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         instID)
+      EXTERNAL        vlistDefVarInstitut
+
+      INTEGER         vlistInqVarInstitut
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarInstitut
+
+!                     vlistDefVarModel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         modelID)
+      EXTERNAL        vlistDefVarModel
+
+      INTEGER         vlistInqVarModel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarModel
+
+!                     vlistDefVarTable
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         tableID)
+      EXTERNAL        vlistDefVarTable
+
+      INTEGER         vlistInqVarTable
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarTable
+
+!                     vlistDefVarName
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        vlistDefVarName
+
+!                     vlistInqVarName
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        vlistInqVarName
+
+      CHARACTER(80)   vlistCopyVarName
+!                                    (INTEGER         vlistId,
+!                                     INTEGER         varId)
+      EXTERNAL        vlistCopyVarName
+
+!                     vlistDefVarStdname
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   stdname)
+      EXTERNAL        vlistDefVarStdname
+
+!                     vlistInqVarStdname
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   stdname)
+      EXTERNAL        vlistInqVarStdname
+
+!                     vlistDefVarLongname
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   longname)
+      EXTERNAL        vlistDefVarLongname
+
+!                     vlistInqVarLongname
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   longname)
+      EXTERNAL        vlistInqVarLongname
+
+!                     vlistDefVarUnits
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   units)
+      EXTERNAL        vlistDefVarUnits
+
+!                     vlistInqVarUnits
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   units)
+      EXTERNAL        vlistInqVarUnits
+
+!                     vlistDefVarMissval
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     DOUBLEPRECISION missval)
+      EXTERNAL        vlistDefVarMissval
+
+      DOUBLEPRECISION vlistInqVarMissval
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarMissval
+
+      INTEGER         vlistInqVarSize
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarSize
+
+!                     vlistDefIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levID,
+!                                     INTEGER         index)
+      EXTERNAL        vlistDefIndex
+
+      INTEGER         vlistInqIndex
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levID)
+      EXTERNAL        vlistInqIndex
+
+!                     vlistDefFlag
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levID,
+!                                     INTEGER         flag)
+      EXTERNAL        vlistDefFlag
+
+      INTEGER         vlistInqFlag
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levID)
+      EXTERNAL        vlistInqFlag
+
+      INTEGER         vlistFindVar
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         fvarID)
+      EXTERNAL        vlistFindVar
+
+      INTEGER         vlistFindLevel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         fvarID,
+!                                     INTEGER         flevelID)
+      EXTERNAL        vlistFindLevel
+
+      INTEGER         vlistMergedVar
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistMergedVar
+
+      INTEGER         vlistMergedLevel
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         levelID)
+      EXTERNAL        vlistMergedLevel
+
+!                     cdiClearAdditionalKeys
+      EXTERNAL        cdiClearAdditionalKeys
+
+!                     cdiDefAdditionalKey
+!                                    (CHARACTER*(*)   string)
+      EXTERNAL        cdiDefAdditionalKey
+
+!                     vlistDefVarIntKey
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         value)
+      EXTERNAL        vlistDefVarIntKey
+
+!                     vlistDefVarDblKey
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     DOUBLEPRECISION value)
+      EXTERNAL        vlistDefVarDblKey
+
+      INTEGER         vlistHasVarKey
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        vlistHasVarKey
+
+      DOUBLEPRECISION vlistInqVarDblKey
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        vlistInqVarDblKey
+
+      INTEGER         vlistInqVarIntKey
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        vlistInqVarIntKey
+
+!
+!  CDI attributes
+!
+      INTEGER         cdiInqNatts
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         nattsp)
+      EXTERNAL        cdiInqNatts
+
+      INTEGER         cdiInqAtt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         attrnum,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         typep,
+!                                     INTEGER         lenp)
+      EXTERNAL        cdiInqAtt
+
+      INTEGER         cdiInqAttLen
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        cdiInqAttLen
+
+      INTEGER         cdiInqAttType
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        cdiInqAttType
+
+      INTEGER         cdiDelAtt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        cdiDelAtt
+
+      INTEGER         cdiCopyAtts
+!                                    (INTEGER         cdiID1,
+!                                     INTEGER         varID1,
+!                                     INTEGER         cdiID2,
+!                                     INTEGER         varID2)
+      EXTERNAL        cdiCopyAtts
+
+      INTEGER         cdiDefAttInt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         type,
+!                                     INTEGER         len,
+!                                     INTEGER         ip(*))
+      EXTERNAL        cdiDefAttInt
+
+      INTEGER         cdiDefAttFlt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         type,
+!                                     INTEGER         len,
+!                                     DOUBLEPRECISION dp(*))
+      EXTERNAL        cdiDefAttFlt
+
+      INTEGER         cdiDefAttTxt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         len,
+!                                     CHARACTER*(*)   tp_cbuf)
+      EXTERNAL        cdiDefAttTxt
+
+      INTEGER         cdiInqAttInt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         mlen,
+!                                     INTEGER         ip(*))
+      EXTERNAL        cdiInqAttInt
+
+      INTEGER         cdiInqAttFlt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         mlen,
+!                                     DOUBLEPRECISION dp(*))
+      EXTERNAL        cdiInqAttFlt
+
+      INTEGER         cdiInqAttTxt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     CHARACTER*(*)   name,
+!                                     INTEGER         mlen,
+!                                     CHARACTER*(*)   tp_cbuf)
+      EXTERNAL        cdiInqAttTxt
+
+!
+!  GRID routines
+!
+!                     gridName
+!                                    (INTEGER         gridtype,
+!                                     CHARACTER*(*)   gridname)
+      EXTERNAL        gridName
+
+      CHARACTER(80)   gridNamePtr
+!                                    (INTEGER         gridtype)
+      EXTERNAL        gridNamePtr
+
+!                     gridCompress
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridCompress
+
+!                     gridDefMaskGME
+!                                    (INTEGER         gridID,
+!                                     INTEGER         mask(*))
+      EXTERNAL        gridDefMaskGME
+
+      INTEGER         gridInqMaskGME
+!                                    (INTEGER         gridID,
+!                                     INTEGER         mask(*))
+      EXTERNAL        gridInqMaskGME
+
+!                     gridDefMask
+!                                    (INTEGER         gridID,
+!                                     INTEGER         mask(*))
+      EXTERNAL        gridDefMask
+
+      INTEGER         gridInqMask
+!                                    (INTEGER         gridID,
+!                                     INTEGER         mask(*))
+      EXTERNAL        gridInqMask
+
+      INTEGER         gridCreate
+!                                    (INTEGER         gridtype,
+!                                     INTEGER         size)
+      EXTERNAL        gridCreate
+
+!                     gridDestroy
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridDestroy
+
+      INTEGER         gridDuplicate
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridDuplicate
+
+!                     gridDefProj
+!                                    (INTEGER         gridID,
+!                                     INTEGER         projID)
+      EXTERNAL        gridDefProj
+
+      INTEGER         gridInqProj
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqProj
+
+      INTEGER         gridInqProjType
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqProjType
+
+      INTEGER         gridInqType
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqType
+
+      INTEGER         gridInqSize
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqSize
+
+!                     gridDefXsize
+!                                    (INTEGER         gridID,
+!                                     INTEGER         xsize)
+      EXTERNAL        gridDefXsize
+
+      INTEGER         gridInqXsize
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqXsize
+
+!                     gridDefYsize
+!                                    (INTEGER         gridID,
+!                                     INTEGER         ysize)
+      EXTERNAL        gridDefYsize
+
+      INTEGER         gridInqYsize
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqYsize
+
+!                     gridDefNP
+!                                    (INTEGER         gridID,
+!                                     INTEGER         np)
+      EXTERNAL        gridDefNP
+
+      INTEGER         gridInqNP
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqNP
+
+!                     gridDefXvals
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xvals(*))
+      EXTERNAL        gridDefXvals
+
+      INTEGER         gridInqXvals
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xvals(*))
+      EXTERNAL        gridInqXvals
+
+      INTEGER         gridInqXvalsPart
+!                                    (INTEGER         gridID,
+!                                     INTEGER         start,
+!                                     INTEGER         size,
+!                                     DOUBLEPRECISION xvals(*))
+      EXTERNAL        gridInqXvalsPart
+
+      INTEGER         gridInqXIsc
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqXIsc
+
+!                     gridDefYvals
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION yvals(*))
+      EXTERNAL        gridDefYvals
+
+      INTEGER         gridInqYvals
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION yvals(*))
+      EXTERNAL        gridInqYvals
+
+      INTEGER         gridInqYvalsPart
+!                                    (INTEGER         gridID,
+!                                     INTEGER         start,
+!                                     INTEGER         size,
+!                                     DOUBLEPRECISION yvals(*))
+      EXTERNAL        gridInqYvalsPart
+
+      INTEGER         gridInqYIsc
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqYIsc
+
+!
+!  CDI var keys
+!
+!
+!  String keys
+!
+      INTEGER    CDI_KEY_NAME
+      PARAMETER (CDI_KEY_NAME           = 942)
+      INTEGER    CDI_KEY_LONGNAME
+      PARAMETER (CDI_KEY_LONGNAME       = 943)
+      INTEGER    CDI_KEY_STDNAME
+      PARAMETER (CDI_KEY_STDNAME        = 944)
+      INTEGER    CDI_KEY_UNITS
+      PARAMETER (CDI_KEY_UNITS          = 945)
+      INTEGER    CDI_KEY_DATATYPE
+      PARAMETER (CDI_KEY_DATATYPE       = 946)
+      INTEGER    CDI_KEY_REFERENCEURI
+      PARAMETER (CDI_KEY_REFERENCEURI   = 947)
+      INTEGER    CDI_KEY_CHUNKS
+      PARAMETER (CDI_KEY_CHUNKS         = 948)
+!
+!  Integer keys
+!
+      INTEGER    CDI_KEY_NUMBEROFGRIDUSED
+      PARAMETER (CDI_KEY_NUMBEROFGRIDUSED = 961)
+      INTEGER    CDI_KEY_NUMBEROFGRIDINREFERENCE
+      PARAMETER (CDI_KEY_NUMBEROFGRIDINREFERENCE = 962)
+      INTEGER    CDI_KEY_NUMBEROFVGRIDUSED
+      PARAMETER (CDI_KEY_NUMBEROFVGRIDUSED = 963)
+      INTEGER    CDI_KEY_NLEV
+      PARAMETER (CDI_KEY_NLEV           = 964)
+      INTEGER    CDI_KEY_CHUNKTYPE
+      PARAMETER (CDI_KEY_CHUNKTYPE      = 965)
+      INTEGER    CDI_KEY_CHUNKSIZE
+      PARAMETER (CDI_KEY_CHUNKSIZE      = 966)
+!
+!  Floating point keys
+!
+      INTEGER    CDI_KEY_MISSVAL
+      PARAMETER (CDI_KEY_MISSVAL        = 701)
+      INTEGER    CDI_KEY_ADDOFFSET
+      PARAMETER (CDI_KEY_ADDOFFSET      = 702)
+      INTEGER    CDI_KEY_SCALEFACTOR
+      PARAMETER (CDI_KEY_SCALEFACTOR    = 703)
+      INTEGER    CDI_KEY_FILTERSPEC_IN
+      PARAMETER (CDI_KEY_FILTERSPEC_IN  = 720)
+      INTEGER    CDI_KEY_FILTERSPEC
+      PARAMETER (CDI_KEY_FILTERSPEC     = 721)
+!
+!  Byte array keys
+!
+      INTEGER    CDI_KEY_UUID
+      PARAMETER (CDI_KEY_UUID           = 960)
+      INTEGER    CDI_KEY_DIMNAME
+      PARAMETER (CDI_KEY_DIMNAME        = 941)
+      INTEGER    CDI_KEY_PSNAME
+      PARAMETER (CDI_KEY_PSNAME         = 950)
+      INTEGER    CDI_KEY_P0NAME
+      PARAMETER (CDI_KEY_P0NAME         = 951)
+      INTEGER    CDI_KEY_P0VALUE
+      PARAMETER (CDI_KEY_P0VALUE        = 952)
+      INTEGER    CDI_KEY_TABLESVERSION
+      PARAMETER (CDI_KEY_TABLESVERSION  = 801)
+      INTEGER    CDI_KEY_LOCALTABLESVERSION
+      PARAMETER (CDI_KEY_LOCALTABLESVERSION = 802)
+      INTEGER    CDI_KEY_TYPEOFGENERATINGPROCESS
+      PARAMETER (CDI_KEY_TYPEOFGENERATINGPROCESS = 803)
+      INTEGER    CDI_KEY_PRODUCTDEFINITIONTEMPLATE
+      PARAMETER (CDI_KEY_PRODUCTDEFINITIONTEMPLATE = 804)
+      INTEGER    CDI_KEY_TYPEOFPROCESSEDDATA
+      PARAMETER (CDI_KEY_TYPEOFPROCESSEDDATA = 805)
+      INTEGER    CDI_KEY_SHAPEOFTHEEARTH
+      PARAMETER (CDI_KEY_SHAPEOFTHEEARTH = 806)
+      INTEGER    CDI_KEY_BACKGROUNDPROCESS
+      PARAMETER (CDI_KEY_BACKGROUNDPROCESS = 807)
+      INTEGER    CDI_KEY_TYPEOFENSEMBLEFORECAST
+      PARAMETER (CDI_KEY_TYPEOFENSEMBLEFORECAST = 808)
+      INTEGER    CDI_KEY_NUMBEROFFORECASTSINENSEMBLE
+      PARAMETER (CDI_KEY_NUMBEROFFORECASTSINENSEMBLE = 809)
+      INTEGER    CDI_KEY_PERTURBATIONNUMBER
+      PARAMETER (CDI_KEY_PERTURBATIONNUMBER = 810)
+      INTEGER    CDI_KEY_CENTRE
+      PARAMETER (CDI_KEY_CENTRE         = 811)
+      INTEGER    CDI_KEY_SUBCENTRE
+      PARAMETER (CDI_KEY_SUBCENTRE      = 812)
+      INTEGER    CDI_KEY_MPIMTYPE
+      PARAMETER (CDI_KEY_MPIMTYPE       = 813)
+      INTEGER    CDI_KEY_MPIMCLASS
+      PARAMETER (CDI_KEY_MPIMCLASS      = 814)
+      INTEGER    CDI_KEY_MPIMUSER
+      PARAMETER (CDI_KEY_MPIMUSER       = 815)
+      INTEGER    CDI_KEY_REVSTATUS
+      PARAMETER (CDI_KEY_REVSTATUS      = 816)
+      INTEGER    CDI_KEY_REVNUMBER
+      PARAMETER (CDI_KEY_REVNUMBER      = 817)
+      INTEGER    CDI_KEY_GRIB2LOCALSECTIONNUMBER
+      PARAMETER (CDI_KEY_GRIB2LOCALSECTIONNUMBER = 818)
+      INTEGER    CDI_KEY_SECTION2PADDINGLENGTH
+      PARAMETER (CDI_KEY_SECTION2PADDINGLENGTH = 819)
+      INTEGER    CDI_KEY_SECTION2PADDING
+      PARAMETER (CDI_KEY_SECTION2PADDING = 820)
+      INTEGER    CDI_KEY_CONSTITUENTTYPE
+      PARAMETER (CDI_KEY_CONSTITUENTTYPE = 821)
+      INTEGER    CDI_KEY_TYPEOFTIMEINCREMENT
+      PARAMETER (CDI_KEY_TYPEOFTIMEINCREMENT = 822)
+      INTEGER    CDI_KEY_TYPEOFFIRSTFIXEDSURFACE
+      PARAMETER (CDI_KEY_TYPEOFFIRSTFIXEDSURFACE = 823)
+      INTEGER    CDI_KEY_TYPEOFSECONDFIXEDSURFACE
+      PARAMETER (CDI_KEY_TYPEOFSECONDFIXEDSURFACE = 824)
+      INTEGER    CDI_KEY_UVRELATIVETOGRID
+      PARAMETER (CDI_KEY_UVRELATIVETOGRID = 825)
+      INTEGER    CDI_KEY_SCANNINGMODE
+      PARAMETER (CDI_KEY_SCANNINGMODE   = 826)
+      INTEGER    CDI_KEY_VDIMNAME
+      PARAMETER (CDI_KEY_VDIMNAME       = 920)
+      INTEGER    CDI_KEY_GRIDMAP_VARTYPE
+      PARAMETER (CDI_KEY_GRIDMAP_VARTYPE = 921)
+      INTEGER    CDI_KEY_GRIDMAP_VARNAME
+      PARAMETER (CDI_KEY_GRIDMAP_VARNAME = 922)
+      INTEGER    CDI_KEY_GRIDMAP_NAME
+      PARAMETER (CDI_KEY_GRIDMAP_NAME   = 923)
+      INTEGER         cdiDefKeyInt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     INTEGER         value)
+      EXTERNAL        cdiDefKeyInt
+
+      INTEGER         cdiInqKeyInt
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     INTEGER         value)
+      EXTERNAL        cdiInqKeyInt
+
+      INTEGER         cdiDefKeyFloat
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     DOUBLEPRECISION value)
+      EXTERNAL        cdiDefKeyFloat
+
+!
+!  cdiInqKeyFloat Get a float value from a key
+!
+      INTEGER         cdiInqKeyFloat
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     DOUBLEPRECISION value)
+      EXTERNAL        cdiInqKeyFloat
+
+      INTEGER         cdiDefKeyString
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     CHARACTER*(*)   string)
+      EXTERNAL        cdiDefKeyString
+
+      INTEGER         cdiInqKeyString
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     CHARACTER*(*)   string,
+!                                     INTEGER         length)
+      EXTERNAL        cdiInqKeyString
+
+      INTEGER         cdiInqKeyLen
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key,
+!                                     INTEGER         length)
+      EXTERNAL        cdiInqKeyLen
+
+      INTEGER         cdiCopyKeys
+!                                    (INTEGER         cdiID1,
+!                                     INTEGER         varID1,
+!                                     INTEGER         cdiID2,
+!                                     INTEGER         varID2)
+      EXTERNAL        cdiCopyKeys
+
+      INTEGER         cdiCopyKey
+!                                    (INTEGER         cdiID1,
+!                                     INTEGER         varID1,
+!                                     INTEGER         key,
+!                                     INTEGER         cdiID2)
+      EXTERNAL        cdiCopyKey
+
+      INTEGER         cdiDeleteKey
+!                                    (INTEGER         cdiID,
+!                                     INTEGER         varID,
+!                                     INTEGER         key)
+      EXTERNAL        cdiDeleteKey
+
+!
+!  GRID routines
+!
+!                     gridDefXname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xname)
+      EXTERNAL        gridDefXname
+
+!                     gridInqXname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xname)
+      EXTERNAL        gridInqXname
+
+!                     gridDefXlongname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xlongname)
+      EXTERNAL        gridDefXlongname
+
+!                     gridInqXlongname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xlongname)
+      EXTERNAL        gridInqXlongname
+
+!                     gridDefXunits
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xunits)
+      EXTERNAL        gridDefXunits
+
+!                     gridInqXunits
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   xunits)
+      EXTERNAL        gridInqXunits
+
+!                     gridDefYname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   yname)
+      EXTERNAL        gridDefYname
+
+!                     gridInqYname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   yname)
+      EXTERNAL        gridInqYname
+
+!                     gridDefYlongname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   ylongname)
+      EXTERNAL        gridDefYlongname
+
+!                     gridInqYlongname
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   ylongname)
+      EXTERNAL        gridInqYlongname
+
+!                     gridDefYunits
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   yunits)
+      EXTERNAL        gridDefYunits
+
+!                     gridInqYunits
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   yunits)
+      EXTERNAL        gridInqYunits
+
+!                     gridDefDatatype
+!                                    (INTEGER         gridID,
+!                                     INTEGER         datatype)
+      EXTERNAL        gridDefDatatype
+
+      INTEGER         gridInqDatatype
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqDatatype
+
+      DOUBLEPRECISION gridInqXval
+!                                    (INTEGER         gridID,
+!                                     INTEGER         index)
+      EXTERNAL        gridInqXval
+
+      DOUBLEPRECISION gridInqYval
+!                                    (INTEGER         gridID,
+!                                     INTEGER         index)
+      EXTERNAL        gridInqYval
+
+      DOUBLEPRECISION gridInqXinc
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqXinc
+
+      DOUBLEPRECISION gridInqYinc
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqYinc
+
+      INTEGER         gridIsCircular
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridIsCircular
+
+      INTEGER         gridInqTrunc
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqTrunc
+
+!                     gridDefTrunc
+!                                    (INTEGER         gridID,
+!                                     INTEGER         trunc)
+      EXTERNAL        gridDefTrunc
+
+!
+!  Reference of an unstructured grid
+!
+!                     gridDefNumber
+!                                    (INTEGER         gridID,
+!                                     INTEGER         number)
+      EXTERNAL        gridDefNumber
+
+      INTEGER         gridInqNumber
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqNumber
+
+!                     gridDefPosition
+!                                    (INTEGER         gridID,
+!                                     INTEGER         position)
+      EXTERNAL        gridDefPosition
+
+      INTEGER         gridInqPosition
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqPosition
+
+!                     gridDefReference
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   reference)
+      EXTERNAL        gridDefReference
+
+      INTEGER         gridInqReference
+!                                    (INTEGER         gridID,
+!                                     CHARACTER*(*)   reference)
+      EXTERNAL        gridInqReference
+
+!                     gridDefUUID
+!                                    (INTEGER         gridID,
+!                                     INTEGER*1(16)   uuid)
+      EXTERNAL        gridDefUUID
+
+!                     gridInqUUID
+!                                    (INTEGER         gridID,
+!                                     INTEGER*1(16)   uuid)
+      EXTERNAL        gridInqUUID
+
+!
+!  Rotated Lon/Lat grid
+!
+!                     gridDefParamRLL
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xpole,
+!                                     DOUBLEPRECISION ypole,
+!                                     DOUBLEPRECISION angle)
+      EXTERNAL        gridDefParamRLL
+
+!                     gridInqParamRLL
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xpole,
+!                                     DOUBLEPRECISION ypole,
+!                                     DOUBLEPRECISION angle)
+      EXTERNAL        gridInqParamRLL
+
+!
+!  Hexagonal GME grid
+!
+!                     gridDefParamGME
+!                                    (INTEGER         gridID,
+!                                     INTEGER         nd,
+!                                     INTEGER         ni,
+!                                     INTEGER         ni2,
+!                                     INTEGER         ni3)
+      EXTERNAL        gridDefParamGME
+
+!                     gridInqParamGME
+!                                    (INTEGER         gridID,
+!                                     INTEGER         nd,
+!                                     INTEGER         ni,
+!                                     INTEGER         ni2,
+!                                     INTEGER         ni3)
+      EXTERNAL        gridInqParamGME
+
+!                     gridDefArea
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION area(*))
+      EXTERNAL        gridDefArea
+
+!                     gridInqArea
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION area(*))
+      EXTERNAL        gridInqArea
+
+      INTEGER         gridHasArea
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridHasArea
+
+!                     gridDefNvertex
+!                                    (INTEGER         gridID,
+!                                     INTEGER         nvertex)
+      EXTERNAL        gridDefNvertex
+
+      INTEGER         gridInqNvertex
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqNvertex
+
+!                     gridDefXbounds
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xbounds(*))
+      EXTERNAL        gridDefXbounds
+
+      INTEGER         gridInqXbounds
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION xbounds(*))
+      EXTERNAL        gridInqXbounds
+
+      INTEGER         gridInqXboundsPart
+!                                    (INTEGER         gridID,
+!                                     INTEGER         start,
+!                                     INTEGER         size,
+!                                     DOUBLEPRECISION xbounds(*))
+      EXTERNAL        gridInqXboundsPart
+
+!                     gridDefYbounds
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION ybounds(*))
+      EXTERNAL        gridDefYbounds
+
+      INTEGER         gridInqYbounds
+!                                    (INTEGER         gridID,
+!                                     DOUBLEPRECISION ybounds(*))
+      EXTERNAL        gridInqYbounds
+
+      INTEGER         gridInqYboundsPart
+!                                    (INTEGER         gridID,
+!                                     INTEGER         start,
+!                                     INTEGER         size,
+!                                     DOUBLEPRECISION ybounds(*))
+      EXTERNAL        gridInqYboundsPart
+
+!                     gridDefReducedPoints
+!                                    (INTEGER         gridID,
+!                                     INTEGER         reducedPointsSize,
+!                                     INTEGER         reducedPoints(*))
+      EXTERNAL        gridDefReducedPoints
+
+!                     gridInqReducedPoints
+!                                    (INTEGER         gridID,
+!                                     INTEGER         reducedPoints(*))
+      EXTERNAL        gridInqReducedPoints
+
+!                     gridChangeType
+!                                    (INTEGER         gridID,
+!                                     INTEGER         gridtype)
+      EXTERNAL        gridChangeType
+
+!                     gridDefComplexPacking
+!                                    (INTEGER         gridID,
+!                                     INTEGER         lpack)
+      EXTERNAL        gridDefComplexPacking
+
+      INTEGER         gridInqComplexPacking
+!                                    (INTEGER         gridID)
+      EXTERNAL        gridInqComplexPacking
+
+!
+!  ZAXIS routines
+!
+!                     zaxisName
+!                                    (INTEGER         zaxistype,
+!                                     CHARACTER*(*)   zaxisname)
+      EXTERNAL        zaxisName
+
+      CHARACTER(80)   zaxisNamePtr
+!                                    (INTEGER         leveltype)
+      EXTERNAL        zaxisNamePtr
+
+      INTEGER         zaxisCreate
+!                                    (INTEGER         zaxistype,
+!                                     INTEGER         size)
+      EXTERNAL        zaxisCreate
+
+!                     zaxisDestroy
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisDestroy
+
+      INTEGER         zaxisInqType
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqType
+
+      INTEGER         zaxisInqSize
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqSize
+
+      INTEGER         zaxisDuplicate
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisDuplicate
+
+!                     zaxisDefLevels
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION levels(*))
+      EXTERNAL        zaxisDefLevels
+
+      INTEGER         zaxisInqLevels
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION levels(*))
+      EXTERNAL        zaxisInqLevels
+
+      INTEGER         zaxisInqCLen
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqCLen
+
+!                     zaxisDefLevel
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         levelID,
+!                                     DOUBLEPRECISION levels)
+      EXTERNAL        zaxisDefLevel
+
+      DOUBLEPRECISION zaxisInqLevel
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         levelID)
+      EXTERNAL        zaxisInqLevel
+
+!                     zaxisDefNlevRef
+!                                    (INTEGER         gridID,
+!                                     INTEGER         nhlev)
+      EXTERNAL        zaxisDefNlevRef
+
+      INTEGER         zaxisInqNlevRef
+!                                    (INTEGER         gridID)
+      EXTERNAL        zaxisInqNlevRef
+
+!                     zaxisDefNumber
+!                                    (INTEGER         gridID,
+!                                     INTEGER         number)
+      EXTERNAL        zaxisDefNumber
+
+      INTEGER         zaxisInqNumber
+!                                    (INTEGER         gridID)
+      EXTERNAL        zaxisInqNumber
+
+!                     zaxisDefUUID
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER*1(16)   uuid)
+      EXTERNAL        zaxisDefUUID
+
+!                     zaxisInqUUID
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER*1(16)   uuid)
+      EXTERNAL        zaxisInqUUID
+
+!                     zaxisDefName
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   name_optional)
+      EXTERNAL        zaxisDefName
+
+!                     zaxisInqName
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        zaxisInqName
+
+!                     zaxisDefLongname
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   longname_optional)
+      EXTERNAL        zaxisDefLongname
+
+!                     zaxisInqLongname
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   longname)
+      EXTERNAL        zaxisInqLongname
+
+!                     zaxisDefUnits
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   units_optional)
+      EXTERNAL        zaxisDefUnits
+
+!                     zaxisInqUnits
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   units)
+      EXTERNAL        zaxisInqUnits
+
+!                     zaxisInqStdname
+!                                    (INTEGER         zaxisID,
+!                                     CHARACTER*(*)   stdname)
+      EXTERNAL        zaxisInqStdname
+
+!                     zaxisDefDatatype
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         datatype)
+      EXTERNAL        zaxisDefDatatype
+
+      INTEGER         zaxisInqDatatype
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqDatatype
+
+!                     zaxisDefPositive
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         positive)
+      EXTERNAL        zaxisDefPositive
+
+      INTEGER         zaxisInqPositive
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqPositive
+
+!                     zaxisDefScalar
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisDefScalar
+
+      INTEGER         zaxisInqScalar
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqScalar
+
+!                     zaxisDefVct
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         size,
+!                                     DOUBLEPRECISION vct(*))
+      EXTERNAL        zaxisDefVct
+
+!                     zaxisInqVct
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION vct(*))
+      EXTERNAL        zaxisInqVct
+
+      INTEGER         zaxisInqVctSize
+!                                    (INTEGER         zaxisID)
+      EXTERNAL        zaxisInqVctSize
+
+!                     zaxisDefLbounds
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION lbounds(*))
+      EXTERNAL        zaxisDefLbounds
+
+      INTEGER         zaxisInqLbounds
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION lbounds_optional(*))
+      EXTERNAL        zaxisInqLbounds
+
+      DOUBLEPRECISION zaxisInqLbound
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         index)
+      EXTERNAL        zaxisInqLbound
+
+!                     zaxisDefUbounds
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION ubounds(*))
+      EXTERNAL        zaxisDefUbounds
+
+      INTEGER         zaxisInqUbounds
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION ubounds_optional(*))
+      EXTERNAL        zaxisInqUbounds
+
+      DOUBLEPRECISION zaxisInqUbound
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         index)
+      EXTERNAL        zaxisInqUbound
+
+!                     zaxisDefWeights
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION weights(*))
+      EXTERNAL        zaxisDefWeights
+
+      INTEGER         zaxisInqWeights
+!                                    (INTEGER         zaxisID,
+!                                     DOUBLEPRECISION weights_optional(*))
+      EXTERNAL        zaxisInqWeights
+
+!                     zaxisChangeType
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         zaxistype)
+      EXTERNAL        zaxisChangeType
+
+!
+!  TAXIS routines
+!
+      INTEGER         taxisCreate
+!                                    (INTEGER         taxistype)
+      EXTERNAL        taxisCreate
+
+!                     taxisDestroy
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisDestroy
+
+      INTEGER         taxisDuplicate
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisDuplicate
+
+!                     taxisCopyTimestep
+!                                    (INTEGER         taxisIDdes,
+!                                     INTEGER         taxisIDsrc)
+      EXTERNAL        taxisCopyTimestep
+
+!                     taxisDefType
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         taxistype)
+      EXTERNAL        taxisDefType
+
+      INTEGER         taxisInqType
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqType
+
+!                     taxisDefVdate
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         date)
+      EXTERNAL        taxisDefVdate
+
+!                     taxisDefVtime
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         time)
+      EXTERNAL        taxisDefVtime
+
+      INTEGER         taxisInqVdate
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqVdate
+
+      INTEGER         taxisInqVtime
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqVtime
+
+!                     taxisDefRdate
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         date)
+      EXTERNAL        taxisDefRdate
+
+!                     taxisDefRtime
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         time)
+      EXTERNAL        taxisDefRtime
+
+      INTEGER         taxisInqRdate
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqRdate
+
+      INTEGER         taxisInqRtime
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqRtime
+
+      INTEGER         taxisHasBounds
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisHasBounds
+
+!                     taxisWithBounds
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisWithBounds
+
+!                     taxisDeleteBounds
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisDeleteBounds
+
+!                     taxisDefVdateBounds
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         vdate_lb,
+!                                     INTEGER         vdate_ub)
+      EXTERNAL        taxisDefVdateBounds
+
+!                     taxisDefVtimeBounds
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         vtime_lb,
+!                                     INTEGER         vtime_ub)
+      EXTERNAL        taxisDefVtimeBounds
+
+!                     taxisInqVdateBounds
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         vdate_lb,
+!                                     INTEGER         vdate_ub)
+      EXTERNAL        taxisInqVdateBounds
+
+!                     taxisInqVtimeBounds
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         vtime_lb,
+!                                     INTEGER         vtime_ub)
+      EXTERNAL        taxisInqVtimeBounds
+
+!                     taxisDefCalendar
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         calendar)
+      EXTERNAL        taxisDefCalendar
+
+      INTEGER         taxisInqCalendar
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqCalendar
+
+!                     taxisDefTunit
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         tunit)
+      EXTERNAL        taxisDefTunit
+
+      INTEGER         taxisInqTunit
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqTunit
+
+!                     taxisDefForecastTunit
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         tunit)
+      EXTERNAL        taxisDefForecastTunit
+
+      INTEGER         taxisInqForecastTunit
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqForecastTunit
+
+!                     taxisDefForecastPeriod
+!                                    (INTEGER         taxisID,
+!                                     DOUBLEPRECISION fc_period)
+      EXTERNAL        taxisDefForecastPeriod
+
+      DOUBLEPRECISION taxisInqForecastPeriod
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqForecastPeriod
+
+!                     taxisDefNumavg
+!                                    (INTEGER         taxisID,
+!                                     INTEGER         numavg)
+      EXTERNAL        taxisDefNumavg
+
+      INTEGER         taxisInqNumavg
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisInqNumavg
+
+      CHARACTER(80)   taxisNamePtr
+!                                    (INTEGER         taxisID)
+      EXTERNAL        taxisNamePtr
+
+      CHARACTER(80)   tunitNamePtr
+!                                    (INTEGER         tunitID)
+      EXTERNAL        tunitNamePtr
+
+!
+!  Institut routines
+!
+      INTEGER         institutDef
+!                                    (INTEGER         center,
+!                                     INTEGER         subcenter,
+!                                     CHARACTER*(*)   name,
+!                                     CHARACTER*(*)   longname)
+      EXTERNAL        institutDef
+
+      INTEGER         institutInq
+!                                    (INTEGER         center,
+!                                     INTEGER         subcenter,
+!                                     CHARACTER*(*)   name,
+!                                     CHARACTER*(*)   longname)
+      EXTERNAL        institutInq
+
+      INTEGER         institutInqNumber
+      EXTERNAL        institutInqNumber
+
+      INTEGER         institutInqCenter
+!                                    (INTEGER         instID)
+      EXTERNAL        institutInqCenter
+
+      INTEGER         institutInqSubcenter
+!                                    (INTEGER         instID)
+      EXTERNAL        institutInqSubcenter
+
+      CHARACTER(80)   institutInqNamePtr
+!                                    (INTEGER         instID)
+      EXTERNAL        institutInqNamePtr
+
+      CHARACTER(80)   institutInqLongnamePtr
+!                                    (INTEGER         instID)
+      EXTERNAL        institutInqLongnamePtr
+
+!
+!  Model routines
+!
+      INTEGER         modelDef
+!                                    (INTEGER         instID,
+!                                     INTEGER         modelgribID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        modelDef
+
+      INTEGER         modelInq
+!                                    (INTEGER         instID,
+!                                     INTEGER         modelgribID,
+!                                     CHARACTER*(*)   name)
+      EXTERNAL        modelInq
+
+      INTEGER         modelInqInstitut
+!                                    (INTEGER         modelID)
+      EXTERNAL        modelInqInstitut
+
+      INTEGER         modelInqGribID
+!                                    (INTEGER         modelID)
+      EXTERNAL        modelInqGribID
+
+      CHARACTER(80)   modelInqNamePtr
+!                                    (INTEGER         modelID)
+      EXTERNAL        modelInqNamePtr
+
+!
+!  Table routines
+!
+!                     tableWrite
+!                                    (CHARACTER*(*)   filename,
+!                                     INTEGER         tableID)
+      EXTERNAL        tableWrite
+
+      INTEGER         tableRead
+!                                    (CHARACTER*(*)   tablefile)
+      EXTERNAL        tableRead
+
+      INTEGER         tableDef
+!                                    (INTEGER         modelID,
+!                                     INTEGER         tablenum,
+!                                     CHARACTER*(*)   tablename)
+      EXTERNAL        tableDef
+
+      CHARACTER(80)   tableInqNamePtr
+!                                    (INTEGER         tableID)
+      EXTERNAL        tableInqNamePtr
+
+      INTEGER         tableInq
+!                                    (INTEGER         modelID,
+!                                     INTEGER         tablenum,
+!                                     CHARACTER*(*)   tablename)
+      EXTERNAL        tableInq
+
+      INTEGER         tableInqNumber
+      EXTERNAL        tableInqNumber
+
+      INTEGER         tableInqNum
+!                                    (INTEGER         tableID)
+      EXTERNAL        tableInqNum
+
+      INTEGER         tableInqModel
+!                                    (INTEGER         tableID)
+      EXTERNAL        tableInqModel
+
+!                     tableInqEntry
+!                                    (INTEGER         tableID,
+!                                     INTEGER         id,
+!                                     INTEGER         ltype,
+!                                     CHARACTER*(*)   name,
+!                                     CHARACTER*(*)   longname,
+!                                     CHARACTER*(*)   units)
+      EXTERNAL        tableInqEntry
+
+!
+!  Subtype routines
+!
+      INTEGER         subtypeCreate
+!                                    (INTEGER         subtype)
+      EXTERNAL        subtypeCreate
+
+!
+!  Gives a textual summary of the variable subtype
+!
+!                     subtypePrint
+!                                    (INTEGER         subtypeID)
+      EXTERNAL        subtypePrint
+
+!
+!  Compares two subtype data structures
+!
+      INTEGER         subtypeCompare
+!                                    (INTEGER         subtypeID1,
+!                                     INTEGER         subtypeID2)
+      EXTERNAL        subtypeCompare
+
+      INTEGER         subtypeInqSize
+!                                    (INTEGER         subtypeID)
+      EXTERNAL        subtypeInqSize
+
+      INTEGER         subtypeInqActiveIndex
+!                                    (INTEGER         subtypeID)
+      EXTERNAL        subtypeInqActiveIndex
+
+!                     subtypeDefActiveIndex
+!                                    (INTEGER         subtypeID,
+!                                     INTEGER         index)
+      EXTERNAL        subtypeDefActiveIndex
+
+!
+!  Generate a "query object" out of a key-value pair
+!
+!
+!  Generate an AND-combined "query object" out of two previous query objects
+!
+      INTEGER         subtypeInqTile
+!                                    (INTEGER         subtypeID,
+!                                     INTEGER         tileindex,
+!                                     INTEGER         attribute)
+      EXTERNAL        subtypeInqTile
+
+      INTEGER         subtypeInqAttribute
+!                                    (INTEGER         subtypeID,
+!                                     INTEGER         index,
+!                                     CHARACTER*(*)   key,
+!                                     INTEGER         outValue)
+      EXTERNAL        subtypeInqAttribute
+
+      INTEGER         vlistInqVarSubtype
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarSubtype
+
+!                     gribapiLibraryVersion
+!                                    (INTEGER         major_version,
+!                                     INTEGER         minor_version,
+!                                     INTEGER         revision_version)
+      EXTERNAL        gribapiLibraryVersion
+
+!
+!  Compatibility functions for release 1.8.3 (obsolete functions)
+!
+!                     zaxisDefLtype
+!                                    (INTEGER         zaxisID,
+!                                     INTEGER         ltype)
+      EXTERNAL        zaxisDefLtype
+
+      INTEGER         vlistInqVarTypeOfGeneratingProcess
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID)
+      EXTERNAL        vlistInqVarTypeOfGeneratingProcess
+
+!                     vlistDefVarTypeOfGeneratingProcess
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         typeOfGeneratingProcess)
+      EXTERNAL        vlistDefVarTypeOfGeneratingProcess
+
+!                     vlistDefVarProductDefinitionTemplate
+!                                    (INTEGER         vlistID,
+!                                     INTEGER         varID,
+!                                     INTEGER         productDefinitionTemplate)
+      EXTERNAL        vlistDefVarProductDefinitionTemplate
+
+!
+!  End of fortran interface
+!
diff --git a/src/cdiFortran.c b/src/cdiFortran.c
new file mode 100644
index 000000000..8af344789
--- /dev/null
+++ b/src/cdiFortran.c
@@ -0,0 +1,813 @@
+// Automatically generated by make_fint.c, don't edit!
+
+// clang-format off
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef CDI_H_
+#include "cdi.h"
+#endif
+
+#ifdef HAVE_CF_INTERFACE
+
+#include <limits.h>
+#include <assert.h>
+
+#ifndef __CFORTRAN_LOADED
+#  if defined __clang__
+#    pragma GCC diagnostic push
+#    pragma GCC diagnostic ignored "-Wreserved-id-macro"
+#  endif
+#  include "cfortran.h"
+#  if defined __clang__
+#    pragma GCC diagnostic pop
+#  endif
+#endif
+/* These functions are meant to be called from Fortran and don't
+ * need an interface declaration in a C header. */
+#ifdef __clang__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wmissing-prototypes"
+#endif
+
+#ifdef CDI_H_
+
+static inline
+int SizeType_c2f(SizeType value_SizeType)
+{
+  assert(value_SizeType < INT_MAX);
+  return (int) value_SizeType;
+}
+
+#endif
+
+/*  Start of fortran interface for the following routines (make_fint.c)  */
+
+
+/*  Byte order  */
+
+
+/*  Error identifier  */
+
+
+/*  File types  */
+
+
+/*  Compatibility defines for release 1.8.3 (obsolete defines)  */
+
+
+/*  Protocols (in filename/URI)  */
+
+
+/*  Compress types  */
+
+
+/*  external data types  */
+
+
+/*  Compatibility defines for release 1.8.3 (obsolete defines)  */
+
+
+/*  internal data types  */
+
+
+/*  Chunk types  */
+
+
+/*  GRID types  */
+
+
+/*  ZAXIS types  */
+
+
+/*  SUBTYPE types  */
+
+
+/*  Data structure defining a key-value search, possibly with multiple
+   key-value pairs in combination.
+
+   Currently, only multiple pairs combined by AND are supported.  */
+
+
+/*  TIME types  */
+
+
+/*  TSTEP types  */
+
+
+/*  TAXIS types  */
+
+
+/*  TUNIT types  */
+
+
+/*  CALENDAR types  */
+
+
+/*  number of unsigned char needed to store UUID  */
+
+
+/*  Structs that are used to return data to the user  */
+
+
+/*  Opaque types  */
+
+
+/*  CDI control routines  */
+
+FCALLSCSUB0 (cdiReset, CDIRESET, cdireset)
+FCALLSCFUN1 (STRING, cdiStringError, CDISTRINGERROR, cdistringerror, INT)
+FCALLSCSUB1 (cdiDebug, CDIDEBUG, cdidebug, INT)
+FCALLSCFUN0 (STRING, cdiLibraryVersion, CDILIBRARYVERSION, cdilibraryversion)
+FCALLSCSUB0 (cdiPrintVersion, CDIPRINTVERSION, cdiprintversion)
+FCALLSCFUN1 (INT, cdiHaveFiletype, CDIHAVEFILETYPE, cdihavefiletype, INT)
+FCALLSCSUB1 (cdiDefMissval, CDIDEFMISSVAL, cdidefmissval, DOUBLE)
+FCALLSCFUN0 (DOUBLE, cdiInqMissval, CDIINQMISSVAL, cdiinqmissval)
+FCALLSCSUB2 (cdiDefGlobal, CDIDEFGLOBAL, cdidefglobal, STRING, INT)
+FCALLSCFUN0 (INT, namespaceNew, NAMESPACENEW, namespacenew)
+FCALLSCSUB1 (namespaceSetActive, NAMESPACESETACTIVE, namespacesetactive, INT)
+FCALLSCFUN0 (INT, namespaceGetActive, NAMESPACEGETACTIVE, namespacegetactive)
+FCALLSCSUB1 (namespaceDelete, NAMESPACEDELETE, namespacedelete, INT)
+
+/*  CDI converter routines  */
+
+
+/*  parameter  */
+
+FCALLSCSUB3 (cdiParamToString, CDIPARAMTOSTRING, cdiparamtostring, INT, PSTRING, INT)
+FCALLSCSUB4 (cdiDecodeParam, CDIDECODEPARAM, cdidecodeparam, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeParam, CDIENCODEPARAM, cdiencodeparam, INT, INT, INT)
+
+/*  date format:  YYYYMMDD  */
+
+
+/*  time format:    hhmmss  */
+
+FCALLSCSUB4 (cdiDecodeDate, CDIDECODEDATE, cdidecodedate, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeDate, CDIENCODEDATE, cdiencodedate, INT, INT, INT)
+FCALLSCSUB4 (cdiDecodeTime, CDIDECODETIME, cdidecodetime, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeTime, CDIENCODETIME, cdiencodetime, INT, INT, INT)
+
+/*  STREAM control routines  */
+
+FCALLSCFUN2 (INT, cdiGetFiletype, CDIGETFILETYPE, cdigetfiletype, STRING, PINT)
+FCALLSCFUN1 (INT, streamOpenRead, STREAMOPENREAD, streamopenread, STRING)
+FCALLSCFUN2 (INT, streamOpenWrite, STREAMOPENWRITE, streamopenwrite, STRING, INT)
+FCALLSCFUN1 (INT, streamOpenAppend, STREAMOPENAPPEND, streamopenappend, STRING)
+FCALLSCSUB1 (streamClose, STREAMCLOSE, streamclose, INT)
+FCALLSCSUB1 (streamSync, STREAMSYNC, streamsync, INT)
+FCALLSCSUB2 (streamDefMaxSteps, STREAMDEFMAXSTEPS, streamdefmaxsteps, INT, INT)
+FCALLSCSUB2 (streamDefNumWorker, STREAMDEFNUMWORKER, streamdefnumworker, INT, INT)
+FCALLSCFUN1 (INT, streamInqNumSteps, STREAMINQNUMSTEPS, streaminqnumsteps, INT)
+FCALLSCSUB2 (streamDefVlist, STREAMDEFVLIST, streamdefvlist, INT, INT)
+FCALLSCFUN1 (INT, streamInqVlist, STREAMINQVLIST, streaminqvlist, INT)
+FCALLSCFUN1 (INT, streamInqFiletype, STREAMINQFILETYPE, streaminqfiletype, INT)
+FCALLSCSUB2 (streamDefByteorder, STREAMDEFBYTEORDER, streamdefbyteorder, INT, INT)
+FCALLSCFUN1 (INT, streamInqByteorder, STREAMINQBYTEORDER, streaminqbyteorder, INT)
+FCALLSCSUB2 (streamDefShuffle, STREAMDEFSHUFFLE, streamdefshuffle, INT, INT)
+FCALLSCSUB2 (streamDefFilter, STREAMDEFFILTER, streamdeffilter, INT, STRING)
+FCALLSCSUB2 (streamDefCompType, STREAMDEFCOMPTYPE, streamdefcomptype, INT, INT)
+FCALLSCFUN1 (INT, streamInqCompType, STREAMINQCOMPTYPE, streaminqcomptype, INT)
+FCALLSCSUB2 (streamDefCompLevel, STREAMDEFCOMPLEVEL, streamdefcomplevel, INT, INT)
+FCALLSCFUN1 (INT, streamInqCompLevel, STREAMINQCOMPLEVEL, streaminqcomplevel, INT)
+FCALLSCFUN2 (INT, streamDefTimestep, STREAMDEFTIMESTEP, streamdeftimestep, INT, INT)
+FCALLSCFUN2 (INT, streamInqTimestep, STREAMINQTIMESTEP, streaminqtimestep, INT, INT)
+FCALLSCFUN1 (INT, streamInqCurTimestepID, STREAMINQCURTIMESTEPID, streaminqcurtimestepid, INT)
+FCALLSCFUN1 (STRING, streamFilename, STREAMFILENAME, streamfilename, INT)
+FCALLSCFUN1 (STRING, streamFilesuffix, STREAMFILESUFFIX, streamfilesuffix, INT)
+static int streamNvals_fwrap(int streamID)
+{
+  SizeType v;
+  v = streamNvals(streamID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, streamNvals_fwrap, STREAMNVALS, streamnvals, INT)
+FCALLSCFUN1 (INT, streamInqNvars, STREAMINQNVARS, streaminqnvars, INT)
+
+/*  STREAM var I/O routines (random access)  */
+
+static void streamWriteVar_fwrap(int streamID, int varID, const double data[], int numMissVals)
+{
+  streamWriteVar(streamID, varID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB4 (streamWriteVar_fwrap, STREAMWRITEVAR, streamwritevar, INT, INT, DOUBLEV, INT)
+static void streamWriteVarF_fwrap(int streamID, int varID, const float data[], int numMissVals)
+{
+  streamWriteVarF(streamID, varID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB4 (streamWriteVarF_fwrap, STREAMWRITEVARF, streamwritevarf, INT, INT, FLOATV, INT)
+static void streamReadVar_fwrap(int streamID, int varID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVar(streamID, varID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB4 (streamReadVar_fwrap, STREAMREADVAR, streamreadvar, INT, INT, DOUBLEV, PINT)
+static void streamReadVarF_fwrap(int streamID, int varID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarF(streamID, varID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB4 (streamReadVarF_fwrap, STREAMREADVARF, streamreadvarf, INT, INT, FLOATV, PINT)
+static void streamWriteVarSlice_fwrap(int streamID, int varID, int levelID, const double data[], int numMissVals)
+{
+  streamWriteVarSlice(streamID, varID, levelID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarSlice_fwrap, STREAMWRITEVARSLICE, streamwritevarslice, INT, INT, INT, DOUBLEV, INT)
+static void streamWriteVarSliceF_fwrap(int streamID, int varID, int levelID, const float data[], int numMissVals)
+{
+  streamWriteVarSliceF(streamID, varID, levelID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarSliceF_fwrap, STREAMWRITEVARSLICEF, streamwritevarslicef, INT, INT, INT, FLOATV, INT)
+static void streamReadVarSlice_fwrap(int streamID, int varID, int levelID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarSlice(streamID, varID, levelID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB5 (streamReadVarSlice_fwrap, STREAMREADVARSLICE, streamreadvarslice, INT, INT, INT, DOUBLEV, PINT)
+static void streamReadVarSliceF_fwrap(int streamID, int varID, int levelID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarSliceF(streamID, varID, levelID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB5 (streamReadVarSliceF_fwrap, STREAMREADVARSLICEF, streamreadvarslicef, INT, INT, INT, FLOATV, PINT)
+static void streamWriteVarChunk_fwrap(int streamID, int varID, const int rect[][2], const double data[], int numMissVals)
+{
+  streamWriteVarChunk(streamID, varID, rect, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarChunk_fwrap, STREAMWRITEVARCHUNK, streamwritevarchunk, INT, INT, INTVV, DOUBLEV, INT)
+static void streamWriteVarChunkF_fwrap(int streamID, int varID, const int rect[][2], const float data[], int numMissVals)
+{
+  streamWriteVarChunkF(streamID, varID, rect, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarChunkF_fwrap, STREAMWRITEVARCHUNKF, streamwritevarchunkf, INT, INT, INTVV, FLOATV, INT)
+
+/*  STREAM record I/O routines (sequential access)  */
+
+FCALLSCSUB3 (streamDefRecord, STREAMDEFRECORD, streamdefrecord, INT, INT, INT)
+FCALLSCSUB3 (streamInqRecord, STREAMINQRECORD, streaminqrecord, INT, PINT, PINT)
+static void streamWriteRecord_fwrap(int streamID, const double data[], int numMissVals)
+{
+  streamWriteRecord(streamID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB3 (streamWriteRecord_fwrap, STREAMWRITERECORD, streamwriterecord, INT, DOUBLEV, INT)
+static void streamWriteRecordF_fwrap(int streamID, const float data[], int numMissVals)
+{
+  streamWriteRecordF(streamID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB3 (streamWriteRecordF_fwrap, STREAMWRITERECORDF, streamwriterecordf, INT, FLOATV, INT)
+static void streamReadRecord_fwrap(int streamID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadRecord(streamID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB3 (streamReadRecord_fwrap, STREAMREADRECORD, streamreadrecord, INT, DOUBLEV, PINT)
+static void streamReadRecordF_fwrap(int streamID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadRecordF(streamID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB3 (streamReadRecordF_fwrap, STREAMREADRECORDF, streamreadrecordf, INT, FLOATV, PINT)
+FCALLSCSUB2 (streamCopyRecord, STREAMCOPYRECORD, streamcopyrecord, INT, INT)
+
+/*  File driven I/O (may yield better performance than using the streamXXX functions)  */
+
+
+/*  Creation & Destruction  */
+
+
+/*  Advancing an iterator  */
+
+
+/*  Introspecting metadata  */
+
+
+/*  All outXXX arguments to these functions may be NULL.  */
+
+
+/*  Reading data  */
+
+
+/*  TODO[NH]: Add functions to read partial fields.  */
+
+
+/*  Direct access to grib fields  */
+
+
+/*  Callthroughs to GRIB-API  */
+
+
+/*  Convenience functions for accessing GRIB-API keys  */
+
+
+/*  VLIST routines  */
+
+FCALLSCFUN0 (INT, vlistCreate, VLISTCREATE, vlistcreate)
+FCALLSCSUB1 (vlistDestroy, VLISTDESTROY, vlistdestroy, INT)
+FCALLSCFUN1 (INT, vlistDuplicate, VLISTDUPLICATE, vlistduplicate, INT)
+FCALLSCSUB2 (vlistCopyFlag, VLISTCOPYFLAG, vlistcopyflag, INT, INT)
+FCALLSCSUB1 (vlistClearFlag, VLISTCLEARFLAG, vlistclearflag, INT)
+FCALLSCSUB2 (vlistCat, VLISTCAT, vlistcat, INT, INT)
+FCALLSCSUB2 (vlistMerge, VLISTMERGE, vlistmerge, INT, INT)
+FCALLSCSUB1 (vlistPrint, VLISTPRINT, vlistprint, INT)
+FCALLSCFUN1 (INT, vlistNumber, VLISTNUMBER, vlistnumber, INT)
+FCALLSCFUN1 (INT, vlistNvars, VLISTNVARS, vlistnvars, INT)
+FCALLSCFUN1 (INT, vlistNumGrids, VLISTNUMGRIDS, vlistnumgrids, INT)
+FCALLSCFUN1 (INT, vlistNumZaxis, VLISTNUMZAXIS, vlistnumzaxis, INT)
+FCALLSCFUN1 (INT, vlistNsubtypes, VLISTNSUBTYPES, vlistnsubtypes, INT)
+FCALLSCSUB2 (vlistDefNtsteps, VLISTDEFNTSTEPS, vlistdefntsteps, INT, INT)
+FCALLSCFUN1 (INT, vlistNtsteps, VLISTNTSTEPS, vlistntsteps, INT)
+static int vlistGridsizeMax_fwrap(int vlistID)
+{
+  SizeType v;
+  v = vlistGridsizeMax(vlistID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, vlistGridsizeMax_fwrap, VLISTGRIDSIZEMAX, vlistgridsizemax, INT)
+FCALLSCFUN2 (INT, vlistGrid, VLISTGRID, vlistgrid, INT, INT)
+FCALLSCFUN2 (INT, vlistGridIndex, VLISTGRIDINDEX, vlistgridindex, INT, INT)
+FCALLSCSUB3 (vlistChangeGridIndex, VLISTCHANGEGRIDINDEX, vlistchangegridindex, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeGrid, VLISTCHANGEGRID, vlistchangegrid, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistZaxis, VLISTZAXIS, vlistzaxis, INT, INT)
+FCALLSCFUN2 (INT, vlistZaxisIndex, VLISTZAXISINDEX, vlistzaxisindex, INT, INT)
+FCALLSCSUB3 (vlistChangeZaxisIndex, VLISTCHANGEZAXISINDEX, vlistchangezaxisindex, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeZaxis, VLISTCHANGEZAXIS, vlistchangezaxis, INT, INT, INT)
+FCALLSCFUN1 (INT, vlistNumRecords, VLISTNUMRECORDS, vlistnumrecords, INT)
+FCALLSCFUN2 (INT, vlistSubtype, VLISTSUBTYPE, vlistsubtype, INT, INT)
+FCALLSCFUN2 (INT, vlistSubtypeIndex, VLISTSUBTYPEINDEX, vlistsubtypeindex, INT, INT)
+FCALLSCSUB2 (vlistDefTaxis, VLISTDEFTAXIS, vlistdeftaxis, INT, INT)
+FCALLSCFUN1 (INT, vlistInqTaxis, VLISTINQTAXIS, vlistinqtaxis, INT)
+FCALLSCSUB2 (vlistDefTable, VLISTDEFTABLE, vlistdeftable, INT, INT)
+FCALLSCFUN1 (INT, vlistInqTable, VLISTINQTABLE, vlistinqtable, INT)
+FCALLSCSUB2 (vlistDefInstitut, VLISTDEFINSTITUT, vlistdefinstitut, INT, INT)
+FCALLSCFUN1 (INT, vlistInqInstitut, VLISTINQINSTITUT, vlistinqinstitut, INT)
+FCALLSCSUB2 (vlistDefModel, VLISTDEFMODEL, vlistdefmodel, INT, INT)
+FCALLSCFUN1 (INT, vlistInqModel, VLISTINQMODEL, vlistinqmodel, INT)
+
+/*  VLIST VAR routines  */
+
+FCALLSCFUN5 (INT, vlistDefVarTiles, VLISTDEFVARTILES, vlistdefvartiles, INT, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, vlistDefVar, VLISTDEFVAR, vlistdefvar, INT, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeVarGrid, VLISTCHANGEVARGRID, vlistchangevargrid, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeVarZaxis, VLISTCHANGEVARZAXIS, vlistchangevarzaxis, INT, INT, INT)
+FCALLSCSUB5 (vlistInqVar, VLISTINQVAR, vlistinqvar, INT, INT, PINT, PINT, PINT)
+FCALLSCFUN2 (INT, vlistInqVarGrid, VLISTINQVARGRID, vlistinqvargrid, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarZaxis, VLISTINQVARZAXIS, vlistinqvarzaxis, INT, INT)
+
+/*  used in MPIOM  */
+
+FCALLSCFUN2 (INT, vlistInqVarID, VLISTINQVARID, vlistinqvarid, INT, INT)
+FCALLSCSUB3 (vlistDefVarTimetype, VLISTDEFVARTIMETYPE, vlistdefvartimetype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTimetype, VLISTINQVARTIMETYPE, vlistinqvartimetype, INT, INT)
+FCALLSCSUB3 (vlistDefVarTsteptype, VLISTDEFVARTSTEPTYPE, vlistdefvartsteptype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTsteptype, VLISTINQVARTSTEPTYPE, vlistinqvartsteptype, INT, INT)
+FCALLSCSUB3 (vlistDefVarCompType, VLISTDEFVARCOMPTYPE, vlistdefvarcomptype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCompType, VLISTINQVARCOMPTYPE, vlistinqvarcomptype, INT, INT)
+FCALLSCSUB3 (vlistDefVarCompLevel, VLISTDEFVARCOMPLEVEL, vlistdefvarcomplevel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCompLevel, VLISTINQVARCOMPLEVEL, vlistinqvarcomplevel, INT, INT)
+FCALLSCSUB3 (vlistDefVarParam, VLISTDEFVARPARAM, vlistdefvarparam, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarParam, VLISTINQVARPARAM, vlistinqvarparam, INT, INT)
+FCALLSCSUB3 (vlistDefVarCode, VLISTDEFVARCODE, vlistdefvarcode, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCode, VLISTINQVARCODE, vlistinqvarcode, INT, INT)
+FCALLSCSUB3 (vlistDefVarDatatype, VLISTDEFVARDATATYPE, vlistdefvardatatype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarDatatype, VLISTINQVARDATATYPE, vlistinqvardatatype, INT, INT)
+FCALLSCSUB3 (vlistDefVarXYZ, VLISTDEFVARXYZ, vlistdefvarxyz, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarXYZ, VLISTINQVARXYZ, vlistinqvarxyz, INT, INT)
+FCALLSCSUB3 (vlistDefVarNSB, VLISTDEFVARNSB, vlistdefvarnsb, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarNSB, VLISTINQVARNSB, vlistinqvarnsb, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarNumber, VLISTINQVARNUMBER, vlistinqvarnumber, INT, INT)
+FCALLSCSUB3 (vlistDefVarInstitut, VLISTDEFVARINSTITUT, vlistdefvarinstitut, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarInstitut, VLISTINQVARINSTITUT, vlistinqvarinstitut, INT, INT)
+FCALLSCSUB3 (vlistDefVarModel, VLISTDEFVARMODEL, vlistdefvarmodel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarModel, VLISTINQVARMODEL, vlistinqvarmodel, INT, INT)
+FCALLSCSUB3 (vlistDefVarTable, VLISTDEFVARTABLE, vlistdefvartable, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTable, VLISTINQVARTABLE, vlistinqvartable, INT, INT)
+FCALLSCSUB3 (vlistDefVarName, VLISTDEFVARNAME, vlistdefvarname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarName, VLISTINQVARNAME, vlistinqvarname, INT, INT, PSTRING)
+FCALLSCFUN2 (STRING, vlistCopyVarName, VLISTCOPYVARNAME, vlistcopyvarname, INT, INT)
+FCALLSCSUB3 (vlistDefVarStdname, VLISTDEFVARSTDNAME, vlistdefvarstdname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarStdname, VLISTINQVARSTDNAME, vlistinqvarstdname, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarLongname, VLISTDEFVARLONGNAME, vlistdefvarlongname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarLongname, VLISTINQVARLONGNAME, vlistinqvarlongname, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarUnits, VLISTDEFVARUNITS, vlistdefvarunits, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarUnits, VLISTINQVARUNITS, vlistinqvarunits, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarMissval, VLISTDEFVARMISSVAL, vlistdefvarmissval, INT, INT, DOUBLE)
+FCALLSCFUN2 (DOUBLE, vlistInqVarMissval, VLISTINQVARMISSVAL, vlistinqvarmissval, INT, INT)
+static int vlistInqVarSize_fwrap(int vlistID, int varID)
+{
+  SizeType v;
+  v = vlistInqVarSize(vlistID, varID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, vlistInqVarSize_fwrap, VLISTINQVARSIZE, vlistinqvarsize, INT, INT)
+FCALLSCSUB4 (vlistDefIndex, VLISTDEFINDEX, vlistdefindex, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, vlistInqIndex, VLISTINQINDEX, vlistinqindex, INT, INT, INT)
+FCALLSCSUB4 (vlistDefFlag, VLISTDEFFLAG, vlistdefflag, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, vlistInqFlag, VLISTINQFLAG, vlistinqflag, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistFindVar, VLISTFINDVAR, vlistfindvar, INT, INT)
+FCALLSCFUN3 (INT, vlistFindLevel, VLISTFINDLEVEL, vlistfindlevel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistMergedVar, VLISTMERGEDVAR, vlistmergedvar, INT, INT)
+FCALLSCFUN3 (INT, vlistMergedLevel, VLISTMERGEDLEVEL, vlistmergedlevel, INT, INT, INT)
+FCALLSCSUB0 (cdiClearAdditionalKeys, CDICLEARADDITIONALKEYS, cdiclearadditionalkeys)
+FCALLSCSUB1 (cdiDefAdditionalKey, CDIDEFADDITIONALKEY, cdidefadditionalkey, STRING)
+FCALLSCSUB4 (vlistDefVarIntKey, VLISTDEFVARINTKEY, vlistdefvarintkey, INT, INT, STRING, INT)
+FCALLSCSUB4 (vlistDefVarDblKey, VLISTDEFVARDBLKEY, vlistdefvardblkey, INT, INT, STRING, DOUBLE)
+FCALLSCFUN3 (INT, vlistHasVarKey, VLISTHASVARKEY, vlisthasvarkey, INT, INT, STRING)
+FCALLSCFUN3 (DOUBLE, vlistInqVarDblKey, VLISTINQVARDBLKEY, vlistinqvardblkey, INT, INT, STRING)
+FCALLSCFUN3 (INT, vlistInqVarIntKey, VLISTINQVARINTKEY, vlistinqvarintkey, INT, INT, STRING)
+
+/*  CDI attributes  */
+
+FCALLSCFUN3 (INT, cdiInqNatts, CDIINQNATTS, cdiinqnatts, INT, INT, PINT)
+FCALLSCFUN6 (INT, cdiInqAtt, CDIINQATT, cdiinqatt, INT, INT, INT, PSTRING, PINT, PINT)
+FCALLSCFUN3 (INT, cdiInqAttLen, CDIINQATTLEN, cdiinqattlen, INT, INT, STRING)
+FCALLSCFUN3 (INT, cdiInqAttType, CDIINQATTTYPE, cdiinqatttype, INT, INT, STRING)
+FCALLSCFUN3 (INT, cdiDelAtt, CDIDELATT, cdidelatt, INT, INT, STRING)
+FCALLSCFUN4 (INT, cdiCopyAtts, CDICOPYATTS, cdicopyatts, INT, INT, INT, INT)
+FCALLSCFUN6 (INT, cdiDefAttInt, CDIDEFATTINT, cdidefattint, INT, INT, STRING, INT, INT, INTV)
+FCALLSCFUN6 (INT, cdiDefAttFlt, CDIDEFATTFLT, cdidefattflt, INT, INT, STRING, INT, INT, DOUBLEV)
+FCALLSCFUN5 (INT, cdiDefAttTxt, CDIDEFATTTXT, cdidefatttxt, INT, INT, STRING, INT, PPSTRING)
+FCALLSCFUN5 (INT, cdiInqAttInt, CDIINQATTINT, cdiinqattint, INT, INT, STRING, INT, INTV)
+FCALLSCFUN5 (INT, cdiInqAttFlt, CDIINQATTFLT, cdiinqattflt, INT, INT, STRING, INT, DOUBLEV)
+FCALLSCFUN5 (INT, cdiInqAttTxt, CDIINQATTTXT, cdiinqatttxt, INT, INT, STRING, INT, PPSTRING)
+
+/*  GRID routines  */
+
+FCALLSCSUB2 (gridName, GRIDNAME, gridname, INT, PSTRING)
+FCALLSCFUN1 (STRING, gridNamePtr, GRIDNAMEPTR, gridnameptr, INT)
+FCALLSCSUB1 (gridCompress, GRIDCOMPRESS, gridcompress, INT)
+FCALLSCSUB2 (gridDefMaskGME, GRIDDEFMASKGME, griddefmaskgme, INT, INTV)
+FCALLSCFUN2 (INT, gridInqMaskGME, GRIDINQMASKGME, gridinqmaskgme, INT, INTV)
+FCALLSCSUB2 (gridDefMask, GRIDDEFMASK, griddefmask, INT, INTV)
+FCALLSCFUN2 (INT, gridInqMask, GRIDINQMASK, gridinqmask, INT, INTV)
+static int gridCreate_fwrap(int gridtype, int size)
+{
+  int v;
+  v = gridCreate(gridtype, (SizeType)size);
+  return v;
+}
+FCALLSCFUN2 (INT, gridCreate_fwrap, GRIDCREATE, gridcreate, INT, INT)
+FCALLSCSUB1 (gridDestroy, GRIDDESTROY, griddestroy, INT)
+FCALLSCFUN1 (INT, gridDuplicate, GRIDDUPLICATE, gridduplicate, INT)
+FCALLSCSUB2 (gridDefProj, GRIDDEFPROJ, griddefproj, INT, INT)
+FCALLSCFUN1 (INT, gridInqProj, GRIDINQPROJ, gridinqproj, INT)
+FCALLSCFUN1 (INT, gridInqProjType, GRIDINQPROJTYPE, gridinqprojtype, INT)
+FCALLSCFUN1 (INT, gridInqType, GRIDINQTYPE, gridinqtype, INT)
+static int gridInqSize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqSize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqSize_fwrap, GRIDINQSIZE, gridinqsize, INT)
+static void gridDefXsize_fwrap(int gridID, int xsize)
+{
+  gridDefXsize(gridID, (SizeType)xsize);
+}
+FCALLSCSUB2 (gridDefXsize_fwrap, GRIDDEFXSIZE, griddefxsize, INT, INT)
+static int gridInqXsize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqXsize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqXsize_fwrap, GRIDINQXSIZE, gridinqxsize, INT)
+static void gridDefYsize_fwrap(int gridID, int ysize)
+{
+  gridDefYsize(gridID, (SizeType)ysize);
+}
+FCALLSCSUB2 (gridDefYsize_fwrap, GRIDDEFYSIZE, griddefysize, INT, INT)
+static int gridInqYsize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqYsize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqYsize_fwrap, GRIDINQYSIZE, gridinqysize, INT)
+FCALLSCSUB2 (gridDefNP, GRIDDEFNP, griddefnp, INT, INT)
+FCALLSCFUN1 (INT, gridInqNP, GRIDINQNP, gridinqnp, INT)
+FCALLSCSUB2 (gridDefXvals, GRIDDEFXVALS, griddefxvals, INT, DOUBLEV)
+static int gridInqXvals_fwrap(int gridID, double xvals[])
+{
+  SizeType v;
+  v = gridInqXvals(gridID, xvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqXvals_fwrap, GRIDINQXVALS, gridinqxvals, INT, DOUBLEV)
+static int gridInqXvalsPart_fwrap(int gridID, int start, int size, double xvals[])
+{
+  SizeType v;
+  v = gridInqXvalsPart(gridID, start, (SizeType)size, xvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqXvalsPart_fwrap, GRIDINQXVALSPART, gridinqxvalspart, INT, INT, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridInqXIsc, GRIDINQXISC, gridinqxisc, INT)
+FCALLSCSUB2 (gridDefYvals, GRIDDEFYVALS, griddefyvals, INT, DOUBLEV)
+static int gridInqYvals_fwrap(int gridID, double yvals[])
+{
+  SizeType v;
+  v = gridInqYvals(gridID, yvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqYvals_fwrap, GRIDINQYVALS, gridinqyvals, INT, DOUBLEV)
+static int gridInqYvalsPart_fwrap(int gridID, int start, int size, double yvals[])
+{
+  SizeType v;
+  v = gridInqYvalsPart(gridID, start, (SizeType)size, yvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqYvalsPart_fwrap, GRIDINQYVALSPART, gridinqyvalspart, INT, INT, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridInqYIsc, GRIDINQYISC, gridinqyisc, INT)
+
+/*  CDI var keys  */
+
+
+/*  String keys  */
+
+
+/*  Integer keys  */
+
+
+/*  Floating point keys  */
+
+
+/*  Byte array keys  */
+
+FCALLSCFUN4 (INT, cdiDefKeyInt, CDIDEFKEYINT, cdidefkeyint, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, cdiInqKeyInt, CDIINQKEYINT, cdiinqkeyint, INT, INT, INT, PINT)
+FCALLSCFUN4 (INT, cdiDefKeyFloat, CDIDEFKEYFLOAT, cdidefkeyfloat, INT, INT, INT, DOUBLE)
+
+/*  cdiInqKeyFloat Get a float value from a key  */
+
+FCALLSCFUN4 (INT, cdiInqKeyFloat, CDIINQKEYFLOAT, cdiinqkeyfloat, INT, INT, INT, PDOUBLE)
+FCALLSCFUN4 (INT, cdiDefKeyString, CDIDEFKEYSTRING, cdidefkeystring, INT, INT, INT, STRING)
+FCALLSCFUN5 (INT, cdiInqKeyString, CDIINQKEYSTRING, cdiinqkeystring, INT, INT, INT, PSTRING, PINT)
+FCALLSCFUN4 (INT, cdiInqKeyLen, CDIINQKEYLEN, cdiinqkeylen, INT, INT, INT, PINT)
+FCALLSCFUN4 (INT, cdiCopyKeys, CDICOPYKEYS, cdicopykeys, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, cdiCopyKey, CDICOPYKEY, cdicopykey, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, cdiDeleteKey, CDIDELETEKEY, cdideletekey, INT, INT, INT)
+
+/*  GRID routines  */
+
+FCALLSCSUB2 (gridDefXname, GRIDDEFXNAME, griddefxname, INT, STRING)
+FCALLSCSUB2 (gridInqXname, GRIDINQXNAME, gridinqxname, INT, PSTRING)
+FCALLSCSUB2 (gridDefXlongname, GRIDDEFXLONGNAME, griddefxlongname, INT, STRING)
+FCALLSCSUB2 (gridInqXlongname, GRIDINQXLONGNAME, gridinqxlongname, INT, PSTRING)
+FCALLSCSUB2 (gridDefXunits, GRIDDEFXUNITS, griddefxunits, INT, STRING)
+FCALLSCSUB2 (gridInqXunits, GRIDINQXUNITS, gridinqxunits, INT, PSTRING)
+FCALLSCSUB2 (gridDefYname, GRIDDEFYNAME, griddefyname, INT, STRING)
+FCALLSCSUB2 (gridInqYname, GRIDINQYNAME, gridinqyname, INT, PSTRING)
+FCALLSCSUB2 (gridDefYlongname, GRIDDEFYLONGNAME, griddefylongname, INT, STRING)
+FCALLSCSUB2 (gridInqYlongname, GRIDINQYLONGNAME, gridinqylongname, INT, PSTRING)
+FCALLSCSUB2 (gridDefYunits, GRIDDEFYUNITS, griddefyunits, INT, STRING)
+FCALLSCSUB2 (gridInqYunits, GRIDINQYUNITS, gridinqyunits, INT, PSTRING)
+FCALLSCSUB2 (gridDefDatatype, GRIDDEFDATATYPE, griddefdatatype, INT, INT)
+FCALLSCFUN1 (INT, gridInqDatatype, GRIDINQDATATYPE, gridinqdatatype, INT)
+static double gridInqXval_fwrap(int gridID, int index)
+{
+  double v;
+  v = gridInqXval(gridID, (SizeType)index);
+  return v;
+}
+FCALLSCFUN2 (DOUBLE, gridInqXval_fwrap, GRIDINQXVAL, gridinqxval, INT, INT)
+static double gridInqYval_fwrap(int gridID, int index)
+{
+  double v;
+  v = gridInqYval(gridID, (SizeType)index);
+  return v;
+}
+FCALLSCFUN2 (DOUBLE, gridInqYval_fwrap, GRIDINQYVAL, gridinqyval, INT, INT)
+FCALLSCFUN1 (DOUBLE, gridInqXinc, GRIDINQXINC, gridinqxinc, INT)
+FCALLSCFUN1 (DOUBLE, gridInqYinc, GRIDINQYINC, gridinqyinc, INT)
+FCALLSCFUN1 (INT, gridIsCircular, GRIDISCIRCULAR, gridiscircular, INT)
+FCALLSCFUN1 (INT, gridInqTrunc, GRIDINQTRUNC, gridinqtrunc, INT)
+FCALLSCSUB2 (gridDefTrunc, GRIDDEFTRUNC, griddeftrunc, INT, INT)
+
+/*  Reference of an unstructured grid  */
+
+FCALLSCSUB2 (gridDefNumber, GRIDDEFNUMBER, griddefnumber, INT, INT)
+FCALLSCFUN1 (INT, gridInqNumber, GRIDINQNUMBER, gridinqnumber, INT)
+FCALLSCSUB2 (gridDefPosition, GRIDDEFPOSITION, griddefposition, INT, INT)
+FCALLSCFUN1 (INT, gridInqPosition, GRIDINQPOSITION, gridinqposition, INT)
+FCALLSCSUB2 (gridDefReference, GRIDDEFREFERENCE, griddefreference, INT, STRING)
+FCALLSCFUN2 (INT, gridInqReference, GRIDINQREFERENCE, gridinqreference, INT, PSTRING)
+FCALLSCSUB2 (gridDefUUID, GRIDDEFUUID, griddefuuid, INT, PVOID)
+FCALLSCSUB2 (gridInqUUID, GRIDINQUUID, gridinquuid, INT, PVOID)
+
+/*  Rotated Lon/Lat grid  */
+
+FCALLSCSUB4 (gridDefParamRLL, GRIDDEFPARAMRLL, griddefparamrll, INT, DOUBLE, DOUBLE, DOUBLE)
+FCALLSCSUB4 (gridInqParamRLL, GRIDINQPARAMRLL, gridinqparamrll, INT, PDOUBLE, PDOUBLE, PDOUBLE)
+
+/*  Hexagonal GME grid  */
+
+FCALLSCSUB5 (gridDefParamGME, GRIDDEFPARAMGME, griddefparamgme, INT, INT, INT, INT, INT)
+FCALLSCSUB5 (gridInqParamGME, GRIDINQPARAMGME, gridinqparamgme, INT, PINT, PINT, PINT, PINT)
+FCALLSCSUB2 (gridDefArea, GRIDDEFAREA, griddefarea, INT, DOUBLEV)
+FCALLSCSUB2 (gridInqArea, GRIDINQAREA, gridinqarea, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridHasArea, GRIDHASAREA, gridhasarea, INT)
+FCALLSCSUB2 (gridDefNvertex, GRIDDEFNVERTEX, griddefnvertex, INT, INT)
+FCALLSCFUN1 (INT, gridInqNvertex, GRIDINQNVERTEX, gridinqnvertex, INT)
+FCALLSCSUB2 (gridDefXbounds, GRIDDEFXBOUNDS, griddefxbounds, INT, DOUBLEV)
+static int gridInqXbounds_fwrap(int gridID, double xbounds[])
+{
+  SizeType v;
+  v = gridInqXbounds(gridID, xbounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqXbounds_fwrap, GRIDINQXBOUNDS, gridinqxbounds, INT, DOUBLEV)
+static int gridInqXboundsPart_fwrap(int gridID, int start, int size, double xbounds[])
+{
+  SizeType v;
+  v = gridInqXboundsPart(gridID, start, (SizeType)size, xbounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqXboundsPart_fwrap, GRIDINQXBOUNDSPART, gridinqxboundspart, INT, INT, INT, DOUBLEV)
+FCALLSCSUB2 (gridDefYbounds, GRIDDEFYBOUNDS, griddefybounds, INT, DOUBLEV)
+static int gridInqYbounds_fwrap(int gridID, double ybounds[])
+{
+  SizeType v;
+  v = gridInqYbounds(gridID, ybounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqYbounds_fwrap, GRIDINQYBOUNDS, gridinqybounds, INT, DOUBLEV)
+static int gridInqYboundsPart_fwrap(int gridID, int start, int size, double ybounds[])
+{
+  SizeType v;
+  v = gridInqYboundsPart(gridID, start, (SizeType)size, ybounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqYboundsPart_fwrap, GRIDINQYBOUNDSPART, gridinqyboundspart, INT, INT, INT, DOUBLEV)
+FCALLSCSUB3 (gridDefReducedPoints, GRIDDEFREDUCEDPOINTS, griddefreducedpoints, INT, INT, INTV)
+FCALLSCSUB2 (gridInqReducedPoints, GRIDINQREDUCEDPOINTS, gridinqreducedpoints, INT, INTV)
+FCALLSCSUB2 (gridChangeType, GRIDCHANGETYPE, gridchangetype, INT, INT)
+FCALLSCSUB2 (gridDefComplexPacking, GRIDDEFCOMPLEXPACKING, griddefcomplexpacking, INT, INT)
+FCALLSCFUN1 (INT, gridInqComplexPacking, GRIDINQCOMPLEXPACKING, gridinqcomplexpacking, INT)
+
+/*  ZAXIS routines  */
+
+FCALLSCSUB2 (zaxisName, ZAXISNAME, zaxisname, INT, PSTRING)
+FCALLSCFUN1 (STRING, zaxisNamePtr, ZAXISNAMEPTR, zaxisnameptr, INT)
+FCALLSCFUN2 (INT, zaxisCreate, ZAXISCREATE, zaxiscreate, INT, INT)
+FCALLSCSUB1 (zaxisDestroy, ZAXISDESTROY, zaxisdestroy, INT)
+FCALLSCFUN1 (INT, zaxisInqType, ZAXISINQTYPE, zaxisinqtype, INT)
+FCALLSCFUN1 (INT, zaxisInqSize, ZAXISINQSIZE, zaxisinqsize, INT)
+FCALLSCFUN1 (INT, zaxisDuplicate, ZAXISDUPLICATE, zaxisduplicate, INT)
+FCALLSCSUB2 (zaxisDefLevels, ZAXISDEFLEVELS, zaxisdeflevels, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqLevels, ZAXISINQLEVELS, zaxisinqlevels, INT, DOUBLEV)
+FCALLSCFUN1 (INT, zaxisInqCLen, ZAXISINQCLEN, zaxisinqclen, INT)
+FCALLSCSUB3 (zaxisDefLevel, ZAXISDEFLEVEL, zaxisdeflevel, INT, INT, DOUBLE)
+FCALLSCFUN2 (DOUBLE, zaxisInqLevel, ZAXISINQLEVEL, zaxisinqlevel, INT, INT)
+FCALLSCSUB2 (zaxisDefNlevRef, ZAXISDEFNLEVREF, zaxisdefnlevref, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqNlevRef, ZAXISINQNLEVREF, zaxisinqnlevref, INT)
+FCALLSCSUB2 (zaxisDefNumber, ZAXISDEFNUMBER, zaxisdefnumber, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqNumber, ZAXISINQNUMBER, zaxisinqnumber, INT)
+FCALLSCSUB2 (zaxisDefUUID, ZAXISDEFUUID, zaxisdefuuid, INT, PVOID)
+FCALLSCSUB2 (zaxisInqUUID, ZAXISINQUUID, zaxisinquuid, INT, PVOID)
+FCALLSCSUB2 (zaxisDefName, ZAXISDEFNAME, zaxisdefname, INT, STRING)
+FCALLSCSUB2 (zaxisInqName, ZAXISINQNAME, zaxisinqname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefLongname, ZAXISDEFLONGNAME, zaxisdeflongname, INT, STRING)
+FCALLSCSUB2 (zaxisInqLongname, ZAXISINQLONGNAME, zaxisinqlongname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefUnits, ZAXISDEFUNITS, zaxisdefunits, INT, STRING)
+FCALLSCSUB2 (zaxisInqUnits, ZAXISINQUNITS, zaxisinqunits, INT, PSTRING)
+FCALLSCSUB2 (zaxisInqStdname, ZAXISINQSTDNAME, zaxisinqstdname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefDatatype, ZAXISDEFDATATYPE, zaxisdefdatatype, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqDatatype, ZAXISINQDATATYPE, zaxisinqdatatype, INT)
+FCALLSCSUB2 (zaxisDefPositive, ZAXISDEFPOSITIVE, zaxisdefpositive, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqPositive, ZAXISINQPOSITIVE, zaxisinqpositive, INT)
+FCALLSCSUB1 (zaxisDefScalar, ZAXISDEFSCALAR, zaxisdefscalar, INT)
+FCALLSCFUN1 (INT, zaxisInqScalar, ZAXISINQSCALAR, zaxisinqscalar, INT)
+FCALLSCSUB3 (zaxisDefVct, ZAXISDEFVCT, zaxisdefvct, INT, INT, DOUBLEV)
+FCALLSCSUB2 (zaxisInqVct, ZAXISINQVCT, zaxisinqvct, INT, DOUBLEV)
+FCALLSCFUN1 (INT, zaxisInqVctSize, ZAXISINQVCTSIZE, zaxisinqvctsize, INT)
+FCALLSCSUB2 (zaxisDefLbounds, ZAXISDEFLBOUNDS, zaxisdeflbounds, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqLbounds, ZAXISINQLBOUNDS, zaxisinqlbounds, INT, DOUBLEV)
+FCALLSCFUN2 (DOUBLE, zaxisInqLbound, ZAXISINQLBOUND, zaxisinqlbound, INT, INT)
+FCALLSCSUB2 (zaxisDefUbounds, ZAXISDEFUBOUNDS, zaxisdefubounds, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqUbounds, ZAXISINQUBOUNDS, zaxisinqubounds, INT, DOUBLEV)
+FCALLSCFUN2 (DOUBLE, zaxisInqUbound, ZAXISINQUBOUND, zaxisinqubound, INT, INT)
+FCALLSCSUB2 (zaxisDefWeights, ZAXISDEFWEIGHTS, zaxisdefweights, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqWeights, ZAXISINQWEIGHTS, zaxisinqweights, INT, DOUBLEV)
+FCALLSCSUB2 (zaxisChangeType, ZAXISCHANGETYPE, zaxischangetype, INT, INT)
+
+/*  TAXIS routines  */
+
+FCALLSCFUN1 (INT, taxisCreate, TAXISCREATE, taxiscreate, INT)
+FCALLSCSUB1 (taxisDestroy, TAXISDESTROY, taxisdestroy, INT)
+FCALLSCFUN1 (INT, taxisDuplicate, TAXISDUPLICATE, taxisduplicate, INT)
+FCALLSCSUB2 (taxisCopyTimestep, TAXISCOPYTIMESTEP, taxiscopytimestep, INT, INT)
+FCALLSCSUB2 (taxisDefType, TAXISDEFTYPE, taxisdeftype, INT, INT)
+FCALLSCFUN1 (INT, taxisInqType, TAXISINQTYPE, taxisinqtype, INT)
+FCALLSCSUB2 (taxisDefVdate, TAXISDEFVDATE, taxisdefvdate, INT, INT)
+FCALLSCSUB2 (taxisDefVtime, TAXISDEFVTIME, taxisdefvtime, INT, INT)
+FCALLSCFUN1 (INT, taxisInqVdate, TAXISINQVDATE, taxisinqvdate, INT)
+FCALLSCFUN1 (INT, taxisInqVtime, TAXISINQVTIME, taxisinqvtime, INT)
+FCALLSCSUB2 (taxisDefRdate, TAXISDEFRDATE, taxisdefrdate, INT, INT)
+FCALLSCSUB2 (taxisDefRtime, TAXISDEFRTIME, taxisdefrtime, INT, INT)
+FCALLSCFUN1 (INT, taxisInqRdate, TAXISINQRDATE, taxisinqrdate, INT)
+FCALLSCFUN1 (INT, taxisInqRtime, TAXISINQRTIME, taxisinqrtime, INT)
+FCALLSCFUN1 (INT, taxisHasBounds, TAXISHASBOUNDS, taxishasbounds, INT)
+FCALLSCSUB1 (taxisWithBounds, TAXISWITHBOUNDS, taxiswithbounds, INT)
+FCALLSCSUB1 (taxisDeleteBounds, TAXISDELETEBOUNDS, taxisdeletebounds, INT)
+FCALLSCSUB3 (taxisDefVdateBounds, TAXISDEFVDATEBOUNDS, taxisdefvdatebounds, INT, INT, INT)
+FCALLSCSUB3 (taxisDefVtimeBounds, TAXISDEFVTIMEBOUNDS, taxisdefvtimebounds, INT, INT, INT)
+FCALLSCSUB3 (taxisInqVdateBounds, TAXISINQVDATEBOUNDS, taxisinqvdatebounds, INT, PINT, PINT)
+FCALLSCSUB3 (taxisInqVtimeBounds, TAXISINQVTIMEBOUNDS, taxisinqvtimebounds, INT, PINT, PINT)
+FCALLSCSUB2 (taxisDefCalendar, TAXISDEFCALENDAR, taxisdefcalendar, INT, INT)
+FCALLSCFUN1 (INT, taxisInqCalendar, TAXISINQCALENDAR, taxisinqcalendar, INT)
+FCALLSCSUB2 (taxisDefTunit, TAXISDEFTUNIT, taxisdeftunit, INT, INT)
+FCALLSCFUN1 (INT, taxisInqTunit, TAXISINQTUNIT, taxisinqtunit, INT)
+FCALLSCSUB2 (taxisDefForecastTunit, TAXISDEFFORECASTTUNIT, taxisdefforecasttunit, INT, INT)
+FCALLSCFUN1 (INT, taxisInqForecastTunit, TAXISINQFORECASTTUNIT, taxisinqforecasttunit, INT)
+FCALLSCSUB2 (taxisDefForecastPeriod, TAXISDEFFORECASTPERIOD, taxisdefforecastperiod, INT, DOUBLE)
+FCALLSCFUN1 (DOUBLE, taxisInqForecastPeriod, TAXISINQFORECASTPERIOD, taxisinqforecastperiod, INT)
+FCALLSCSUB2 (taxisDefNumavg, TAXISDEFNUMAVG, taxisdefnumavg, INT, INT)
+FCALLSCFUN1 (INT, taxisInqNumavg, TAXISINQNUMAVG, taxisinqnumavg, INT)
+FCALLSCFUN1 (STRING, taxisNamePtr, TAXISNAMEPTR, taxisnameptr, INT)
+FCALLSCFUN1 (STRING, tunitNamePtr, TUNITNAMEPTR, tunitnameptr, INT)
+
+/*  Institut routines  */
+
+FCALLSCFUN4 (INT, institutDef, INSTITUTDEF, institutdef, INT, INT, STRING, STRING)
+FCALLSCFUN4 (INT, institutInq, INSTITUTINQ, institutinq, INT, INT, STRING, STRING)
+FCALLSCFUN0 (INT, institutInqNumber, INSTITUTINQNUMBER, institutinqnumber)
+FCALLSCFUN1 (INT, institutInqCenter, INSTITUTINQCENTER, institutinqcenter, INT)
+FCALLSCFUN1 (INT, institutInqSubcenter, INSTITUTINQSUBCENTER, institutinqsubcenter, INT)
+FCALLSCFUN1 (STRING, institutInqNamePtr, INSTITUTINQNAMEPTR, institutinqnameptr, INT)
+FCALLSCFUN1 (STRING, institutInqLongnamePtr, INSTITUTINQLONGNAMEPTR, institutinqlongnameptr, INT)
+
+/*  Model routines  */
+
+FCALLSCFUN3 (INT, modelDef, MODELDEF, modeldef, INT, INT, STRING)
+FCALLSCFUN3 (INT, modelInq, MODELINQ, modelinq, INT, INT, STRING)
+FCALLSCFUN1 (INT, modelInqInstitut, MODELINQINSTITUT, modelinqinstitut, INT)
+FCALLSCFUN1 (INT, modelInqGribID, MODELINQGRIBID, modelinqgribid, INT)
+FCALLSCFUN1 (STRING, modelInqNamePtr, MODELINQNAMEPTR, modelinqnameptr, INT)
+
+/*  Table routines  */
+
+FCALLSCSUB2 (tableWrite, TABLEWRITE, tablewrite, STRING, INT)
+FCALLSCFUN1 (INT, tableRead, TABLEREAD, tableread, STRING)
+FCALLSCFUN3 (INT, tableDef, TABLEDEF, tabledef, INT, INT, STRING)
+FCALLSCFUN1 (STRING, tableInqNamePtr, TABLEINQNAMEPTR, tableinqnameptr, INT)
+FCALLSCFUN3 (INT, tableInq, TABLEINQ, tableinq, INT, INT, STRING)
+FCALLSCFUN0 (INT, tableInqNumber, TABLEINQNUMBER, tableinqnumber)
+FCALLSCFUN1 (INT, tableInqNum, TABLEINQNUM, tableinqnum, INT)
+FCALLSCFUN1 (INT, tableInqModel, TABLEINQMODEL, tableinqmodel, INT)
+FCALLSCSUB6 (tableInqEntry, TABLEINQENTRY, tableinqentry, INT, INT, INT, PSTRING, PSTRING, PSTRING)
+
+/*  Subtype routines  */
+
+FCALLSCFUN1 (INT, subtypeCreate, SUBTYPECREATE, subtypecreate, INT)
+
+/*  Gives a textual summary of the variable subtype  */
+
+FCALLSCSUB1 (subtypePrint, SUBTYPEPRINT, subtypeprint, INT)
+
+/*  Compares two subtype data structures  */
+
+FCALLSCFUN2 (INT, subtypeCompare, SUBTYPECOMPARE, subtypecompare, INT, INT)
+FCALLSCFUN1 (INT, subtypeInqSize, SUBTYPEINQSIZE, subtypeinqsize, INT)
+FCALLSCFUN1 (INT, subtypeInqActiveIndex, SUBTYPEINQACTIVEINDEX, subtypeinqactiveindex, INT)
+FCALLSCSUB2 (subtypeDefActiveIndex, SUBTYPEDEFACTIVEINDEX, subtypedefactiveindex, INT, INT)
+
+/*  Generate a "query object" out of a key-value pair  */
+
+
+/*  Generate an AND-combined "query object" out of two previous query objects  */
+
+FCALLSCFUN3 (INT, subtypeInqTile, SUBTYPEINQTILE, subtypeinqtile, INT, INT, INT)
+FCALLSCFUN4 (INT, subtypeInqAttribute, SUBTYPEINQATTRIBUTE, subtypeinqattribute, INT, INT, STRING, PINT)
+FCALLSCFUN2 (INT, vlistInqVarSubtype, VLISTINQVARSUBTYPE, vlistinqvarsubtype, INT, INT)
+FCALLSCSUB3 (gribapiLibraryVersion, GRIBAPILIBRARYVERSION, gribapilibraryversion, PINT, PINT, PINT)
+
+/*  Compatibility functions for release 1.8.3 (obsolete functions)  */
+
+FCALLSCSUB2 (zaxisDefLtype, ZAXISDEFLTYPE, zaxisdefltype, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTypeOfGeneratingProcess, VLISTINQVARTYPEOFGENERATINGPROCESS, vlistinqvartypeofgeneratingprocess, INT, INT)
+FCALLSCSUB3 (vlistDefVarTypeOfGeneratingProcess, VLISTDEFVARTYPEOFGENERATINGPROCESS, vlistdefvartypeofgeneratingprocess, INT, INT, INT)
+FCALLSCSUB3 (vlistDefVarProductDefinitionTemplate, VLISTDEFVARPRODUCTDEFINITIONTEMPLATE, vlistdefvarproductdefinitiontemplate, INT, INT, INT)
+
+/*  End of fortran interface  */
+
+
+#if defined __clang__
+#  pragma GCC diagnostic pop
+#endif
+
+// clang-format on
+
+#endif
diff --git a/src/cdilib.c b/src/cdilib.c
new file mode 100644
index 000000000..96282c046
--- /dev/null
+++ b/src/cdilib.c
@@ -0,0 +1,76205 @@
+
+/* Automatically generated by k202069 at 2024-09-11, do not edit */
+
+/* CDILIB_VERSION="2.4.3" */
+
+#if defined(_WIN32) || defined(_WIN64)
+#define restrict
+#define ssize_t long
+#elif ! defined HAVE_CONFIG_H
+#define HAVE_UNISTD_H
+#endif
+
+#ifdef _ARCH_PWR6
+#pragma options nostrict
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600
+#endif
+
+#ifdef  HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <float.h>
+#include <math.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <assert.h>
+
+#ifdef HAVE_LIBGRIB_API
+#include <grib_api.h>
+#endif
+
+#ifdef HAVE_MMAP
+#include <sys/mman.h> /* mmap() is defined in this header */
+#endif
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef HAVE_LIBSZ
+#include <szlib.h>
+#endif
+
+#ifndef HAVE_CONFIG_H
+#define  HAVE_LIBGRIB      1
+#define  HAVE_LIBCGRIBEX   1
+#define  HAVE_LIBSERVICE   1
+#define  HAVE_LIBEXTRA     1
+#define  HAVE_LIBIEG       1
+#define  CDI              -1
+#endif
+
+#ifndef ASYNC_WORKER_H
+#define ASYNC_WORKER_H
+
+typedef struct AsyncJob AsyncJob;
+typedef struct AsyncManager AsyncManager;
+
+// a negative threadCount gives the number of cores that should remain unused by the worker threads, returns an error code
+int AsyncWorker_init(AsyncManager **jobManager, int threadCount);
+
+// executes work(data) in a worker thread, must be followed by a call to AsyncWorker_wait()
+AsyncJob *AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data);
+
+// waits for the async job to finish and returns its result (or some other error code)
+int AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job);
+
+// return the number of workers that are currently idle
+int AsyncWorker_availableWorkers(AsyncManager *jobManager);
+
+// waits for all pending jobs to finish, stops all workers, returns a non-zero error code from a pending job if there were any
+int AsyncWorker_finalize(AsyncManager *jobManager);
+
+#endif
+#ifndef CDI_DATETIME_H
+#define CDI_DATETIME_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+// clang-format off
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+  int   year;      // year of date
+  short month;     // month of date
+  short day;       // day of date
+} CdiDate;
+
+typedef struct
+{
+  short hour;      // hour part of time
+  short minute;	   // minute part of time
+  short second;	   // second part of time
+  short ms;        // milli-second part of time. 0<=ms<=999
+} CdiTime;
+
+typedef struct
+{
+  CdiDate date;    // date elements
+  CdiTime time;    // time elements
+} CdiDateTime;
+
+CdiDateTime cdiDateTime_set(int64_t date, int time);
+CdiDate cdiDate_set(int64_t date);
+CdiTime cdiTime_set(int time);
+int64_t cdiDate_get(CdiDate cdiDate);
+int cdiTime_get(CdiTime cdiTime);
+
+CdiDate cdiDate_encode(int year, int month, int day);
+void cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day);
+CdiTime cdiTime_encode(int hour, int minute, int second, int ms);
+void cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms);
+
+void cdiDate_init(CdiDate *cdiDate);
+void cdiTime_init(CdiTime *cdiTime);
+void cdiDateTime_init(CdiDateTime *cdiDateTime);
+
+bool cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2);
+bool cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2);
+bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2);
+bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2);
+bool cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2);
+bool cdiDateTime_isNull(CdiDateTime cdiDateTime);
+
+const char *CdiDateTime_string(CdiDateTime cdiDateTime);
+
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* CDI_DATETIME_H */
+/*
+  CDI C header file
+
+  This is the only file that must be included to use the CDI library from C.
+*/
+
+#ifndef CDI_H_
+#define CDI_H_
+
+// clang-format off
+
+#include <stdio.h>
+#include <stdint.h>    // int64_t
+#include <stdbool.h>
+#include <sys/types.h>
+
+#ifndef CDI_SIZE_TYPE
+#define CDI_SIZE_TYPE int
+#endif
+
+typedef CDI_SIZE_TYPE SizeType;
+
+//FINT_ON  <--- don't change or remove this line!!!
+// Start of fortran interface for the following routines (make_fint.c)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define  CDI_MAX_NAME             256   // Max length of a name
+
+#define  CDI_UNDEFID               -1
+#define  CDI_GLOBAL                -1   // Global var ID for vlist and Z-axis
+#define  CDI_XAXIS                  1   // X-axis ID for grid
+#define  CDI_YAXIS                  2   // Y-axis ID for grid
+
+// Byte order
+
+#define  CDI_BIGENDIAN              0   // Byte order BIGENDIAN
+#define  CDI_LITTLEENDIAN           1   // Byte order LITTLEENDIAN
+#define  CDI_PDPENDIAN              2
+
+#define  CDI_REAL                   1   // Real numbers
+#define  CDI_COMP                   2   // Complex numbers
+#define  CDI_BOTH                   3   // Both numbers
+
+// Error identifier
+
+#define	 CDI_NOERR        	    0   // No Error
+#define  CDI_EEOF                  -1   // The end of file was encountered
+#define  CDI_ETMOF                 -9   // Too many open files
+#define  CDI_ESYSTEM              -10   // Operating system error
+#define  CDI_EINVAL               -20   // Invalid argument
+#define  CDI_EISDIR               -21   // Is a directory
+#define  CDI_EISEMPTY             -22   // Is empty
+#define  CDI_EUFTYPE              -23   // Unsupported file type
+#define  CDI_ELIBNAVAIL           -24   // xxx library not available
+#define  CDI_EUFSTRUCT            -25   // Unsupported file structure
+#define  CDI_EUNC4                -26   // Unsupported NetCDF4 structure
+#define  CDI_EDIMSIZE             -27   // Invalid dimension size
+#define  CDI_EQENF                -50   // Query entries not found
+#define  CDI_EQNAVAIL             -51   // Query not available for file type
+#define  CDI_ELIMIT               -99   // Internal limits exceeded
+
+// File types
+
+#define  CDI_FILETYPE_GRB           1   // File type GRIB
+#define  CDI_FILETYPE_GRB2          2   // File type GRIB version 2
+#define  CDI_FILETYPE_NC            3   // File type NetCDF
+#define  CDI_FILETYPE_NC2           4   // File type NetCDF version 2 (64-bit offset)
+#define  CDI_FILETYPE_NC4           5   // File type NetCDF version 4
+#define  CDI_FILETYPE_NC4C          6   // File type NetCDF version 4 (classic)
+#define  CDI_FILETYPE_NC5           7   // File type NetCDF version 5 (64-bit data)
+#define  CDI_FILETYPE_SRV           8   // File type SERVICE
+#define  CDI_FILETYPE_EXT           9   // File type EXTRA
+#define  CDI_FILETYPE_IEG          10   // File type IEG
+#define  CDI_FILETYPE_NCZARR       11   // File type NetCDF NCZarr Data Model
+
+// Compatibility defines for release 1.8.3 (obsolete defines)
+#define  FILETYPE_GRB               1   // File type GRIB
+#define  FILETYPE_GRB2              2   // File type GRIB version 2
+#define  FILETYPE_NC                3   // File type NetCDF
+#define  FILETYPE_NC2               4   // File type NetCDF version 2 (64-bit offset)
+#define  FILETYPE_NC4               5   // File type NetCDF version 4
+
+// Protocols (in filename/URI)
+
+#define CDI_PROTOCOL_OTHER          0   // Any other protocol (might be supported by NetCDF library)
+#define CDI_PROTOCOL_FILE           1
+#define CDI_PROTOCOL_FDB            2
+#define CDI_PROTOCOL_ACROSS         3
+
+// Compress types
+
+#define  CDI_COMPRESS_NONE          0
+#define  CDI_COMPRESS_SZIP          1
+#define  CDI_COMPRESS_AEC           2
+#define  CDI_COMPRESS_ZIP           3
+#define  CDI_COMPRESS_JPEG          4
+#define  CDI_COMPRESS_FILTER        5
+
+// external data types
+
+// Compatibility defines for release 1.8.3 (obsolete defines)
+#define  DATATYPE_PACK16           16
+#define  DATATYPE_PACK24           24
+#define  DATATYPE_FLT32           132
+#define  DATATYPE_FLT64           164
+#define  DATATYPE_INT32           232
+#define  DATATYPE_INT             251
+
+#define  CDI_DATATYPE_PACK          0
+#define  CDI_DATATYPE_PACK1         1
+#define  CDI_DATATYPE_PACK2         2
+#define  CDI_DATATYPE_PACK3         3
+#define  CDI_DATATYPE_PACK4         4
+#define  CDI_DATATYPE_PACK5         5
+#define  CDI_DATATYPE_PACK6         6
+#define  CDI_DATATYPE_PACK7         7
+#define  CDI_DATATYPE_PACK8         8
+#define  CDI_DATATYPE_PACK9         9
+#define  CDI_DATATYPE_PACK10       10
+#define  CDI_DATATYPE_PACK11       11
+#define  CDI_DATATYPE_PACK12       12
+#define  CDI_DATATYPE_PACK13       13
+#define  CDI_DATATYPE_PACK14       14
+#define  CDI_DATATYPE_PACK15       15
+#define  CDI_DATATYPE_PACK16       16
+#define  CDI_DATATYPE_PACK17       17
+#define  CDI_DATATYPE_PACK18       18
+#define  CDI_DATATYPE_PACK19       19
+#define  CDI_DATATYPE_PACK20       20
+#define  CDI_DATATYPE_PACK21       21
+#define  CDI_DATATYPE_PACK22       22
+#define  CDI_DATATYPE_PACK23       23
+#define  CDI_DATATYPE_PACK24       24
+#define  CDI_DATATYPE_PACK25       25
+#define  CDI_DATATYPE_PACK26       26
+#define  CDI_DATATYPE_PACK27       27
+#define  CDI_DATATYPE_PACK28       28
+#define  CDI_DATATYPE_PACK29       29
+#define  CDI_DATATYPE_PACK30       30
+#define  CDI_DATATYPE_PACK31       31
+#define  CDI_DATATYPE_PACK32       32
+#define  CDI_DATATYPE_CPX32        64
+#define  CDI_DATATYPE_CPX64       128
+#define  CDI_DATATYPE_FLT32       132
+#define  CDI_DATATYPE_FLT64       164
+#define  CDI_DATATYPE_INT8        208
+#define  CDI_DATATYPE_INT16       216
+#define  CDI_DATATYPE_INT32       232
+#define  CDI_DATATYPE_UINT8       308
+#define  CDI_DATATYPE_UINT16      316
+#define  CDI_DATATYPE_UINT32      332
+
+// internal data types
+#define  CDI_DATATYPE_INT         251
+#define  CDI_DATATYPE_FLT         252
+#define  CDI_DATATYPE_TXT         253
+#define  CDI_DATATYPE_CPX         254
+#define  CDI_DATATYPE_UCHAR       255
+#define  CDI_DATATYPE_LONG        256
+#define  CDI_DATATYPE_UINT        257
+
+// Chunk types
+
+#define  CDI_CHUNK_AUTO             1  // use default chunk size
+#define  CDI_CHUNK_GRID             2
+#define  CDI_CHUNK_LINES            3
+
+// GRID types
+
+#define  GRID_GENERIC               1  // Generic grid
+#define  GRID_GAUSSIAN              2  // Regular Gaussian lon/lat grid
+#define  GRID_GAUSSIAN_REDUCED      3  // Reduced Gaussian lon/lat grid
+#define  GRID_LONLAT                4  // Regular longitude/latitude grid
+#define  GRID_SPECTRAL              5  // Spherical harmonic coefficients (spectral gaussian)
+#define  GRID_FOURIER               6  // Fourier coefficients (spectral gaussian)
+#define  GRID_GME                   7  // Icosahedral-hexagonal GME grid
+#define  GRID_TRAJECTORY            8  // Trajectory
+#define  GRID_UNSTRUCTURED          9  // General unstructured grid
+#define  GRID_CURVILINEAR          10  // Curvilinear grid
+#define  GRID_PROJECTION           12  // Projected coordinates
+#define  GRID_CHARXY               13  // One horizontal character dimension
+
+#define  CDI_PROJ_RLL              21  // Rotated Latitude Longitude
+#define  CDI_PROJ_LCC              22  // Lambert Conformal Conic
+#define  CDI_PROJ_LAEA             23  // Lambert Azimuthal Equal Area
+#define  CDI_PROJ_SINU             24  // Sinusoidal
+#define  CDI_PROJ_STERE            25  // Polar stereographic
+#define  CDI_PROJ_HEALPIX          26  // Healpix
+
+// ZAXIS types
+
+#define  ZAXIS_SURFACE              0  // Surface level
+#define  ZAXIS_GENERIC              1  // Generic level
+#define  ZAXIS_HYBRID               2  // Hybrid level
+#define  ZAXIS_HYBRID_HALF          3  // Hybrid half level
+#define  ZAXIS_PRESSURE             4  // Isobaric pressure level in Pascal
+#define  ZAXIS_HEIGHT               5  // Height above ground
+#define  ZAXIS_DEPTH_BELOW_SEA      6  // Depth below sea level in meters
+#define  ZAXIS_DEPTH_BELOW_LAND     7  // Depth below land surface in centimeters
+#define  ZAXIS_ISENTROPIC           8  // Isentropic
+#define  ZAXIS_TRAJECTORY           9  // Trajectory
+#define  ZAXIS_ALTITUDE            10  // Altitude above mean sea level in meters
+#define  ZAXIS_SIGMA               11  // Sigma level
+#define  ZAXIS_MEANSEA             12  // Mean sea level
+#define  ZAXIS_TOA                 13  // Norminal top of atmosphere
+#define  ZAXIS_SEA_BOTTOM          14  // Sea bottom
+#define  ZAXIS_ATMOSPHERE          15  // Entire atmosphere
+#define  ZAXIS_CLOUD_BASE          16  // Cloud base level
+#define  ZAXIS_CLOUD_TOP           17  // Level of cloud tops
+#define  ZAXIS_ISOTHERM_ZERO       18  // Level of 0o C isotherm
+#define  ZAXIS_SNOW                19  // Snow level
+#define  ZAXIS_LAKE_BOTTOM         20  // Lake or River Bottom
+#define  ZAXIS_SEDIMENT_BOTTOM     21  // Bottom Of Sediment Layer
+#define  ZAXIS_SEDIMENT_BOTTOM_TA  22  // Bottom Of Thermally Active Sediment Layer
+#define  ZAXIS_SEDIMENT_BOTTOM_TW  23  // Bottom Of Sediment Layer Penetrated By Thermal Wave
+#define  ZAXIS_MIX_LAYER           24  // Mixing Layer
+#define  ZAXIS_REFERENCE           25  // zaxis reference number
+#define  ZAXIS_CHAR                26  // Area types
+#define  ZAXIS_TROPOPAUSE          27  // Tropopause
+
+// SUBTYPE types
+
+enum {
+  SUBTYPE_TILES                   = 0  // Tiles variable
+};
+
+#define MAX_KV_PAIRS_MATCH 10
+
+/* Data structure defining a key-value search, possibly with multiple
+   key-value pairs in combination.
+
+   Currently, only multiple pairs combined by AND are supported.
+*/
+typedef struct  {
+  int nAND;                                   // no. of key-value pairs that have to match
+  int key_value_pairs[2][MAX_KV_PAIRS_MATCH]; // key-value pairs
+} subtype_query_t;
+
+
+
+// TIME types
+
+#define  TIME_CONSTANT            0  // Time constant
+#define  TIME_VARYING             1  // Time varying
+#define  TIME_VARIABLE            1  // obsolete, use TIME_VARYING
+
+// TSTEP types
+
+#define  TSTEP_CONSTANT           0  // obsolete, use TIME_CONSTANT
+#define  TSTEP_INSTANT            1  // Instant
+#define  TSTEP_AVG                2  // Average
+#define  TSTEP_ACCUM              3  // Accumulation
+#define  TSTEP_MAX                4  // Maximum
+#define  TSTEP_MIN                5  // Minimum
+#define  TSTEP_DIFF               6  // Difference
+#define  TSTEP_RMS                7  // Root mean square
+#define  TSTEP_SD                 8  // Standard deviation
+#define  TSTEP_COV                9  // Covariance
+#define  TSTEP_RATIO             10  // Ratio
+#define  TSTEP_SUM               11  // Summation
+#define  TSTEP_RANGE             12
+#define  TSTEP_INSTANT2          13
+#define  TSTEP_INSTANT3          14
+
+// TAXIS types
+
+#define  TAXIS_ABSOLUTE           1
+#define  TAXIS_RELATIVE           2
+#define  TAXIS_FORECAST           3
+
+// TUNIT types
+
+#define  TUNIT_SECOND             1
+#define  TUNIT_MINUTE             2
+#define  TUNIT_QUARTER            3
+#define  TUNIT_30MINUTES          4
+#define  TUNIT_HOUR               5
+#define  TUNIT_3HOURS             6
+#define  TUNIT_6HOURS             7
+#define  TUNIT_12HOURS            8
+#define  TUNIT_DAY                9
+#define  TUNIT_MONTH             10
+#define  TUNIT_YEAR              11
+
+// CALENDAR types
+
+#define  CALENDAR_STANDARD        0  // don't change this value (used also in cgribexlib)!
+#define  CALENDAR_GREGORIAN       1
+#define  CALENDAR_PROLEPTIC       2
+#define  CALENDAR_360DAYS         3
+#define  CALENDAR_365DAYS         4
+#define  CALENDAR_366DAYS         5
+#define  CALENDAR_NONE            6
+
+// number of unsigned char needed to store UUID
+#define  CDI_UUID_SIZE           16
+
+// Structs that are used to return data to the user
+
+typedef struct CdiParam { int discipline; int category; int number; } CdiParam;
+
+
+// Opaque types
+typedef struct CdiIterator CdiIterator;
+typedef struct CdiGribIterator CdiGribIterator;
+
+// CDI control routines
+
+void    cdiReset(void);
+
+const char *cdiStringError(int cdiErrno);
+void    cdiDebug(int debug);
+
+const char *cdiLibraryVersion(void);
+void    cdiPrintVersion(void);
+
+int     cdiHaveFiletype(int filetype);
+
+void    cdiDefMissval(double missval);
+double  cdiInqMissval(void);
+void    cdiDefGlobal(const char *string, int val);
+
+int     namespaceNew(void);
+void    namespaceSetActive(int namespaceID);
+int     namespaceGetActive(void);
+void    namespaceDelete(int namespaceID);
+
+
+// CDI converter routines
+
+// parameter
+
+void    cdiParamToString(int param, char *paramstr, int maxlen);
+
+void    cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis);
+int     cdiEncodeParam(int pnum, int pcat, int pdis);
+
+// date format:  YYYYMMDD
+// time format:    hhmmss
+
+void    cdiDecodeDate(int date, int *year, int *month, int *day);
+int     cdiEncodeDate(int year, int month, int day);
+
+void    cdiDecodeTime(int time, int *hour, int *minute, int *second);
+int     cdiEncodeTime(int hour, int minute, int second);
+
+
+// STREAM control routines
+
+int     cdiGetFiletype(const char *uri, int *byteorder);
+int     cdiGetProtocol(const char *uri, const char **filename);
+
+//      streamOpenRead: Open a dataset for reading
+int     streamOpenRead(const char *path);
+
+//      streamOpenWrite: Create a new dataset
+int     streamOpenWrite(const char *path, int filetype);
+
+int     streamOpenAppend(const char *path);
+
+//      streamClose: Close an open dataset
+void    streamClose(int streamID);
+
+//      streamSync: Synchronize an Open Dataset to Disk
+void    streamSync(int streamID);
+
+void    streamDefMaxSteps(int streamID, int maxSteps);
+void    streamDefNumWorker(int streamID, int numWorker);
+
+int     streamInqNumSteps(int streamID);
+
+//      streamDefVlist: Define the Vlist for a stream
+void    streamDefVlist(int streamID, int vlistID);
+
+//      streamInqVlist: Get the Vlist of a stream
+int     streamInqVlist(int streamID);
+
+//      streamInqFiletype: Get the filetype
+int     streamInqFiletype(int streamID);
+
+//      streamDefByteorder: Define the byteorder
+void    streamDefByteorder(int streamID, int byteorder);
+
+//      streamInqByteorder: Get the byteorder
+int     streamInqByteorder(int streamID);
+
+void    streamDefShuffle(int streamID, int shuffle);
+
+void    streamDefFilter(int streamID, const char *filterSpec);
+
+//      streamDefCompType: Define compression type
+void    streamDefCompType(int streamID, int comptype);
+
+//      streamInqCompType: Get compression type
+int     streamInqCompType(int streamID);
+
+//      streamDefCompLevel: Define compression level
+void    streamDefCompLevel(int streamID, int complevel);
+
+//      streamInqCompLevel: Get compression level
+int     streamInqCompLevel(int streamID);
+
+//      streamDefTimestep: Define time step
+int     streamDefTimestep(int streamID, int tsID);
+
+//      streamInqTimestep: Get time step
+int     streamInqTimestep(int streamID, int tsID);
+
+//      PIO: query currently set timestep id
+int     streamInqCurTimestepID(int streamID);
+
+const char *streamFilename(int streamID);
+const char *streamFilesuffix(int filetype);
+
+SizeType streamNvals(int streamID);
+
+int     streamInqNvars(int streamID);
+
+// STREAM var I/O routines (random access)
+
+//      streamWriteVar: Write a variable
+void    streamWriteVar(int streamID, int varID, const double data[], SizeType numMissVals);
+void    streamWriteVarF(int streamID, int varID, const float data[], SizeType numMissVals);
+
+//      streamReadVar: Read a variable
+void    streamReadVar(int streamID, int varID, double data[], SizeType *numMissVals);
+void    streamReadVarF(int streamID, int varID, float data[], SizeType *numMissVals);
+void    streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memtype);
+
+//      streamWriteVarSlice: Write a horizontal slice of a variable
+void    streamWriteVarSlice(int streamID, int varID, int levelID, const double data[], SizeType numMissVals);
+void    streamWriteVarSliceF(int streamID, int varID, int levelID, const float data[], SizeType numMissVals);
+void    streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memtype);
+
+//      streamReadVarSlice: Read a horizontal slice of a variable
+void    streamReadVarSlice(int streamID, int varID, int levelID, double data[], SizeType *numMissVals);
+void    streamReadVarSliceF(int streamID, int varID, int levelID, float data[], SizeType *numMissVals);
+
+void    streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double data[], SizeType numMissVals);
+void    streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float data[], SizeType numMissVals);
+
+
+// STREAM record I/O routines (sequential access)
+
+void    streamDefRecord(int streamID, int  varID, int  levelID);
+void    streamInqRecord(int streamID, int *varID, int *levelID);
+void    streamWriteRecord(int streamID, const double data[], SizeType numMissVals);
+void    streamWriteRecordF(int streamID, const float data[], SizeType numMissVals);
+void    streamReadRecord(int streamID, double data[], SizeType *numMissVals);
+void    streamReadRecordF(int streamID, float data[], SizeType *numMissVals);
+void    streamCopyRecord(int streamIDdest, int streamIDsrc);
+
+void    streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum);
+
+
+// File driven I/O (may yield better performance than using the streamXXX functions)
+
+// Creation & Destruction
+CdiIterator *cdiIterator_new(const char *path);  // Requires a subsequent call to cdiIteratorNextField() to point the iterator at the first field.
+CdiIterator *cdiIterator_clone(CdiIterator *me);
+char *cdiIterator_serialize(CdiIterator *me);  // Returns a malloc'ed string.
+CdiIterator *cdiIterator_deserialize(const char *description);  // description is a string that was returned by cdiIteratorSerialize(). Returns a copy of the original iterator.
+void cdiIterator_print(CdiIterator *me, FILE *stream);
+void cdiIterator_delete(CdiIterator *me);
+
+// Advancing an iterator
+int cdiIterator_nextField(CdiIterator *me);      // Points the iterator at the next field, returns CDI_EEOF if there are no more fields in the file.
+
+// Introspecting metadata
+// All outXXX arguments to these functions may be NULL.
+char *cdiIterator_inqStartTime(CdiIterator *me);    // Returns the (start) time as an ISO-8601 coded string. The caller is responsible to Free() the returned string.
+char *cdiIterator_inqEndTime(CdiIterator *me);      // Returns the end time of an integration period as an ISO-8601 coded string, or NULL if there is no end time. The caller is responsible to Free() the returned string.
+char *cdiIterator_inqRTime(CdiIterator *me);        // Returns the reference date as an ISO-8601 coded string. The caller is responsible to Free() the returned string.
+char *cdiIterator_inqVTime(CdiIterator *me);        // Returns the validity date as an ISO-8601 coded string. The caller is responsible to Free() the returned string.
+int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName_optional, char **outLongName_optional, char **outStdName_optional, char **outUnit_optional);      // callers are responsible to Free() strings that they request
+int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1_optional, double *outValue2_optional);       // outValue2 is only written to if the level is a hybrid level
+int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber_optional, int *outLevelCount_optional, unsigned char outUuid_optional[CDI_UUID_SIZE]);   // outUuid must point to a buffer of 16 bytes, returns an error code if no generalized zaxis is used.
+int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); // Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileIndex and *outTileAttribute will be set to -1 in this case.
+int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); // outTileAttributeCount is the count for the tile associated with the current field, a total attribute count cannot be inquired. Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileCount and *outTileAttributeCount will be set to 0 in this case.
+CdiParam cdiIterator_inqParam(CdiIterator *me);
+void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber);	// Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround.
+int cdiIterator_inqDatatype(CdiIterator *me);
+int cdiIterator_inqFiletype(CdiIterator *me);
+int cdiIterator_inqTsteptype(CdiIterator *me);
+char *cdiIterator_inqVariableName(CdiIterator *me);     // The caller is responsible to Free() the returned buffer.
+int cdiIterator_inqGridId(CdiIterator *me);             // The returned id is only valid until the next call to cdiIteratorNextField().
+
+// Reading data
+void cdiIterator_readField(CdiIterator *me, double data[], SizeType *numMissVals_optional);
+void cdiIterator_readFieldF(CdiIterator *me, float data[], SizeType *numMissVals_optional);
+// TODO[NH]: Add functions to read partial fields.
+
+
+// Direct access to grib fields
+CdiGribIterator *cdiGribIterator_clone(CdiIterator *me);  // Returns NULL if the associated file is not a GRIB file.
+void cdiGribIterator_delete(CdiGribIterator *me);
+
+// Callthroughs to GRIB-API
+int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *value);         // Same semantics as grib_get_long().
+int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *value);     // Same semantics as grib_get_double().
+int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *value);     // Same semantics as grib_get_length().
+int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *value, size_t *length);       // Same semantics as grib_get_string().
+int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *value);       // Same semantics as grib_get_size().
+int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *value, size_t *array_size);       // Same semantics as grib_get_long_array().
+int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *value, size_t *array_size);   // Same semantics as grib_get_double_array().
+
+// Convenience functions for accessing GRIB-API keys
+int cdiGribIterator_inqEdition(CdiGribIterator *me);
+long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key);       // Aborts on failure to fetch the given key.
+long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue); // Returns the default value if the given key is not present.
+double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key);   // Aborts on failure to fetch the given key.
+double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue); // Returns the default value if the given key is not present.
+char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key);    // Returns a malloc'ed string.
+
+// VLIST routines
+
+//      vlistCreate: Create a variable list
+int     vlistCreate(void);
+
+//      vlistDestroy: Destroy a variable list
+void    vlistDestroy(int vlistID);
+
+//      vlistDuplicate: Duplicate a variable list
+int     vlistDuplicate(int vlistID);
+
+//      vlistCopyFlag: Copy some entries of a variable list
+void    vlistCopyFlag(int vlistID2, int vlistID1);
+
+void    vlistClearFlag(int vlistID);
+
+//      vlistCat: Concatenate two variable lists
+void    vlistCat(int vlistID2, int vlistID1);
+
+//      vlistMerge: Merge two variable lists
+void    vlistMerge(int vlistID2, int vlistID1);
+
+void    vlistPrint(int vlistID);
+
+//      vlistNumber: Number type in a variable list
+int     vlistNumber(int vlistID);
+
+//      vlistNvars: Number of variables in a variable list
+int     vlistNvars(int vlistID);
+
+//      vlistNumGrids: Number of grids in a variable list
+int     vlistNumGrids(int vlistID);
+
+//      vlistNumZaxis: Number of zaxis in a variable list
+int     vlistNumZaxis(int vlistID);
+
+//      vlistNsubtypes: Number of subtypes in a variable list
+int     vlistNsubtypes(int vlistID);
+
+void    vlistDefNtsteps(int vlistID, int nts);
+int     vlistNtsteps(int vlistID);
+SizeType vlistGridsizeMax(int vlistID);
+int     vlistGrid(int vlistID, int index);
+int     vlistGridIndex(int vlistID, int gridID);
+void    vlistChangeGridIndex(int vlistID, int index, int gridID);
+void    vlistChangeGrid(int vlistID, int gridID1, int gridID2);
+int     vlistZaxis(int vlistID, int index);
+int     vlistZaxisIndex(int vlistID, int zaxisID);
+void    vlistChangeZaxisIndex(int vlistID, int index, int zaxisID);
+void    vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2);
+int     vlistNumRecords(int vlistID);
+int     vlistSubtype(int vlistID, int index);
+int     vlistSubtypeIndex(int vlistID, int subtypeID);
+
+//      vlistDefTaxis: Define the time axis of a variable list
+void    vlistDefTaxis(int vlistID, int taxisID);
+
+//      vlistInqTaxis: Get the time axis of a variable list
+int     vlistInqTaxis(int vlistID);
+
+void    vlistDefTable(int vlistID, int tableID);
+int     vlistInqTable(int vlistID);
+void    vlistDefInstitut(int vlistID, int instID);
+int     vlistInqInstitut(int vlistID);
+void    vlistDefModel(int vlistID, int modelID);
+int     vlistInqModel(int vlistID);
+
+
+// VLIST VAR routines
+
+//      vlistDefVarTiles: Create a new tile-based variable
+int     vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID);
+
+//      vlistDefVar: Create a new variable
+int     vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype);
+
+void    vlistChangeVarGrid(int vlistID, int varID, int gridID);
+void    vlistChangeVarZaxis(int vlistID, int varID, int zaxisID);
+
+void    vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype);
+int     vlistInqVarGrid(int vlistID, int varID);
+int     vlistInqVarZaxis(int vlistID, int varID);
+
+//      used in MPIOM
+int     vlistInqVarID(int vlistID, int code);
+
+void    vlistDefVarTimetype(int vlistID, int varID, int timetype);
+int     vlistInqVarTimetype(int vlistID, int varID);
+
+void    vlistDefVarTsteptype(int vlistID, int varID, int tsteptype);
+
+//      vlistInqVarTsteptype: Get the timestep type of a Variable
+int     vlistInqVarTsteptype(int vlistID, int varID);
+
+void    vlistDefVarCompType(int vlistID, int varID, int comptype);
+int     vlistInqVarCompType(int vlistID, int varID);
+void    vlistDefVarCompLevel(int vlistID, int varID, int complevel);
+int     vlistInqVarCompLevel(int vlistID, int varID);
+
+//      vlistDefVarParam: Define the parameter number of a Variable
+void    vlistDefVarParam(int vlistID, int varID, int param);
+
+//      vlistInqVarParam: Get the parameter number of a Variable
+int     vlistInqVarParam(int vlistID, int varID);
+
+//      vlistDefVarCode: Define the code number of a Variable
+void    vlistDefVarCode(int vlistID, int varID, int code);
+
+//      vlistInqVarCode: Get the code number of a Variable
+int     vlistInqVarCode(int vlistID, int varID);
+
+//      vlistDefVarDatatype: Define the data type of a Variable
+void    vlistDefVarDatatype(int vlistID, int varID, int datatype);
+
+//      vlistInqVarDatatype: Get the data type of a Variable
+int     vlistInqVarDatatype(int vlistID, int varID);
+
+void    vlistDefVarXYZ(int vlistID, int varID, int xyz);
+int     vlistInqVarXYZ(int vlistID, int varID);
+
+void    vlistDefVarNSB(int vlistID, int varID, int nsb);
+int     vlistInqVarNSB(int vlistID, int varID);
+
+int     vlistInqVarNumber(int vlistID, int varID);
+
+void    vlistDefVarInstitut(int vlistID, int varID, int instID);
+int     vlistInqVarInstitut(int vlistID, int varID);
+void    vlistDefVarModel(int vlistID, int varID, int modelID);
+int     vlistInqVarModel(int vlistID, int varID);
+void    vlistDefVarTable(int vlistID, int varID, int tableID);
+int     vlistInqVarTable(int vlistID, int varID);
+
+//      vlistDefVarName: Define the name of a Variable
+void    vlistDefVarName(int vlistID, int varID, const char *name);
+
+//      vlistInqVarName: Get the name of a Variable
+void    vlistInqVarName(int vlistID, int varID, char *name);
+
+//      vlistCopyVarName: Safe and convenient version of vlistInqVarName
+char   *vlistCopyVarName(int vlistId, int varId);
+
+//      vlistDefVarStdname: Define the standard name of a Variable
+void    vlistDefVarStdname(int vlistID, int varID, const char *stdname);
+
+//      vlistInqVarStdname: Get the standard name of a Variable
+void    vlistInqVarStdname(int vlistID, int varID, char *stdname);
+
+//      vlistDefVarLongname: Define the long name of a Variable
+void    vlistDefVarLongname(int vlistID, int varID, const char *longname);
+
+//      vlistInqVarLongname: Get the long name of a Variable
+void    vlistInqVarLongname(int vlistID, int varID, char *longname);
+
+//      vlistDefVarUnits: Define the units of a Variable
+void    vlistDefVarUnits(int vlistID, int varID, const char *units);
+
+//      vlistInqVarUnits: Get the units of a Variable
+void    vlistInqVarUnits(int vlistID, int varID, char *units);
+
+//      vlistDefVarMissval: Define the missing value of a Variable
+void    vlistDefVarMissval(int vlistID, int varID, double missval);
+
+//      vlistInqVarMissval: Get the missing value of a Variable
+double  vlistInqVarMissval(int vlistID, int varID);
+
+SizeType vlistInqVarSize(int vlistID, int varID);
+
+void    vlistDefIndex(int vlistID, int varID, int levID, int index);
+int     vlistInqIndex(int vlistID, int varID, int levID);
+void    vlistDefFlag(int vlistID, int varID, int levID, int flag);
+int     vlistInqFlag(int vlistID, int varID, int levID);
+int     vlistFindVar(int vlistID, int fvarID);
+int     vlistFindLevel(int vlistID, int fvarID, int flevelID);
+int     vlistMergedVar(int vlistID, int varID);
+int     vlistMergedLevel(int vlistID, int varID, int levelID);
+
+//      cdiClearAdditionalKeys: Clear the list of additional GRIB keys
+void    cdiClearAdditionalKeys(void);
+//      cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened
+void    cdiDefAdditionalKey(const char *string);
+
+//      vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API
+void    vlistDefVarIntKey(int vlistID, int varID, const char *name, int value);
+//      vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API
+void    vlistDefVarDblKey(int vlistID, int varID, const char *name, double value);
+
+//      vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise
+int     vlistHasVarKey(int vlistID, int varID, const char *name);
+//      vlistInqVarDblKey: raw access to GRIB meta-data
+double  vlistInqVarDblKey(int vlistID, int varID, const char *name);
+//      vlistInqVarIntKey: raw access to GRIB meta-data
+int     vlistInqVarIntKey(int vlistID, int varID, const char *name);
+
+// CDI attributes
+
+//      cdiInqNatts: Get number of attributes assigned to this variable
+int     cdiInqNatts(int cdiID, int varID, int *nattsp);
+//      cdiInqAtt: Get information about an attribute
+int     cdiInqAtt(int cdiID, int varID, int attrnum, char *name, int *typep, int *lenp);
+int     cdiInqAttLen(int cdiID, int varID, const char *name);
+int     cdiInqAttType(int cdiID, int varID, const char *name);
+int     cdiDelAtt(int cdiID, int varID, const char *name);
+
+int     cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2);
+
+//      cdiDefAttInt: Define an integer attribute
+int     cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int ip[]);
+//      cdiDefAttFlt: Define a floating point attribute
+int     cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double dp[]);
+//      cdiDefAttTxt: Define a text attribute
+int     cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp_cbuf);
+
+//      cdiInqAttInt: Get the value(s) of an integer attribute
+int     cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int ip[]);
+//      cdiInqAttFlt: Get the value(s) of a floating point attribute
+int     cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double dp[]);
+//      cdiInqAttTxt: Get the value(s) of a text attribute
+int     cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp_cbuf);
+
+
+// GRID routines
+
+void    gridName(int gridtype, char *gridname);
+const char *gridNamePtr(int gridtype);
+
+void    gridCompress(int gridID);
+
+void    gridDefMaskGME(int gridID, const int mask[]);
+int     gridInqMaskGME(int gridID, int mask[]);
+
+void    gridDefMask(int gridID, const int mask[]);
+int     gridInqMask(int gridID, int mask[]);
+
+//      gridCreate: Create a horizontal Grid
+int     gridCreate(int gridtype, SizeType size);
+
+//      gridDestroy: Destroy a horizontal Grid
+void    gridDestroy(int gridID);
+
+//      gridDuplicate: Duplicate a Grid
+int     gridDuplicate(int gridID);
+
+//      gridDefProj: Define the projection ID of a Grid
+void    gridDefProj(int gridID, int projID);
+
+//      gridInqProj: Get the projection ID of a Grid
+int     gridInqProj(int gridID);
+
+//      gridInqProjType: Get the projection type
+int     gridInqProjType(int gridID);
+
+//      gridInqType: Get the type of a Grid
+int     gridInqType(int gridID);
+
+//      gridInqSize: Get the size of a Grid
+SizeType gridInqSize(int gridID);
+
+//      gridDefXsize: Define the size of a X-axis
+void    gridDefXsize(int gridID, SizeType xsize);
+
+//      gridInqXsize: Get the size of a X-axis
+SizeType gridInqXsize(int gridID);
+
+//      gridDefYsize: Define the size of a Y-axis
+void    gridDefYsize(int gridID, SizeType ysize);
+
+//      gridInqYsize: Get the size of a Y-axis
+SizeType gridInqYsize(int gridID);
+
+//      gridDefNP: Define the number of parallels between a pole and the equator
+void    gridDefNP(int gridID, int np);
+
+//      gridInqNP: Get the number of parallels between a pole and the equator
+int     gridInqNP(int gridID);
+
+//      gridDefXvals: Define the values of a X-axis
+void    gridDefXvals(int gridID, const double xvals[]);
+
+//      gridInqXvals: Get all values of a X-axis
+SizeType gridInqXvals(int gridID, double xvals[]);
+SizeType gridInqXvalsPart(int gridID, int start, SizeType size, double xvals[]);
+const double *gridInqXvalsPtr(int gridID);
+
+//      gridInqXIsc: Find out whether X-coordinate is of type CHAR
+int     gridInqXIsc(int gridID);
+
+//      gridInqXCvals: Get strings from X-axis in case grid is of type GRID_CHARXY
+SizeType gridInqXCvals(int gridID, char *xcvals[]);
+
+//      gridDefYvals: Define the values of a Y-axis
+void    gridDefYvals(int gridID, const double yvals[]);
+
+//      gridInqYvals: Get all values of a Y-axis
+SizeType gridInqYvals(int gridID, double yvals[]);
+SizeType gridInqYvalsPart(int gridID, int start, SizeType size, double yvals[]);
+const double *gridInqYvalsPtr(int gridID);
+
+//      gridInqYIsc: Find out whether Y-coordinate is of type CHAR
+int     gridInqYIsc(int gridID);
+
+//      gridInqYCvals: Get strings from Y-axis in case grid is of type GRID_CHARXY
+SizeType gridInqYCvals(int gridID, char *ycvals[]);
+
+// CDI var keys
+
+// String keys
+#define  CDI_KEY_NAME                          942  // Variable name
+#define  CDI_KEY_LONGNAME                      943  // Long name of the variable
+#define  CDI_KEY_STDNAME                       944  // CF Standard name of the variable
+#define  CDI_KEY_UNITS                         945  // Units of the variable
+#define  CDI_KEY_DATATYPE                      946  // Data type
+#define  CDI_KEY_REFERENCEURI                  947  // Reference URI to grid file
+#define  CDI_KEY_CHUNKS                        948  // Chunks
+
+// Integer keys
+#define  CDI_KEY_NUMBEROFGRIDUSED              961  // GRIB2 numberOfGridUsed
+#define  CDI_KEY_NUMBEROFGRIDINREFERENCE       962  // GRIB2 numberOfGridInReference
+#define  CDI_KEY_NUMBEROFVGRIDUSED             963  // GRIB2 numberOfVGridUsed
+#define  CDI_KEY_NLEV                          964  // GRIB2 nlev
+#define  CDI_KEY_CHUNKTYPE                     965  // ChunkType: CDI_CHUNK_AUTO/CDI_CHUNK_GRID/CDI_CHUNK_LINES
+#define  CDI_KEY_CHUNKSIZE                     966  // ChunkSize
+
+// Floating point keys
+#define  CDI_KEY_MISSVAL                       701  // Missing value
+#define  CDI_KEY_ADDOFFSET                     702  // Add offset
+#define  CDI_KEY_SCALEFACTOR                   703  // Scale factor
+#define  CDI_KEY_FILTERSPEC_IN                 720  // NetCDF4 filter specification read in
+#define  CDI_KEY_FILTERSPEC                    721  // NetCDF4 filter specification
+
+// Byte array keys
+#define  CDI_KEY_UUID                          960  // UUID for grid/Z-axis reference [size: CDI_UUID_SIZE]
+
+
+#define  CDI_KEY_DIMNAME                       941  // Dimension name
+
+#define  CDI_KEY_PSNAME                        950  // Z-axis surface pressure name
+#define  CDI_KEY_P0NAME                        951  // Z-axis reference pressure name
+#define  CDI_KEY_P0VALUE                       952  // Z-axis reference pressure in Pa
+
+#define  CDI_KEY_TABLESVERSION                 801  // GRIB2 tablesVersion
+#define  CDI_KEY_LOCALTABLESVERSION            802  // GRIB2 localTablesVersion
+#define  CDI_KEY_TYPEOFGENERATINGPROCESS       803  // GRIB2 typeOfGeneratingProcess
+#define  CDI_KEY_PRODUCTDEFINITIONTEMPLATE     804  // GRIB2 productDefinitionTemplate
+#define  CDI_KEY_TYPEOFPROCESSEDDATA           805  // GRIB2 typeOfProcessedData
+#define  CDI_KEY_SHAPEOFTHEEARTH               806  // GRIB2 shapeOfTheEarth
+#define  CDI_KEY_BACKGROUNDPROCESS             807  // GRIB2 backgroundProcess
+#define  CDI_KEY_TYPEOFENSEMBLEFORECAST        808  // GRIB2 typeOfEnsembleForecast
+#define  CDI_KEY_NUMBEROFFORECASTSINENSEMBLE   809  // GRIB2 numberOfForecastsInEnsemble
+#define  CDI_KEY_PERTURBATIONNUMBER            810  // GRIB2 perturbationNumber
+#define  CDI_KEY_CENTRE                        811  // GRIB2 centre
+#define  CDI_KEY_SUBCENTRE                     812  // GRIB2 subCentre
+#define  CDI_KEY_MPIMTYPE                      813  // GRIB2 mpimType
+#define  CDI_KEY_MPIMCLASS                     814  // GRIB2 mpimClass
+#define  CDI_KEY_MPIMUSER                      815  // GRIB2 mpimUser
+#define  CDI_KEY_REVSTATUS                     816  // GRIB2 revStatus
+#define  CDI_KEY_REVNUMBER                     817  // GRIB2 revNumber
+#define  CDI_KEY_GRIB2LOCALSECTIONNUMBER       818  // GRIB2 grib2LocalSectionNumber
+#define  CDI_KEY_SECTION2PADDINGLENGTH         819  // GRIB2 length of section2Padding
+#define  CDI_KEY_SECTION2PADDING               820  // GRIB2 section2Padding
+#define  CDI_KEY_CONSTITUENTTYPE               821  // GRIB2 constituentType
+#define  CDI_KEY_TYPEOFTIMEINCREMENT           822  // GRIB2 typeOfTimeIncrement
+#define  CDI_KEY_TYPEOFFIRSTFIXEDSURFACE       823  // GRIB2 typeOfFirstFixedSurface
+#define  CDI_KEY_TYPEOFSECONDFIXEDSURFACE      824  // GRIB2 typeOfSecondFixedSurface
+#define  CDI_KEY_UVRELATIVETOGRID              825  // GRIB  uvRelativeToGrid
+#define  CDI_KEY_SCANNINGMODE                  826  // GRIB  scanningMode
+
+#define  CDI_KEY_VDIMNAME                      920  // Vertex dimension name
+#define  CDI_KEY_GRIDMAP_VARTYPE               921  // Grid mapping var datatype
+#define  CDI_KEY_GRIDMAP_VARNAME               922  // Grid mapping var name
+#define  CDI_KEY_GRIDMAP_NAME                  923  // Grid mapping name
+
+//      cdiDefKeyInt: Define an integer value from a key
+int     cdiDefKeyInt(int cdiID, int varID, int key, int value);
+
+//      cdiInqKeyInt: Get an integer value from a key
+int     cdiInqKeyInt(int cdiID, int varID, int key, int *value);
+
+//      cdiDefKeyFloat: Define a float value from a key
+int     cdiDefKeyFloat(int cdiID, int varID, int key, double value);
+
+//      cdiInqKeyFloat Get a float value from a key
+int     cdiInqKeyFloat(int cdiID, int varID, int key, double *value);
+
+//      cdiDefKeyBytes: Define a byte array from a key
+int     cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char bytes[], int length);
+
+//      cdiInqKeyBytes: Get a byte array from a key
+int     cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char bytes[], int *length);
+
+//      cdiDefKeyString: Define a string from a key
+int     cdiDefKeyString(int cdiID, int varID, int key, const char *string);
+
+//      cdiInqKeyString: Get a string from a key
+int     cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length);
+
+//      cdiInqKeyLen: Get the length of the string representation of the key
+int     cdiInqKeyLen(int cdiID, int varID, int key, int *length);
+
+int     cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2);
+
+int     cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2);
+
+int     cdiDeleteKey(int cdiID, int varID, int key);
+
+// GRID routines
+
+//      gridDefXname: Define the name of a X-axis
+void    gridDefXname(int gridID, const char *xname);
+
+//      gridInqXname: Get the name of a X-axis
+void    gridInqXname(int gridID, char *xname);
+
+//      gridDefXlongname: Define the longname of a X-axis
+void    gridDefXlongname(int gridID, const char *xlongname);
+
+//      gridInqXlongname: Get the longname of a X-axis
+void    gridInqXlongname(int gridID, char *xlongname);
+
+//      gridDefXunits: Define the units of a X-axis
+void    gridDefXunits(int gridID, const char *xunits);
+
+//      gridInqXunits: Get the units of a X-axis
+void    gridInqXunits(int gridID, char *xunits);
+
+//      gridDefYname: Define the name of a Y-axis
+void    gridDefYname(int gridID, const char *yname);
+
+//      gridInqYname: Get the name of a Y-axis
+void    gridInqYname(int gridID, char *yname);
+
+//      gridDefYlongname: Define the longname of a Y-axis
+void    gridDefYlongname(int gridID, const char *ylongname);
+
+//      gridInqYlongname: Get the longname of a Y-axis
+void    gridInqYlongname(int gridID, char *ylongname);
+
+//      gridDefYunits: Define the units of a Y-axis
+void    gridDefYunits(int gridID, const char *yunits);
+
+//      gridInqYunits: Get the units of a Y-axis
+void    gridInqYunits(int gridID, char *yunits);
+
+void    gridDefDatatype(int gridID, int datatype);
+int     gridInqDatatype(int gridID);
+
+//      gridInqXval: Get one value of a X-axis
+double  gridInqXval(int gridID, SizeType index);
+
+//      gridInqYval: Get one value of a Y-axis
+double  gridInqYval(int gridID, SizeType index);
+
+double  gridInqXinc(int gridID);
+double  gridInqYinc(int gridID);
+
+int     gridIsCircular(int gridID);
+
+int     gridInqTrunc(int gridID);
+void    gridDefTrunc(int gridID, int trunc);
+
+// Reference of an unstructured grid
+
+//      gridDefNumber: Define the reference number for an unstructured grid
+void    gridDefNumber(int gridID, int number);
+
+//      gridInqNumber: Get the reference number to an unstructured grid
+int     gridInqNumber(int gridID);
+
+//      gridDefPosition: Define the position of grid in the reference file
+void    gridDefPosition(int gridID, int position);
+
+//      gridInqPosition: Get the position of grid in the reference file
+int     gridInqPosition(int gridID);
+
+//      gridDefReference: Define the reference URI for an unstructured grid
+void    gridDefReference(int gridID, const char *reference);
+
+//      gridInqReference: Get the reference URI to an unstructured grid
+int     gridInqReference(int gridID, char *reference);
+
+//      gridDefUUID: Define the UUID of an unstructured grid
+void    gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]);
+
+//      gridInqUUID: Get the UUID of an unstructured grid
+void    gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]);
+
+// Rotated Lon/Lat grid
+void    gridDefParamRLL(int gridID, double xpole, double ypole, double angle);
+void    gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle);
+
+// Hexagonal GME grid
+void    gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3);
+void    gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3);
+
+void    gridDefArea(int gridID, const double area[]);
+void    gridInqArea(int gridID, double area[]);
+int     gridHasArea(int gridID);
+
+//      gridDefNvertex: Define the number of vertex of a Gridbox
+void    gridDefNvertex(int gridID, int nvertex);
+
+//      gridInqNvertex: Get the number of vertex of a Gridbox
+int     gridInqNvertex(int gridID);
+
+//      gridDefXbounds: Define the bounds of a X-axis
+void    gridDefXbounds(int gridID, const double xbounds[]);
+
+//      gridInqXbounds: Get the bounds of a X-axis
+SizeType gridInqXbounds(int gridID, double xbounds[]);
+SizeType gridInqXboundsPart(int gridID, int start, SizeType size, double xbounds[]);
+const double *gridInqXboundsPtr(int gridID);
+
+//      gridDefYbounds: Define the bounds of a Y-axis
+void    gridDefYbounds(int gridID, const double ybounds[]);
+
+//      gridInqYbounds: Get the bounds of a Y-axis
+SizeType gridInqYbounds(int gridID, double ybounds[]);
+SizeType gridInqYboundsPart(int gridID, int start, SizeType size, double ybounds[]);
+const double *gridInqYboundsPtr(int gridID);
+
+void    gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]);
+void    gridInqReducedPoints(int gridID, int reducedPoints[]);
+void    gridChangeType(int gridID, int gridtype);
+
+void    gridDefComplexPacking(int gridID, int lpack);
+int     gridInqComplexPacking(int gridID);
+
+// ZAXIS routines
+
+void    zaxisName(int zaxistype, char *zaxisname);
+const char *zaxisNamePtr(int leveltype);
+
+//      zaxisCreate: Create a vertical Z-axis
+int     zaxisCreate(int zaxistype, int size);
+
+//      zaxisDestroy: Destroy a vertical Z-axis
+void    zaxisDestroy(int zaxisID);
+
+//      zaxisInqType: Get the type of a Z-axis
+int     zaxisInqType(int zaxisID);
+
+//      zaxisInqSize: Get the size of a Z-axis
+int     zaxisInqSize(int zaxisID);
+
+//      zaxisDuplicate: Duplicate a Z-axis
+int     zaxisDuplicate(int zaxisID);
+
+//      zaxisDefLevels: Define the levels of a Z-axis
+void    zaxisDefLevels(int zaxisID, const double levels[]);
+
+//      zaxisDefCvals: Define area types of a Z-axis
+void    zaxisDefCvals(int zaxisID, const char *cvals[], int clength);
+
+//      zaxisInqLevels: Get all levels of a Z-axis
+int     zaxisInqLevels(int zaxisID, double levels[]);
+
+//      zaxisInqCLen: Get maximal string length of character Z-axis
+int     zaxisInqCLen(int zaxisID);
+
+//      zaxisInqCVals: Get all string values of a character Z-axis
+int     zaxisInqCVals(int zaxisID, char ***clevels);
+
+//      zaxisDefLevel: Define one level of a Z-axis
+void    zaxisDefLevel(int zaxisID, int levelID, double levels);
+
+//      zaxisInqLevel: Get one level of a Z-axis
+double  zaxisInqLevel(int zaxisID, int levelID);
+
+//      zaxisDefNlevRef: Define the number of half levels of a generalized Z-axis
+void    zaxisDefNlevRef(int gridID, int nhlev);
+
+//      zaxisInqNlevRef: Get the number of half levels of a generalized Z-axis
+int     zaxisInqNlevRef(int gridID);
+
+//      zaxisDefNumber: Define the reference number for a generalized Z-axis
+void    zaxisDefNumber(int gridID, int number);
+
+//      zaxisInqNumber: Get the reference number to a generalized Z-axis
+int     zaxisInqNumber(int gridID);
+
+//      zaxisDefUUID: Define the UUID of a generalized Z-axis
+void    zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]);
+
+//      zaxisInqUUID: Get the UUID of a generalized Z-axis
+void    zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]);
+
+//      zaxisDefName: Define the name of a Z-axis
+void    zaxisDefName(int zaxisID, const char *name_optional);
+
+//      zaxisInqName: Get the name of a Z-axis
+void    zaxisInqName(int zaxisID, char *name);
+
+//      zaxisDefLongname: Define the longname of a Z-axis
+void    zaxisDefLongname(int zaxisID, const char *longname_optional);
+
+//      zaxisInqLongname: Get the longname of a Z-axis
+void    zaxisInqLongname(int zaxisID, char *longname);
+
+//      zaxisDefUnits: Define the units of a Z-axis
+void    zaxisDefUnits(int zaxisID, const char *units_optional);
+
+//      zaxisInqUnits: Get the units of a Z-axis
+void    zaxisInqUnits(int zaxisID, char *units);
+
+//      zaxisInqStdname: Get the standard name of a Z-axis
+void    zaxisInqStdname(int zaxisID, char *stdname);
+
+void    zaxisDefDatatype(int zaxisID, int datatype);
+int     zaxisInqDatatype(int zaxisID);
+
+void    zaxisDefPositive(int zaxisID, int positive);
+int     zaxisInqPositive(int zaxisID);
+
+void    zaxisDefScalar(int zaxisID);
+int     zaxisInqScalar(int zaxisID);
+
+void    zaxisDefVct(int zaxisID, int size, const double vct[]);
+void    zaxisInqVct(int zaxisID, double vct[]);
+int     zaxisInqVctSize(int zaxisID);
+const double *zaxisInqVctPtr(int zaxisID);
+void    zaxisDefLbounds(int zaxisID, const double lbounds[]);
+int     zaxisInqLbounds(int zaxisID, double lbounds_optional[]);
+double  zaxisInqLbound(int zaxisID, int index);
+void    zaxisDefUbounds(int zaxisID, const double ubounds[]);
+int     zaxisInqUbounds(int zaxisID, double ubounds_optional[]);
+double  zaxisInqUbound(int zaxisID, int index);
+void    zaxisDefWeights(int zaxisID, const double weights[]);
+int     zaxisInqWeights(int zaxisID, double weights_optional[]);
+void    zaxisChangeType(int zaxisID, int zaxistype);
+
+// TAXIS routines
+
+//      taxisCreate: Create a Time axis
+int     taxisCreate(int taxistype);
+
+//      taxisDestroy: Destroy a Time axis
+void    taxisDestroy(int taxisID);
+
+int     taxisDuplicate(int taxisID);
+
+void    taxisCopyTimestep(int taxisIDdes, int taxisIDsrc);
+
+void    taxisDefType(int taxisID, int taxistype);
+int     taxisInqType(int taxisID);
+
+//      taxisDefVdate: Define the verification date
+void    taxisDefVdate(int taxisID, int date);
+
+//      taxisDefVtime: Define the verification time
+void    taxisDefVtime(int taxisID, int time);
+
+//      taxisInqVdate: Get the verification date
+int     taxisInqVdate(int taxisID);
+
+//      taxisInqVtime: Get the verification time
+int     taxisInqVtime(int taxisID);
+
+//      taxisDefRdate: Define the reference date
+void    taxisDefRdate(int taxisID, int date);
+
+//      taxisDefRtime: Define the reference time
+void    taxisDefRtime(int taxisID, int time);
+
+//      taxisInqRdate: Get the reference date
+int     taxisInqRdate(int taxisID);
+
+//      taxisInqRtime: Get the reference time
+int     taxisInqRtime(int taxisID);
+
+int     taxisHasBounds(int taxisID);
+void    taxisWithBounds(int taxisID);
+
+void    taxisDeleteBounds(int taxisID);
+
+void    taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub);
+
+void    taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub);
+
+void    taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub);
+
+void    taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub);
+
+//      taxisDefCalendar: Define the calendar
+void    taxisDefCalendar(int taxisID, int calendar);
+
+//      taxisInqCalendar: Get the calendar
+int     taxisInqCalendar(int taxisID);
+
+void    taxisDefTunit(int taxisID, int tunit);
+int     taxisInqTunit(int taxisID);
+
+void    taxisDefForecastTunit(int taxisID, int tunit);
+int     taxisInqForecastTunit(int taxisID);
+
+void    taxisDefForecastPeriod(int taxisID, double fc_period);
+double  taxisInqForecastPeriod(int taxisID);
+
+void    taxisDefNumavg(int taxisID, int numavg);
+int     taxisInqNumavg(int taxisID);
+
+const char *taxisNamePtr(int taxisID);
+const char *tunitNamePtr(int tunitID);
+
+
+// Institut routines
+
+int     institutDef(int center, int subcenter, const char *name, const char *longname);
+int     institutInq(int center, int subcenter, const char *name, const char *longname);
+int     institutInqNumber(void);
+int     institutInqCenter(int instID);
+int     institutInqSubcenter(int instID);
+const char *institutInqNamePtr(int instID);
+const char *institutInqLongnamePtr(int instID);
+
+// Model routines
+
+int     modelDef(int instID, int modelgribID, const char *name);
+int     modelInq(int instID, int modelgribID, const char *name);
+int     modelInqInstitut(int modelID) ;
+int     modelInqGribID(int modelID);
+const char *modelInqNamePtr(int modelID);
+
+// Table routines
+
+//      tableFWriteC: write table of parameters to FILE* in C language format
+void    tableFWriteC(FILE *ptfp, int tableID);
+//      tableWrite: write table of parameters to file in tabular format
+void    tableWrite(const char *filename, int tableID);
+//      tableRead: read table of parameters from file in tabular format
+int     tableRead(const char *tablefile);
+int     tableDef(int modelID, int tablenum, const char *tablename);
+
+const char *tableInqNamePtr(int tableID);
+
+int     tableInq(int modelID, int tablenum, const char *tablename);
+int     tableInqNumber(void);
+
+int     tableInqNum(int tableID);
+int     tableInqModel(int tableID);
+
+void    tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units);
+
+// Subtype routines
+
+//      subtypeCreate: Create a variable subtype
+int     subtypeCreate(int subtype);
+
+//      Gives a textual summary of the variable subtype
+void    subtypePrint(int subtypeID);
+
+// Compares two subtype data structures
+int     subtypeCompare(int subtypeID1, int subtypeID2);
+
+//      subtypeInqSize: Get the size of a subtype (e.g. no. of tiles)
+int     subtypeInqSize(int subtypeID);
+
+//      subtypeInqActiveIndex: Get the currently active index of a subtype (e.g. current tile index)
+int     subtypeInqActiveIndex(int subtypeID);
+
+//      subtypeDefActiveIndex: Set the currently active index of a subtype (e.g. current tile index)
+void    subtypeDefActiveIndex(int subtypeID, int index);
+
+//      Generate a "query object" out of a key-value pair
+subtype_query_t keyValuePair(const char *key, int value);
+
+//       Generate an AND-combined "query object" out of two previous query objects
+subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2);
+
+//      subtypeInqSubEntry: Returns subtype entry ID for a given criterion
+int     subtypeInqSubEntry(int subtypeID, subtype_query_t criterion);
+
+//      subtypeInqTile: Specialized version of subtypeInqSubEntry looking for tile/attribute pair
+int     subtypeInqTile(int subtypeID, int tileindex, int attribute);
+
+//      subtypeInqAttribute: Inquire the value of a subtype attribute. Returns CDI_EINVAL if the attribute does not exist.
+int     subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue);
+
+//      vlistInqVarSubtype: Return subtype ID for a given variable
+int     vlistInqVarSubtype(int vlistID, int varID);
+
+void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version);
+
+// Compatibility functions for release 1.8.3 (obsolete functions)
+void zaxisDefLtype(int zaxisID, int ltype);
+int  vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID);
+void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess);
+void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate);
+
+#ifdef __cplusplus
+}
+#endif
+
+// End of fortran interface
+//FINT_OFF  <--- don't change or remove this line!!!
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// CDI query interface
+
+typedef struct
+{
+  int numEntries;
+  // Names
+  int numNames;
+  bool *namesFound;
+  char **names;
+  // Grid cell indices
+  int numCellidx;
+  bool *cellidxFound;
+  size_t *cellidx;
+  // Level indices
+  int numLevidx;
+  bool *levidxFound;
+  int *levidx;
+  // Time step indices
+  int numStepidx;
+  bool *stepidxFound;
+  int *stepidx;
+} CdiQuery;
+
+CdiQuery *cdiQueryCreate(void);
+CdiQuery *cdiQueryClone(const CdiQuery *query);
+void cdiQueryDelete(CdiQuery *query);
+void cdiQuerySetNames(CdiQuery *query, int numNames, char **names);
+void cdiQuerySetCellidx(CdiQuery *query, int numCellidx, size_t *cellidx);
+void cdiQuerySetLevidx(CdiQuery *query, int numLevidx, int *levidx);
+void cdiQuerySetStepidx(CdiQuery *query, int numStepidx, int *stepidx);
+size_t cdiQueryGetCellidx(const CdiQuery *query, int index);
+int cdiQueryName(CdiQuery *query, const char *name);
+int cdiQueryCellidx(CdiQuery *query, size_t cellidx);
+int cdiQueryLevidx(CdiQuery *query, int levidx);
+int cdiQueryStepidx(CdiQuery *query, int stepidx);
+int cdiQueryNumNames(const CdiQuery *query);
+int cdiQueryNumCellidx(const CdiQuery *query);
+int cdiQueryNumStepidx(const CdiQuery *query);
+int cdiQueryNumEntries(const CdiQuery *query);
+int cdiQueryNumEntriesFound(const CdiQuery *query);
+void cdiQueryPrint(const CdiQuery *query);
+void cdiQueryPrintEntriesNotFound(const CdiQuery *query);
+
+// streamOpenReadQuery: Open a dataset for reading and apply query
+int streamOpenReadQuery(const char *path, CdiQuery *query);
+
+// CDI interface for paraview vtkCDIReader.cxx
+
+
+// taxisDefRdatetime: Define the reference date/time
+void taxisDefRdatetime(int taxisID, CdiDateTime rDateTime);
+// taxisInqRdatetime: Get the reference date/time
+CdiDateTime taxisInqRdatetime(int taxisID);
+// taxisDefFdatetime: Define the forecast reference date/time
+void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime);
+// taxisInqFdatetime: Get the forecast reference date/time
+CdiDateTime taxisInqFdatetime(int taxisID);
+// taxisDefVdatetime: Define the verification date/time
+void taxisDefVdatetime(int taxisID, CdiDateTime vDateTime);
+// taxisInqVdatetime: Get the verification date/time
+CdiDateTime taxisInqVdatetime(int taxisID);
+void taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub);
+void taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub);
+
+// date format:  YYYYMMDD
+// time format:    hhmmss
+
+int64_t date_to_julday(int calendar, int64_t date);  // Used in paraview vtkCDIReader.cxx
+int64_t julday_to_date(int calendar, int64_t julday);
+
+int time_to_sec(int time);                           // Used in paraview vtkCDIReader.cxx
+int sec_to_time(int secofday);
+
+// CDI projection parameter interface
+
+struct CDI_GridProjParams
+{
+  double mv;     // Missing value
+  double lon_0;  // The East longitude of the meridian which is parallel to the Y-axis
+  double lat_0;  // Latitude of the projection origin
+  double lat_1;  // First latitude from the pole at which the secant cone cuts the sphere
+  double lat_2;  // Second latitude at which the secant cone cuts the sphere
+  // lat_ts = lat_1;
+  double a;      // Semi-major axis or earth radius in metres (optional)
+  double b;      // Semi-minor axis in metres (optional)
+  double rf;     // Inverse flattening (1/f) (optional)
+  double xval_0; // Longitude of the first grid point in degree (optional)
+  double yval_0; // Latitude of the first grid point in degree (optional)
+  double x_0;    // False easting (optional)
+  double y_0;    // False northing (optional)
+  double x_SP;   // Longitude of southern pole
+  double y_SP;   // Latitude of southern pole
+  int nside;     // HEALPix number of points along a side (number of data points should be = 12 * nside * nside)
+  int order;     // HEALPix ordering convention (0:ring; 1:nested)
+};
+
+void gridProjParamsInit(struct CDI_GridProjParams *gridProjParams);
+
+// Lambert Conformal Conic grid
+void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams);
+int  gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gridProjParams);
+
+// Polar stereographic grid
+void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams);
+int  gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gridProjParams);
+
+// HEALPix grid
+void gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gridProjParams);
+int  gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gridProjParams);
+
+#define HAVE_CDI_PROJ_FUNCS 1
+extern int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double*, double*);
+extern int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*);
+extern int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double*, double*);
+extern int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*);
+
+// Used on CDO remap_scrip_io.cc
+void cdf_def_var_filter(int ncid, int ncvarID, const char *filterSpec);
+
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* CDI_H_ */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _DMEMORY_H
+#define _DMEMORY_H
+
+// clang-format off
+
+#include <stdio.h>
+
+// if DEBUG_MEMORY is defined setenv MEMORY_DEBUG to debug memory
+#define  DEBUG_MEMORY
+
+#ifndef  WITH_FUNCTION_NAME
+#define  WITH_FUNCTION_NAME
+#endif
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+extern size_t  memTotal(void);
+extern void    memDebug(int debug);
+extern void    memExitOnError(void);
+
+extern void   *memRealloc(void *ptr, size_t size, const char *file, const char *functionname, int line);
+extern void   *memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line);
+extern void   *memMalloc(size_t size, const char *file, const char *functionname, int line);
+extern void    memFree(void *ptr, const char *file, const char *functionname, int line);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#ifdef  DEBUG_MEMORY
+
+#ifdef  WITH_FUNCTION_NAME
+#define  Realloc(p, s)  memRealloc((p), (s), __FILE__, __func__, __LINE__)
+#define   Calloc(n, s)   memCalloc((n), (s), __FILE__, __func__, __LINE__)
+#define   Malloc(s)      memMalloc((s), __FILE__, __func__, __LINE__)
+#define     Free(p)        memFree((p), __FILE__, __func__, __LINE__)
+#else
+#define  Realloc(p, s)  memRealloc((p), (s), __FILE__, (void *) NULL, __LINE__)
+#define   Calloc(n, s)   memCalloc((n), (s), __FILE__, (void *) NULL, __LINE__)
+#define   Malloc(s)      memMalloc((s), __FILE__, (void *) NULL, __LINE__)
+#define     Free(p)        memFree((p), __FILE__, (void *) NULL, __LINE__)
+#endif
+
+#else
+
+#include <stdlib.h>
+
+#define  Realloc(p, s)  realloc((p), (s))
+#define   Calloc(n, s)   calloc((n), (s))
+#define   Malloc(s)      malloc((s))
+#define     Free(p)        free((p))
+
+#endif /* DEBUG_MEMORY */
+
+// clang-format on
+
+#endif /* _DMEMORY_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _ERROR_H_
+#define _ERROR_H_
+
+// clang-format off
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#ifndef  WITH_CALLER_NAME
+#define  WITH_CALLER_NAME
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int _ExitOnError;  // If set to 1, exit on error (default 1)
+extern int _Verbose;      // If set to 1, errors are reported (default 1)
+extern int _Debug;        // If set to 1, debuggig (default 0)
+
+void SysError_(const char *caller, const char *fmt, ...);
+void    Error_(const char *caller, const char *fmt, ...);
+void  Warning_(const char *caller, const char *fmt, ...);
+/* delegate used by Warning_ unless mode is PIO */
+void cdiWarning(const char *caller, const char *fmt, va_list ap);
+void  Message_(const char *caller, const char *fmt, ...);
+
+#ifdef WITH_CALLER_NAME
+#  define  SysError(...)  SysError_(__func__, __VA_ARGS__)
+#  define    Errorc(...)     Error_(  caller, __VA_ARGS__)
+#  define     Error(...)     Error_(__func__, __VA_ARGS__)
+#  define   Warning(...)   Warning_(__func__, __VA_ARGS__)
+#  define  Messagec(...)   Message_(  caller, __VA_ARGS__)
+#  define   Message(...)   Message_(__func__, __VA_ARGS__)
+#else
+#  define  SysError(...)  SysError_((void *), __VA_ARGS__)
+#  define    Errorc(...)     Error_((void *), __VA_ARGS__)
+#  define     Error(...)     Error_((void *), __VA_ARGS__)
+#  define   Warning(...)   Warning_((void *), __VA_ARGS__)
+#  define  Messagec(...)   Message_((void *), __VA_ARGS__)
+#  define   Message(...)   Message_((void *), __VA_ARGS__)
+#endif
+
+/* If we're not using GNU C, elide __attribute__ */
+#ifndef __GNUC__
+#  define  __attribute__(x)  /*NOTHING*/
+#endif
+
+void cdiAbortC(const char *caller, const char *filename,
+               const char *functionname, int line,
+               const char *errorString, ... )
+  __attribute__((noreturn));
+#define xabortC(caller, ...)                                    \
+  cdiAbortC(caller, __FILE__, __func__, __LINE__, __VA_ARGS__ )
+#define xabort(...)                                             \
+  cdiAbortC(NULL, __FILE__, __func__, __LINE__, __VA_ARGS__ )
+#define cdiAbort(file, func, line, ...)                 \
+  cdiAbortC(NULL, (file), (func), (line), __VA_ARGS__)
+
+#define xassert(arg) do {                       \
+    if ((arg)) { } else {                       \
+      xabort("assertion `" #arg "` failed");}   \
+  } while(0)
+
+void
+cdiAbortC_serial(const char *caller, const char *filename,
+                 const char *functionname, int line,
+                 const char *errorString, va_list ap)
+  __attribute__((noreturn));
+
+
+bool cdiObsoleteInfo(const char *oldFunction, const char *newFunction);
+
+#if defined (__cplusplus)
+}
+#endif
+
+// clang-format on
+
+#endif /* _ERROR_H_ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+#endif
+
+
+
+#include <stdbool.h>
+
+#ifdef HAVE_LIBPTHREAD
+#ifdef __APPLE__
+#include <dispatch/dispatch.h>
+#else
+#include <errno.h>
+#include <semaphore.h>
+#endif
+
+typedef struct sema
+{
+#ifdef __APPLE__
+  dispatch_semaphore_t sem;
+#else
+  sem_t sem;
+#endif
+} sema_t;
+#endif
+
+struct AsyncJob
+{
+  bool inUse;
+#ifdef HAVE_LIBPTHREAD
+  sema_t request, completion;
+#endif
+  int (*work)(void *data);
+  void *data;
+  int result;
+};
+
+struct AsyncManager
+{
+  int workerCount, idleWorkerCount;
+  AsyncJob *communicators;
+};
+
+#ifdef HAVE_LIBPTHREAD
+static inline int
+sema_init(sema_t *s, int pshared, uint32_t value)
+{
+  int status = 0;
+#ifdef __APPLE__
+  dispatch_semaphore_t *sem = &s->sem;
+
+  (void) pshared;
+  *sem = dispatch_semaphore_create(value);
+#else
+  status = sem_init(&s->sem, pshared, value);
+#endif
+  return status;
+}
+
+static inline int
+sema_wait(sema_t *s)
+{
+#ifdef __APPLE__
+  dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER);
+#else
+  int r;
+
+  do
+    {
+      r = sem_wait(&s->sem);
+    }
+  while (r == -1 && errno == EINTR);
+#endif
+  return 0;
+}
+
+static inline int
+sema_post(sema_t *s)
+{
+#ifdef __APPLE__
+  dispatch_semaphore_signal(s->sem);
+#else
+  sem_post(&s->sem);
+#endif
+  return 0;
+}
+
+static void *
+workerMain(void *arg)
+{
+  AsyncJob *communicator = (AsyncJob *) arg;
+
+  while (true)
+    {
+      while (sema_wait(&communicator->request))
+        ;
+      if (communicator->work)
+        {
+          communicator->result = communicator->work(communicator->data);
+          if (sema_post(&communicator->completion)) xabort("sema_post() failed");
+        }
+      else
+        {
+          if (sema_post(&communicator->completion)) xabort("sema_post() failed");
+          break;
+        }
+    }
+
+  return NULL;
+}
+
+static void
+startWorker(AsyncJob *communicator)
+{
+  communicator->inUse = false;
+  communicator->work = NULL;
+  communicator->data = NULL;
+  communicator->result = 0;
+  if (sema_init(&communicator->request, 0, 0)) xabort("sema_init() failed");
+  if (sema_init(&communicator->completion, 0, 0)) xabort("sema_init() failed");
+
+  pthread_t worker;
+  if (pthread_create(&worker, NULL, workerMain, communicator)) xabort("pthread_create() failed");
+  if (pthread_detach(worker)) xabort("pthread_detach() failed");
+}
+#endif
+
+int
+AsyncWorker_init(AsyncManager **jobManager, int threadCount)
+{
+  if (threadCount <= 0)
+    {
+      xabort("CPU core count discovery not implemented yet");
+      return CDI_EINVAL;  // TODO: discover CPU core count, and set threadCount to a sensible positive value
+    }
+
+  if (*jobManager) return CDI_NOERR;
+
+#ifdef HAVE_LIBPTHREAD
+  AsyncManager *jobManager_ = *jobManager = (AsyncManager *) Malloc(sizeof(AsyncManager));
+  jobManager_->workerCount = threadCount;
+  jobManager_->communicators = (AsyncJob *) Malloc((size_t) threadCount * sizeof(AsyncJob));
+
+  for (int i = 0; i < threadCount; i++) startWorker(jobManager_->communicators + i);
+  jobManager_->idleWorkerCount = threadCount;
+#else
+
+  Error("pthread support not compiled in!");
+#endif
+
+  return CDI_NOERR;
+}
+
+AsyncJob *
+AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data)
+{
+  if (!jobManager) xabort("AsyncWorker_requestWork() called without calling AsyncWorker_init() first");
+  if (!work)
+    xabort("AsyncWorker_requestWork() called without a valid function pointer");  // need to catch this condition to stop users from
+                                                                                  // terminating our worker threads
+
+  // find an unused worker
+  if (!jobManager->idleWorkerCount) return NULL;
+
+  AsyncJob *worker = NULL;
+  for (int i = 0; i < jobManager->workerCount; i++)
+    {
+      if (!jobManager->communicators[i].inUse)
+        {
+          worker = &jobManager->communicators[i];
+          break;
+        }
+    }
+  if (!worker) xabort("internal error: idleWorkerCount is not in sync with the worker states, please report this bug");
+
+  // pass the request to that worker
+  jobManager->idleWorkerCount--;
+  worker->inUse = true;
+  worker->work = work;
+  worker->data = data;
+  worker->result = 0;
+#ifdef HAVE_LIBPTHREAD
+  if (sema_post(&worker->request)) xabort("sema_post() failed");
+#endif
+  return worker;
+}
+
+int
+AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job)
+{
+  if (!jobManager) xabort("AsyncWorker_wait() called without calling AsyncWorker_init() first");
+  if (job < jobManager->communicators) return CDI_EINVAL;
+  if (job >= jobManager->communicators + jobManager->workerCount) return CDI_EINVAL;
+  if (!job->inUse) return CDI_EINVAL;
+
+#ifdef HAVE_LIBPTHREAD
+  while (sema_wait(&job->completion))
+    ;
+#endif
+  int result = job->result;
+
+  // reset the communicator
+  job->work = NULL;
+  job->data = NULL;
+  job->result = 0;
+  job->inUse = false;
+  jobManager->idleWorkerCount++;
+
+  return result;
+}
+
+int
+AsyncWorker_availableWorkers(AsyncManager *jobManager)
+{
+  if (!jobManager) return 0;
+  return jobManager->idleWorkerCount;
+}
+
+int
+AsyncWorker_finalize(AsyncManager *jobManager)
+{
+  int result = CDI_NOERR;
+  if (!jobManager) return CDI_NOERR;
+
+  for (int i = 0; i < jobManager->workerCount; i++)
+    {
+      AsyncJob *curWorker = &jobManager->communicators[i];
+
+      // finish any pending job
+      if (curWorker->inUse)
+        {
+          AsyncWorker_wait(jobManager, curWorker);
+          if (curWorker->result) result = curWorker->result;
+        }
+
+      // send the teardown signal
+      curWorker->inUse = true;
+      curWorker->work = NULL;
+      curWorker->data = NULL;
+      curWorker->result = 0;
+#ifdef HAVE_LIBPTHREAD
+      if (sema_post(&curWorker->request)) xabort("sema_post() failed");
+#endif
+      // wait for the worker to exit
+      AsyncWorker_wait(jobManager, curWorker);
+    }
+
+  Free(jobManager->communicators);
+  Free(jobManager);
+
+  return result;
+}
+#ifndef _BASETIME_H
+#define _BASETIME_H
+
+#include <stdbool.h>
+
+typedef struct
+{
+  int ncvarid;
+  int ncdimid;
+  int ncvarboundsid;
+  int leadtimeid;
+  bool hasUnits;
+  bool isWRF;  // true for time axis in WRF format
+} basetime_t;
+
+void basetimeInit(basetime_t *basetime);
+
+#endif /* _BASETIME_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stddef.h>  // for NULL
+
+void
+basetimeInit(basetime_t *basetime)
+{
+  if (basetime == NULL) Error("Internal problem! Basetime not allocated.");
+
+  if (basetime)
+    {
+      basetime->ncvarid = CDI_UNDEFID;
+      basetime->ncdimid = CDI_UNDEFID;
+      basetime->ncvarboundsid = CDI_UNDEFID;
+      basetime->leadtimeid = CDI_UNDEFID;
+      basetime->hasUnits = false;
+      basetime->isWRF = false;
+    }
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _FILE_H
+#define _FILE_H
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#define FILE_UNDEFID -1
+
+#define FILE_TYPE_OPEN 1
+#define FILE_TYPE_FOPEN 2
+
+// buffer types for FILE_TYPE_OPEN
+#define FILE_BUFTYPE_STD 1
+#define FILE_BUFTYPE_MMAP 2
+
+const char *fileLibraryVersion(void);
+
+void fileDebug(int debug);
+
+void *filePtr(int fileID);
+
+int fileSetBufferType(int fileID, int type);
+void fileSetBufferSize(int fileID, long buffersize);
+
+int fileOpen(const char *filename, const char *mode);
+int fileOpen_serial(const char *filename, const char *mode);
+int fileClose(int fileID);
+int fileClose_serial(int fileID);
+
+char *fileInqName(int fileID);
+int fileInqMode(int fileID);
+
+int fileFlush(int fileID);
+void fileClearerr(int fileID);
+int fileEOF(int fileID);
+int filePtrEOF(void *fileptr);
+void fileRewind(int fileID);
+
+off_t fileGetPos(int fileID);
+int fileSetPos(int fileID, off_t offset, int whence);
+
+int fileGetc(int fileID);
+int filePtrGetc(void *fileptr);
+
+size_t filePtrRead(void *fileptr, void *restrict ptr, size_t size);
+size_t fileRead(int fileID, void *restrict ptr, size_t size);
+size_t fileWrite(int fileID, const void *restrict ptr, size_t size);
+
+#endif /* _FILE_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef SWAP_H_
+#define SWAP_H_
+
+void swap4byte(void *ptr, size_t size);
+void swap8byte(void *ptr, size_t size);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef BINARY_H
+#define BINARY_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdio.h>
+#include <inttypes.h>
+
+#ifndef HOST_ENDIANNESS
+#define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0])
+#endif
+
+uint32_t get_uint32(unsigned char *x);
+uint64_t get_uint64(unsigned char *x);
+uint32_t get_swap_uint32(unsigned char *x);
+uint64_t get_swap_uint64(unsigned char *x);
+
+size_t binReadF77Block(int fileID, int byteswap);
+void binWriteF77Block(int fileID, int byteswap, size_t blocksize);
+
+int binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr);
+int binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr);
+
+int binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr);
+int binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr);
+
+int binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr);
+int binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr);
+
+#ifdef HAVE__FLOAT16
+int binWriteFlt16(int fileID, size_t size, _Float16 *ptr);
+#endif
+
+#endif /* BINARY_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#define CDI_BIGENDIAN 0     // Byte order BIGENDIAN
+#define CDI_LITTLEENDIAN 1  // Byte order LITTLEENDIAN
+
+uint32_t
+get_uint32(unsigned char *x)
+{
+  // clang-format off
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN:
+      return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3];
+    case CDI_LITTLEENDIAN:
+      return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0];
+    default:
+      Error("Unhandled endianness %d", HOST_ENDIANNESS);
+      return UINT32_C(0xFFFFFFFF);
+    }
+  // clang-format on
+}
+
+uint32_t
+get_swap_uint32(unsigned char *x)
+{
+  // clang-format off
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN:
+      return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0];
+    case CDI_LITTLEENDIAN:
+      return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3];
+    default:
+      Error("Unhandled endianness %d", HOST_ENDIANNESS);
+      return UINT32_C(0xFFFFFFFF);
+    }
+  // clang-format on
+}
+
+uint64_t
+get_uint64(unsigned char *x)
+{
+  // clang-format off
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN:
+      return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) +
+             (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) +   (uint64_t)x[7];
+    case CDI_LITTLEENDIAN:
+      return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) +
+             (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) +   (uint64_t)x[0];
+    default:
+      Error("Unhandled endianness %d", HOST_ENDIANNESS);
+      return UINT64_C(0xFFFFFFFFFFFFFFFF);
+    }
+  // clang-format on
+}
+
+uint64_t
+get_swap_uint64(unsigned char *x)
+{
+  // clang-format off
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN:
+      return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) +
+             (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) +   (uint64_t)x[0];
+    case CDI_LITTLEENDIAN:
+      return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) +
+             (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) +   (uint64_t)x[7];
+    default:
+      Error("Unhandled endianness %d", HOST_ENDIANNESS);
+      return UINT64_C(0xFFFFFFFFFFFFFFFF);
+    }
+  // clang-format on
+}
+
+size_t
+binReadF77Block(int fileID, int byteswap)
+{
+  unsigned char f77block[4];
+  size_t blocklen = 0;
+
+  if (fileRead(fileID, f77block, 4) == 4)
+    {
+      blocklen = byteswap ? get_swap_uint32(f77block) : get_uint32(f77block);
+    }
+
+  return blocklen;
+}
+
+void
+binWriteF77Block(int fileID, int byteswap, size_t blocksize)
+{
+  static const unsigned int s[4] = { 0, 8, 16, 24 };
+  const unsigned long ublocksize = (unsigned long) blocksize;
+  unsigned char f77block[4];
+
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN:
+      if (byteswap)
+        {
+          for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]);
+        }
+      else
+        {
+          for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]);
+        }
+      break;
+    case CDI_LITTLEENDIAN:
+      if (byteswap)
+        {
+          for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]);
+        }
+      else
+        {
+          for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]);
+        }
+      break;
+    default: Error("Unhandled endianness %d", HOST_ENDIANNESS);
+    }
+
+  if (fileWrite(fileID, f77block, 4) != 4) Error("Write failed on %s", fileInqName(fileID));
+}
+
+int
+binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr)
+{
+  fileRead(fileID, (void *) ptr, 4 * size);
+  if (byteswap) swap4byte(ptr, size);
+  return 0;
+}
+
+int
+binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr)
+{
+  fileRead(fileID, (void *) ptr, 8 * size);
+  if (byteswap) swap8byte(ptr, size);
+  return 0;
+}
+
+int
+binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr)
+{
+  if (byteswap) swap4byte(ptr, size);
+  fileWrite(fileID, (void *) ptr, 4 * size);
+  return 0;
+}
+
+int
+binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr)
+{
+  if (byteswap) swap8byte(ptr, size);
+  fileWrite(fileID, (void *) ptr, 8 * size);
+  return 0;
+}
+
+int
+binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr)
+{
+  if (byteswap) swap4byte(ptr, size);
+  fileWrite(fileID, (void *) ptr, 4 * size);
+  return 0;
+}
+
+int
+binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr)
+{
+  if (byteswap) swap8byte(ptr, size);
+  fileWrite(fileID, (void *) ptr, 8 * size);
+  return 0;
+}
+
+#ifdef HAVE__FLOAT16
+int
+binWriteFlt16(int fileID, size_t size, _Float16 *ptr)
+{
+  fileWrite(fileID, (void *) ptr, 2 * size);
+  return 0;
+}
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CALENDAR_H
+#define CALENDAR_H
+
+#include <stdint.h>  // int64_t
+
+// clang-format off
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day);
+int64_t encode_calday(int daysPerYear, int year, int month, int day);
+
+static inline int
+calendar_dpy(int calendar)
+{
+  int daysPerYear = 0;
+
+  if      (calendar == CALENDAR_360DAYS) daysPerYear = 360;
+  else if (calendar == CALENDAR_365DAYS) daysPerYear = 365;
+  else if (calendar == CALENDAR_366DAYS) daysPerYear = 366;
+
+  return daysPerYear;
+}
+
+int days_per_year(int calendar, int year);
+int days_per_month(int calendar, int year, int month);
+
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+
+
+static const int month_360[12] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 };
+static const int month_365[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static const int month_366[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+
+static const int *
+get_dayspermonth_array(int daysPerYear)
+{
+  // clang-format off
+  return  (daysPerYear == 360) ? month_360 :
+          (daysPerYear == 365) ? month_365 :
+          (daysPerYear == 366) ? month_366 : NULL;
+  // clang-format on
+}
+
+int
+days_per_month(int calendar, int year, int month)
+{
+  int daysPerYear = calendar_dpy(calendar);
+  const int *daysPerMonthArray = (daysPerYear == 360) ? month_360 : ((daysPerYear == 365) ? month_365 : month_366);
+
+  int daysPerMonth = (month >= 1 && month <= 12) ? daysPerMonthArray[month - 1] : 0;
+
+  if (daysPerYear == 0 && month == 2) daysPerMonth = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28;
+
+  return daysPerMonth;
+}
+
+int
+days_per_year(int calendar, int year)
+{
+  int daysPerYear = calendar_dpy(calendar);
+  if (daysPerYear == 0)
+    {
+      if (year == 1582 && (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN))
+        daysPerYear = 355;
+      else if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
+        daysPerYear = 366;
+      else
+        daysPerYear = 365;
+    }
+
+  return daysPerYear;
+}
+
+void
+decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day)
+{
+  *year = (int) ((days - 1) / daysPerYear);
+  days -= (*year * daysPerYear);
+
+  const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear);
+
+  int i = 0;
+  if (daysPerMonthArray)
+    for (i = 0; i < 12; i++)
+      {
+        if (days > daysPerMonthArray[i])
+          days -= daysPerMonthArray[i];
+        else
+          break;
+      }
+
+  *month = i + 1;
+  *day = (int) days;
+}
+
+int64_t
+encode_calday(int daysPerYear, int year, int month, int day)
+{
+  int64_t rval = (int64_t) daysPerYear * year + day;
+
+  const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear);
+
+  if (daysPerMonthArray)
+    for (int i = 0; i < month - 1; i++) rval += daysPerMonthArray[i];
+
+  return rval;
+}
+#ifndef CDF_H
+#define CDF_H
+
+void cdfDebug(int debug);
+
+extern int CDF_Debug;
+
+const char *cdfLibraryVersion(void);
+
+int cdfOpen(const char *filename, const char *mode, int filetype);
+int cdf4Open(const char *filename, const char *mode, int *filetype);
+void cdfClose(int fileID);
+
+#endif /* CDF_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_FDB_H
+#define CDI_FDB_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+extern int cdi_fdb_dummy;
+
+#ifdef HAVE_LIBFDB5
+
+#include <fdb5/api/fdb_c.h>
+
+typedef struct
+{
+  char *item;
+  char *keys[32];
+  char *values[32];
+  int numKeys;
+} KeyValueItem;
+
+typedef struct
+{
+  char *keys[32];
+  char *values[32];
+  int numKeys;
+} fdbKeyValueEntry;
+
+typedef struct
+{
+  int fdbIndex;
+  int date;
+  int time;
+  int param;
+  int levtype;
+  int ilevel;
+} RecordInfoEntry;
+
+void check_fdb_error(int errorNum);
+void cdi_fdb_delete_kvlist(int numItems, fdbKeyValueEntry *keyValueList);
+void decode_fdbitem(const char *fdbItem, KeyValueItem *keyValue);
+int cdi_fdb_fill_kvlist(fdb_handle_t *fdb, fdb_request_t *request, fdbKeyValueEntry **keyValueList);
+long cdi_fdb_read_record(fdb_handle_t *fdb, const fdbKeyValueEntry *keyValue, size_t *buffersize, void **gribbuffer);
+// int check_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList);
+void print_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList);
+void print_keyvalueList_sorted(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList);
+void cdi_fdb_sort_datetime(int numItems, RecordInfoEntry *recordInfo);
+int get_num_records(int numItems, RecordInfoEntry *recordInfoList);
+int decode_keyvalue(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList);
+int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords, int numTimesteps, int *timestepRecordOffset);
+fdb_request_t *cdi_create_fdb_request(const char *filename);
+
+#endif
+
+#endif /* CDI_FDB_H */
+#ifndef CDF_CONFIG_H_
+#define CDF_CONFIG_H_
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+#include <netcdf.h>
+
+#ifdef NC_FORMAT_64BIT_DATA
+#define HAVE_NETCDF5 1
+#endif
+
+#endif
+
+#endif
+#ifndef JULIAN_DATE_H
+#define JULIAN_DATE_H
+
+
+// clang-format off
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+  int64_t julianDay;
+  double secondOfDay;
+} JulianDate;
+
+JulianDate julianDate_encode(int calendar, CdiDateTime dt);
+CdiDateTime julianDate_decode(int calendar, JulianDate julianDate);
+JulianDate julianDate_add_seconds(JulianDate julianDate, int64_t seconds);
+JulianDate julianDate_add(JulianDate julianDate1, JulianDate julianDate2);
+JulianDate julianDate_sub(JulianDate julianDate1, JulianDate julianDate2);
+double julianDate_to_seconds(JulianDate julianDate);
+
+double secofday_encode(CdiTime time);
+CdiTime secofday_decode(double secondOfDay);
+
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* JULIAN_DATE_H */
+#ifndef RESOURCE_HANDLE_H
+#define RESOURCE_HANDLE_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdio.h>
+
+/*
+ * CDI internal handling of resource handles given to user code
+ */
+
+/*
+ * for reasons of compatibility with cfortran.h, the handle type is: int
+ */
+typedef int cdiResH;
+
+/* return 0 on equality, not 0 otherwise */
+typedef int (*valCompareFunc)(void *, void *);
+typedef void (*valDestroyFunc)(void *);
+typedef void (*valPrintFunc)(void *, FILE *);
+typedef int (*valGetPackSizeFunc)(void *, void *context);
+typedef void (*valPackFunc)(void *, void *buf, int size, int *pos, void *context);
+typedef int (*valTxCodeFunc)(void *);
+
+typedef struct
+{
+  valCompareFunc valCompare;
+  valDestroyFunc valDestroy;
+  valPrintFunc valPrint;
+  valGetPackSizeFunc valGetPackSize;
+  valPackFunc valPack;
+  valTxCodeFunc valTxCode;
+} resOps;
+
+enum
+{
+  RESH_IN_USE_BIT = 1 << 0,
+  RESH_SYNC_BIT = 1 << 1,
+  /* resource holds no value */
+  RESH_UNUSED = 0,
+  /* resource was deleted and needs to be synced */
+  RESH_DESYNC_DELETED = RESH_SYNC_BIT,
+  /* resource is synchronized */
+  RESH_IN_USE = RESH_IN_USE_BIT,
+  /* resource is in use, desynchronized and needs to be synced */
+  RESH_DESYNC_IN_USE = RESH_IN_USE_BIT | RESH_SYNC_BIT,
+};
+
+void reshListCreate(int namespaceID);
+void reshListDestruct(int namespaceID);
+int reshPut(void *, const resOps *);
+void reshReplace(cdiResH resH, void *p, const resOps *ops);
+void reshRemove(cdiResH, const resOps *);
+/*> doesn't check resource type */
+void reshDestroy(cdiResH);
+
+unsigned reshCountType(const resOps *resTypeOps);
+
+void *reshGetValue(const char *caller, const char *expressionString, cdiResH id, const resOps *ops);
+#define reshGetVal(resH, ops) reshGetValue(__func__, #resH, resH, ops)
+
+void reshGetResHListOfType(unsigned numIDs, int IDs[], const resOps *ops);
+
+enum cdiApplyRet
+{
+  CDI_APPLY_ERROR = -1,
+  CDI_APPLY_STOP,
+  CDI_APPLY_GO_ON,
+};
+enum cdiApplyRet cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data);
+enum cdiApplyRet cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data);
+
+int reshPackBufferCreate(char **packBuf, int *packBufSize, void *context);
+void reshPackBufferDestroy(char **);
+int reshResourceGetPackSize_intern(int resh, const resOps *ops, void *context, const char *caller, const char *expressionString);
+#define reshResourceGetPackSize(resh, ops, context) reshResourceGetPackSize_intern(resh, ops, context, __func__, #resh)
+void reshPackResource_intern(int resh, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller,
+                             const char *expressionString);
+#define reshPackResource(resh, ops, buf, buf_size, position, context) \
+  reshPackResource_intern(resh, ops, buf, buf_size, position, context, __func__, #resh)
+
+void reshSetStatus(cdiResH, const resOps *, int);
+int reshGetStatus(cdiResH, const resOps *);
+
+void reshLock(void);
+void reshUnlock(void);
+
+enum reshListMismatch
+{
+  cdiResHListOccupationMismatch,
+  cdiResHListResourceTypeMismatch,
+  cdiResHListResourceContentMismatch,
+};
+
+int reshListCompare(int nsp0, int nsp1);
+void reshListPrint(FILE *fp);
+int reshGetTxCode(cdiResH resH);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef TAXIS_H
+#define TAXIS_H
+
+#include <stdbool.h>
+
+#ifndef RESOURCE_HANDLE_H
+#endif
+
+typedef struct
+{
+  int self;
+  int datatype;  // datatype
+  int type;      // time type
+  int calendar;
+  int unit;  // time units
+  int numavg;
+  CdiDateTime sDateTime;     // start date/time
+  CdiDateTime vDateTime;     // verification date/time
+  CdiDateTime rDateTime;     // reference date/time
+  CdiDateTime fDateTime;     // forecast reference date/time
+  CdiDateTime vDateTime_lb;  // lower bounds of verification date/time
+  CdiDateTime vDateTime_ub;  // upper bounds of verification date/time
+  double fc_period;          // forecast time period
+  int fc_unit;               // forecast time unit
+  char *name;
+  char *longname;
+  char *units;
+  bool climatology;
+  bool hasBounds;
+} taxis_t;
+
+//      taxisInqSdatetime: Get the start date/time
+CdiDateTime taxisInqSdatetime(int taxisID);
+
+void ptaxisInit(taxis_t *taxis);
+void ptaxisCopy(taxis_t *dest, taxis_t *source);
+taxis_t *taxisPtr(int taxisID);
+void cdi_set_forecast_period(double timevalue, taxis_t *taxis);
+CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis);
+double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis);
+
+void ptaxisDefDatatype(taxis_t *taxisptr, int datatype);
+void ptaxisDefName(taxis_t *taxisptr, const char *name);
+void ptaxisDefLongname(taxis_t *taxisptr, const char *longname);
+void ptaxisDefUnits(taxis_t *taxisptr, const char *units);
+char *ptaxisAllocUnits(taxis_t *taxisptr, size_t len);
+void taxisDestroyKernel(taxis_t *taxisptr);
+#ifndef SX
+extern const resOps taxisOps;
+#endif
+
+int taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context,
+                int checkForSameID);
+
+enum
+{
+  TAXIS_MAX_UNIT_STR_LEN = 9
+};
+
+#endif /* TAXIS_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_LIMITS_H
+#define CDI_LIMITS_H
+
+#define MAX_DIMENSIONS 5     // maximum number of dimensions per variable
+#define MAX_DIMS_PS 16       // maximum number of dimensions per stream
+#define MAX_GRIDS_PS 128     // maximum number of different grids per stream
+#define MAX_ZAXES_PS 128     // maximum number of different zaxes per stream
+#define MAX_ATTRIBUTES 256   // maximum number of attributes per variable
+#define MAX_KEYS 64          // maximum number of keys per variable
+#define MAX_SUBTYPES_PS 128  // maximum number of different subtypes per stream
+
+#endif /* CDI_LIMITS_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _SERVICE_H
+#define _SERVICE_H
+
+typedef struct
+{
+  int checked;
+  int byteswap;
+  int header[8];
+  int hprec; /* header precision */
+  int dprec; /* data   precision */
+  size_t datasize;
+  size_t buffersize;
+  void *buffer;
+} srvrec_t;
+
+const char *srvLibraryVersion(void);
+
+void srvDebug(int debug);
+
+int srvCheckFiletype(int fileID, int *swap);
+
+void *srvNew(void);
+void srvDelete(void *srv);
+
+int srvRead(int fileID, void *srv);
+void srvWrite(int fileID, void *srv);
+
+int srvInqHeader(void *srv, int *header);
+int srvInqDataFP32(void *srv, float *data);
+int srvInqDataFP64(void *srv, double *data);
+
+int srvDefHeader(void *srv, const int *header);
+int srvDefDataFP32(void *srv, const float *data);
+int srvDefDataFP64(void *srv, const double *data);
+
+#endif /* _SERVICE_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _EXTRA_H
+#define _EXTRA_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+enum
+{
+  EXT_REAL = 1,
+  EXT_COMP = 2,
+};
+
+typedef struct
+{
+  int checked;
+  int byteswap;
+  int header[4];
+  int prec;    // single or double precison
+  int number;  // real or complex
+  size_t datasize;
+  size_t buffersize;
+  void *buffer;
+} extrec_t;
+
+const char *extLibraryVersion(void);
+
+void extDebug(int debug);
+
+int extCheckFiletype(int fileID, int *swap);
+
+void *extNew(void);
+void extDelete(void *ext);
+
+int extRead(int fileID, void *ext);
+int extWrite(int fileID, void *ext);
+
+int extInqHeader(void *ext, int *header);
+int extInqDataFP32(void *ext, float *data);
+int extInqDataFP64(void *ext, double *data);
+
+int extDefHeader(void *ext, const int *header);
+int extDefDataFP32(void *ext, const float *data);
+int extDefDataFP64(void *ext, const double *data);
+
+#ifdef HAVE__FLOAT16
+int extInqDataFP16(void *ext, _Float16 *data);
+int extDefDataFP16(void *ext, const _Float16 *data);
+#endif
+
+#endif /* _EXTRA_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _IEG_H
+#define _IEG_H
+
+// clang-format off
+
+/* Level Types */
+#define  IEG_LTYPE_SURFACE               1
+#define  IEG_LTYPE_99                   99
+#define  IEG_LTYPE_ISOBARIC            100
+#define  IEG_LTYPE_MEANSEA             102
+#define  IEG_LTYPE_ALTITUDE            103
+#define  IEG_LTYPE_HEIGHT              105
+#define  IEG_LTYPE_SIGMA               107
+#define  IEG_LTYPE_HYBRID              109
+#define  IEG_LTYPE_HYBRID_LAYER        110
+#define  IEG_LTYPE_LANDDEPTH           111
+#define  IEG_LTYPE_LANDDEPTH_LAYER     112
+#define  IEG_LTYPE_SEADEPTH            160
+
+/*
+ *  Data representation type (Grid Type) [Table 6]
+ */
+#define  IEG_GTYPE_LATLON             0  /*  latitude/longitude                       */
+#define  IEG_GTYPE_LATLON_ROT        10  /*  rotated latitude/longitude               */
+
+#define  IEG_P_CodeTable(x)   (x[ 5])  /*  Version number of code table                 */
+#define  IEG_P_Parameter(x)   (x[ 6])  /*  Parameter indicator                          */
+#define  IEG_P_LevelType(x)   (x[ 7])  /*  Type of level indicator                      */
+#define  IEG_P_Level1(x)      (x[ 8])  /*  Level 1                                      */
+#define  IEG_P_Level2(x)      (x[ 9])  /*  Level 2                                      */
+#define  IEG_P_Year(x)        (x[10])  /*  Year of century (YY)                         */
+#define  IEG_P_Month(x)       (x[11])  /*  Month (MM)                                   */
+#define  IEG_P_Day(x)         (x[12])  /*  Day (DD)                                     */
+#define  IEG_P_Hour(x)        (x[13])  /*  Hour (HH)                                    */
+#define  IEG_P_Minute(x)      (x[14])  /*  Minute (MM)                                  */
+
+/*
+ *  Macros for the grid definition section ( Section 2 )
+ */
+#define  IEG_G_Size(x)        (x[ 0])
+#define  IEG_G_NumVCP(x)      (x[3] == 10 ? (x[0]-42)/4 : (x[0]-32)/4)
+#define  IEG_G_GridType(x)    (x[ 3])  /*  Data representation type */
+#define  IEG_G_NumLon(x)      (x[ 4])  /*  Number of points along a parallel (Ni)       */
+#define  IEG_G_NumLat(x)      (x[ 5])  /*  Number of points along a meridian (Nj)       */
+#define  IEG_G_FirstLat(x)    (x[ 6])  /*  Latitude of the first grid point             */
+#define  IEG_G_FirstLon(x)    (x[ 7])  /*  Longitude of the first grid point            */
+#define  IEG_G_ResFlag(x)     (x[ 8])  /*  Resolution flag: 128 regular grid            */
+#define  IEG_G_LastLat(x)     (x[ 9])  /*  Latitude of the last grid point              */
+#define  IEG_G_LastLon(x)     (x[10])  /*  Longitude of the last grid point             */
+#define  IEG_G_LonIncr(x)     (x[11])  /*  i direction increment                        */
+#define  IEG_G_LatIncr(x)     (x[12])  /*  j direction increment                        */
+#define  IEG_G_ScanFlag(x)    (x[13])
+#define  IEG_G_LatSP(x)       (x[16])  /*  Latitude of the southern pole of rotation    */
+#define  IEG_G_LonSP(x)       (x[17])  /*  Longitude of the southern pole of rotation   */
+#define  IEG_G_ResFac(x)      (x[18])  /*  Resolution factor                            */
+
+// clang-format on
+
+typedef struct
+{
+  int checked;
+  int byteswap;
+  int dprec; /* data   precision */
+  int ipdb[37];
+  double refval;
+  int igdb[22];
+  double vct[100];
+  size_t datasize;
+  size_t buffersize;
+  void *buffer;
+} iegrec_t;
+
+const char *iegLibraryVersion(void);
+
+void iegDebug(int debug);
+int iegCheckFiletype(int fileID, int *swap);
+
+void *iegNew(void);
+void iegDelete(void *ieg);
+void iegInitMem(void *ieg);
+
+int iegRead(int fileID, void *ieg);
+int iegWrite(int fileID, void *ieg);
+
+void iegCopyMeta(void *dieg, void *sieg);
+int iegInqHeader(void *ieg, int *header);
+int iegInqDataFP32(void *ieg, float *data);
+int iegInqDataFP64(void *ieg, double *data);
+
+int iegDefHeader(void *ieg, const int *header);
+int iegDefDataFP32(void *ieg, const float *data);
+int iegDefDataFP64(void *ieg, const double *data);
+
+#endif /* _IEG_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_INT_H
+#define CDI_INT_H
+
+// strdup() from string.h
+#ifdef __STDC_ALLOC_LIB__
+#define __STDC_WANT_LIB_EXT2__ 1
+#else
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+#endif
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBFDB5
+#endif
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <math.h>
+#include <sys/types.h>
+
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+extern pthread_mutex_t CDI_IO_Mutex;
+#define CDI_IO_LOCK() pthread_mutex_lock(&CDI_IO_Mutex)
+#define CDI_IO_UNLOCK() pthread_mutex_unlock(&CDI_IO_Mutex)
+#else
+#define CDI_IO_LOCK()
+#define CDI_IO_UNLOCK()
+#endif
+
+// Base file types
+
+#define CDI_FILETYPE_GRIB 100    // File type GRIB
+#define CDI_FILETYPE_NETCDF 101  // File type NetCDF
+
+// dummy use of unused parameters to silence compiler warnings
+#ifndef UNUSED
+#define UNUSED(x) (void) x
+#endif
+
+char *str_to_lower(char *str);
+bool strStartsWith(const char *vstr, const char *cstr);
+
+static inline bool
+str_is_equal(const char *x, const char *y)
+{
+  return (*x == *y) && strcmp(x, y) == 0;
+}
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846 /* pi */
+#endif
+
+#ifndef ERROR_H
+#endif
+#ifndef _BASETIME_H
+#endif
+#ifndef JULIAN_DATE_H
+#endif
+#ifndef TAXIS_H
+#endif
+#ifndef CDI_LIMITS_H
+#endif
+#ifndef _SERVICE_H
+#endif
+#ifndef _EXTRA_H
+#endif
+#ifndef _IEG_H
+#endif
+#ifndef RESOURCE_HANDLE_H
+#endif
+
+#define check_parg(arg) \
+  if (arg == 0) Warning("Argument '" #arg "' not allocated!")
+
+#ifdef __xlC__ /* performance problems on IBM */
+#ifndef DBL_IS_NAN
+#define DBL_IS_NAN(x) ((x) != (x))
+#endif
+#else
+#ifndef DBL_IS_NAN
+#if defined(HAVE_DECL_ISNAN)
+#define DBL_IS_NAN(x) (isnan(x))
+#elif defined(FP_NAN)
+#define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN)
+#else
+#define DBL_IS_NAN(x) ((x) != (x))
+#endif
+#endif
+#endif
+
+#ifndef DBL_IS_EQUAL
+// #define DBL_IS_EQUAL(x,y) (!(x < y || y < x))
+#define DBL_IS_EQUAL(x, y) (DBL_IS_NAN(x) || DBL_IS_NAN(y) ? (DBL_IS_NAN(x) && DBL_IS_NAN(y)) : !(x < y || y < x))
+#endif
+
+#ifndef IS_EQUAL
+#define IS_NOT_EQUAL(x, y) (x < y || y < x)
+#define IS_EQUAL(x, y) (!IS_NOT_EQUAL(x, y))
+#endif
+
+enum
+{
+  TYPE_REC,
+  TYPE_VAR,
+};
+
+enum
+{
+  MEMTYPE_DOUBLE = 1,
+  MEMTYPE_FLOAT,
+};
+
+typedef struct
+{
+  void *buffer;       // gribapi, cgribex
+  size_t buffersize;  // gribapi, cgribex
+  off_t position;     // file position
+  int param;
+  int ilevel;
+  int vdate;
+  int vtime;
+  int gridID;
+  int varID;
+  int levelID;
+  int prec;       // ext, srv
+  void *objectp;  // pointer to ieg, ext, srv or cgribex objects
+} Record;
+
+// data structure specifying tile-related meta-data. structure contains "-1" if this is no tile-variable.
+typedef struct
+{
+  int tileindex, totalno_of_tileattr_pairs, tileClassification, numberOfTiles, numberOfAttributes, attribute;
+} var_tile_t;
+
+typedef struct
+{
+  short perturbationNumber;
+  short typeOfGeneratingProcess;
+} VarScanKeys;
+
+static inline void
+varScanKeysInit(VarScanKeys *s)
+{
+  memset(s, 0, sizeof(VarScanKeys));
+}
+
+static inline bool
+varScanKeysIsEqual(const VarScanKeys *s1, const VarScanKeys *s2)
+{
+  return memcmp(s1, s2, sizeof(VarScanKeys)) == 0;
+}
+
+typedef struct
+{
+  off_t position;
+  size_t size;
+  size_t gridsize;
+  int zip;
+  int param;
+  int ilevel;
+  int ilevel2;
+  int ltype;
+  short tsteptype;
+  short varID;
+  int levelID;
+  short used;
+  char varname[32];  // needed for grib decoding with GRIB_API
+  VarScanKeys scanKeys;
+  var_tile_t tiles;  // tile-related meta-data, currently for GRIB-API only.
+#ifdef HAVE_LIBFDB5
+  int fdbItemIndex;
+#endif
+} record_t;
+
+typedef struct
+{
+  int *recIDs;  // IDs of non constant records
+  record_t *records;
+  int recordSize;   // number of allocated records
+  int nrecs;        // number of used records
+                    // tsID=0 nallrecs
+                    // tsID>0 number of non constant records
+  int nallrecs;     // number of all records
+  int curRecID;     // current record ID
+  int ncStepIndex;  // NetCDF timestep index
+  off_t position;   // timestep file position
+  taxis_t taxis;
+  bool next;
+} tsteps_t;
+
+typedef struct
+{
+  int nlevs;
+  int subtypeIndex;  // corresponding tile in subtype_t structure (subtype->self)
+  int *recordID;     // record IDs: [nlevs]
+  int *lindex;       // level index
+} sleveltable_t;
+
+typedef struct
+{
+  sleveltable_t *recordTable;  // record IDs for each subtype
+  int ncvarid;
+  int subtypeSize;
+  bool defmiss;  // true: if missval is defined in file
+  bool isUsed;
+
+  int gridID;
+  int zaxisID;
+  int tsteptype;  // TSTEP_*
+  int subtypeID;  // subtype ID, e.g. for tile-related meta-data (currently for GRIB-API only).
+} svarinfo_t;
+
+typedef struct
+{
+  int ilev;
+  int mlev;
+  int ilevID;
+  int mlevID;
+} VCT;
+
+#ifdef HAVE_LIBNETCDF
+enum cdfIDIdx
+{
+  CDF_DIMID_E,  // 3rd dimID of cube sphere grid (len=6)
+  CDF_DIMID_X,
+  CDF_DIMID_Y,
+  CDF_DIMID_RP,  // reducedPoints
+  CDF_VARID_X,
+  CDF_VARID_Y,
+  CDF_VARID_RP,  // reducedPoints
+  CDF_VARID_A,
+  CDF_SIZE_ncIDs,
+};
+
+typedef struct
+{
+  int ncIDs[CDF_SIZE_ncIDs];
+  int gridID;
+  long start;
+  long count;
+} ncgrid_t;
+#endif
+
+typedef struct
+{
+  int self;
+  int accesstype;  // TYPE_REC or TYPE_VAR
+  int accessmode;
+  int filetype;
+  int byteorder;
+  int fileID;
+  int filemode;
+  int nrecs;  // number of records
+  SizeType numvals;
+  char *filename;
+  Record *record;
+  CdiQuery *query;
+  svarinfo_t *vars;
+  int nvars;  // number of variables
+  int varsAllocated;
+  int curTsID;   // current timestep ID
+  int rtsteps;   // number of tsteps accessed
+  long ntsteps;  // number of tsteps : only set if all records accessed
+  int maxSteps;  // max. number of timesteps (needed for CDI_FILETYPE_NCZARR)
+  tsteps_t *tsteps;
+  int tstepsTableSize;
+  int tstepsNextID;
+  basetime_t basetime;
+  int ncmode;
+  int vlistID;
+#ifdef HAVE_LIBNETCDF
+  int nc_complex_float_id;
+  int nc_complex_double_id;
+  ncgrid_t ncgrid[MAX_GRIDS_PS];
+  int zaxisID[MAX_ZAXES_PS];  // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs
+  int nczvarID[MAX_ZAXES_PS];
+  int ncNumDims;
+  int ncDimID[MAX_DIMS_PS];
+  size_t ncDimLen[MAX_DIMS_PS];
+  VCT vct;
+  size_t chunkSizeTdim;
+  size_t chunkSizeZdim;
+#endif
+  long maxGlobalRecs;
+  int globalatts;
+  int localatts;
+  int unreduced;
+  int have_missval;
+  int shuffle;
+  // netcdf4/HDF5 filter
+  char *filterSpec;
+
+  int comptype;   // compression type
+  int complevel;  // compression level
+  bool sortname;
+  bool lockIO;
+
+  void *gribContainers;
+
+  int numWorker;
+  int nextGlobalRecId;
+  int cachedTsID;
+  void *jobs;
+  void *jobManager;
+
+  int protocol;
+  void *protocolData;
+
+#ifdef HAVE_LIBFDB5
+  int fdbNumItems;
+  fdbKeyValueEntry *fdbKeyValueList;
+#endif
+} stream_t;
+
+// Length of optional keyword/value pair list
+#define MAX_OPT_GRIB_ENTRIES 500
+
+enum cdi_convention
+{
+  CDI_CONVENTION_ECHAM,
+  CDI_CONVENTION_CF
+};
+
+// Data type specification for optional key/value pairs (GRIB)
+typedef enum
+{
+  t_double = 0,
+  t_int = 1
+} key_val_pair_datatype;
+
+// Data structure holding optional key/value pairs for GRIB
+typedef struct
+{
+  char *keyword;  // keyword string
+  bool update;
+  key_val_pair_datatype data_type;  // data type of this key/value pair
+  double dbl_val;                   // double value (data_type == t_double)
+  int int_val;                      // integer value (data_type == t_int)
+  int subtype_index;                // tile index for this key-value pair
+} opt_key_val_pair_t;
+
+// enum for differenciating between the different times that we handle
+typedef enum
+{
+  kCdiTimeType_referenceTime,
+  kCdiTimeType_startTime,
+  kCdiTimeType_endTime
+} CdiTimeType;
+
+#define CDI_FILETYPE_UNDEF -1  // Unknown/not yet defined file type
+
+extern int cdiDebugExt;
+extern int CDI_Debug;  // If set to 1, debuggig (default 0)
+extern int CDI_Recopt;
+extern bool CDI_gribapi_debug;
+extern bool CDI_gribapi_grib1;
+extern double CDI_Default_Missval;
+extern double CDI_Grid_Missval;
+extern int CDI_Default_InstID;
+extern int CDI_Default_ModelID;
+extern int CDI_Default_TableID;
+extern int cdiDefaultLeveltype;
+extern int CDI_Default_Calendar;
+// extern int cdiNcMissingValue;
+extern int CDI_Netcdf_Chunksizehint;
+extern int CDI_ChunkType;
+extern int CDI_Test;
+extern int CDI_Split_Ltype105;
+extern bool CDI_Lock_IO;
+extern bool CDI_Threadsafe;
+extern int cdiDataUnreduced;
+extern int cdiSortName;
+extern int cdiHaveMissval;
+extern bool CDI_Ignore_Att_Coordinates;
+extern bool CDI_Coordinates_Lon_Lat;
+extern bool CDI_Ignore_Valid_Range;
+extern int CDI_Skip_Records;
+extern const char *CDI_GRIB1_Template;
+extern const char *CDI_GRIB2_Template;
+extern int CDI_Convention;
+extern int CDI_Inventory_Mode;
+extern int CDI_Query_Abort;
+extern int CDI_Version_Info;
+extern int CDI_Convert_Cubesphere;
+extern int CDI_Read_Cell_Corners;
+extern int CDI_CMOR_Mode;
+extern int CDI_Reduce_Dim;
+extern int CDI_Shuffle;
+extern size_t CDI_Netcdf_Hdr_Pad;
+extern bool CDI_Chunk_Cache_Info;
+extern long CDI_Chunk_Cache;
+extern size_t CDI_Chunk_Cache_Max;
+extern bool CDI_Netcdf_Lazy_Grid_Load;
+extern int STREAM_Debug;
+
+extern char *cdiPartabPath;
+extern int cdiPartabIntern;
+extern const resOps streamOps;
+
+static inline stream_t *
+stream_to_pointer(int idx)
+{
+  return (stream_t *) reshGetVal(idx, &streamOps);
+}
+
+static inline void
+stream_check_ptr(const char *caller, stream_t *streamptr)
+{
+  if (streamptr == NULL) Errorc("stream undefined!");
+}
+
+int streamInqFileID(int streamID);
+
+void gridDefHasDims(int gridID, int hasdims);
+int gridInqHasDims(int gridID);
+int zaxisInqLevelID(int zaxisID, double level);
+
+void streamCheckID(const char *caller, int streamID);
+
+void streamDefineTaxis(int streamID);
+
+int streamsNewEntry(int filetype);
+void streamsInitEntry(int streamID);
+void cdiStreamSetupVlist(stream_t *streamptr, int vlistID);
+// default implementation of the overridable function
+void cdiStreamSetupVlist_(stream_t *streamptr, int vlistID);
+int stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID);
+
+int tstepsNewEntry(stream_t *streamptr);
+
+const char *strfiletype(int filetype);
+
+void cdi_generate_vars(stream_t *streamptr);
+
+void vlist_check_contents(int vlistID);
+
+void cdi_create_records(stream_t *streamptr, int tsID);
+
+void streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name);
+
+int recordNewEntry(stream_t *streamptr, int tsID);
+
+void cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr);
+
+void recordInitEntry(record_t *record);
+
+void cdiCheckZaxis(int zaxisID);
+
+void cdiDefAccesstype(int streamID, int type);
+int cdiInqAccesstype(int streamID);
+
+int getByteswap(int byteorder);
+
+void cdiStreamGetIndexList(unsigned numIDs, int IDs[]);
+
+void cdiInitialize(void);
+
+char *cdiEscapeSpaces(const char *string);
+char *cdiUnescapeSpaces(const char *string, const char **outStringEnd);
+
+enum
+{
+  CDI_UNIT_PA = 1,
+  CDI_UNIT_HPA,
+  CDI_UNIT_MM,
+  CDI_UNIT_CM,
+  CDI_UNIT_DM,
+  CDI_UNIT_M,
+};
+
+struct streamAssoc
+{
+  int streamID, vlistID;
+};
+
+struct streamAssoc streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context);
+
+int cdiStreamOpenDefaultDelegate(const char *filename, char filemode, int filetype, stream_t *streamptr,
+                                 int recordBufIsToBeCreated);
+
+int streamOpenID(const char *filename, char filemode, int filetype, int resH);
+
+void cdiStreamDefVlist_(int streamID, int vlistID);
+
+int cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals);
+
+void cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals);
+void cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted);
+
+int cdiStreamDefTimestep_(stream_t *streamptr, int tsID);
+
+void cdiStreamSync_(stream_t *streamptr);
+
+const char *cdiUnitNamePtr(int cdi_unit);
+
+enum
+{
+  // 8192 is known to work on most systems (4096 isn't on Alpha)
+  commonPageSize = 8192,
+};
+
+size_t cdiGetPageSize(bool largePageAlign);
+
+void zaxisGetIndexList(int nzaxis, int *zaxisIndexList);
+
+// clang-format off
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// functions used in CDO !!!
+
+void cdiDefTableID(int tableID);
+
+void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *xvals);
+void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *yvals);
+
+static inline
+void cdi_check_gridsize_int_limit(const char *format, SizeType gridsize)
+{
+  if (gridsize > INT_MAX) Error("%s format grid size (%zu) limit exceeded (%zu)!", format, gridsize, INT_MAX);
+}
+
+bool cdiFiletypeIsExse(int filetype);
+int cdiBaseFiletype(int filetype);
+
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* CDI_INT_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDF_INT_H
+#define CDF_INT_H
+
+#ifdef HAVE_LIBNETCDF
+
+#include <netcdf.h>
+#include <stdint.h>  // int64_t
+
+void cdf__create(const char *path, int cmode, int *idp);
+void cdf_create(const char *path, int cmode, int *idp);
+int cdf_open(const char *path, int omode, int *idp);
+void cdf_close(int ncid);
+
+void cdf_redef(int ncid);
+void cdf_enddef(int ncid, int streamID);
+void cdf__enddef(int ncid, int streamID, const size_t hdr_pad);
+void cdf_sync(int ncid);
+
+void cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp);
+
+void cdf_def_dim(int ncid, const char *name, size_t len, int *idp);
+void cdf_inq_dimid(int ncid, const char *name, int *dimidp);
+void cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp);
+void cdf_inq_dimname(int ncid, int dimid, char *name);
+void cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp);
+void cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp);
+void cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp);
+void cdf_inq_varid(int ncid, const char *name, int *varidp);
+void cdf_inq_nvars(int ncid, int *nvarsp);
+void cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp);
+void cdf_inq_varname(int ncid, int varid, char *name);
+void cdf_inq_vartype(int ncid, int varid, nc_type *xtypep);
+void cdf_inq_varndims(int ncid, int varid, int *ndimsp);
+void cdf_inq_vardimid(int ncid, int varid, int dimids[]);
+void cdf_inq_varnatts(int ncid, int varid, int *nattsp);
+
+void cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out);
+void cdf_put_var_text(int ncid, int varid, const char *tp);
+void cdf_put_var_uchar(int ncid, int varid, const unsigned char *up);
+void cdf_put_var_schar(int ncid, int varid, const signed char *cp);
+void cdf_put_var_short(int ncid, int varid, const short *sp);
+void cdf_put_var_int(int ncid, int varid, const int *ip);
+void cdf_put_var_long(int ncid, int varid, const long *lp);
+void cdf_put_var_float(int ncid, int varid, const float *fp);
+void cdf_put_var_double(int ncid, int varid, const double *dp);
+
+void cdf_get_var_text(int ncid, int varid, char *tp);
+void cdf_get_var_uchar(int ncid, int varid, unsigned char *up);
+void cdf_get_var_schar(int ncid, int varid, signed char *cp);
+void cdf_get_var_short(int ncid, int varid, short *sp);
+void cdf_get_var_int(int ncid, int varid, int *ip);
+void cdf_get_var_long(int ncid, int varid, long *lp);
+void cdf_get_var_float(int ncid, int varid, float *fp);
+void cdf_get_var_double(int ncid, int varid, double *dp);
+
+void cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp);
+
+void cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp);
+void cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp);
+
+void cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp);
+void cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp);
+
+void cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp);
+void cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp);
+
+void cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp);
+void cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp);
+
+void cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *dp);
+
+void cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp);
+void cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp);
+
+void cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp);
+void cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip);
+void cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp);
+void cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp);
+
+void cdf_get_att_string(int ncid, int varid, const char *name, char **tp);
+void cdf_get_att_text(int ncid, int varid, const char *name, char *tp);
+void cdf_get_att_int(int ncid, int varid, const char *name, int *ip);
+void cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp);
+void cdf_get_att_double(int ncid, int varid, const char *name, double *dp);
+
+void cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp);
+void cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep);
+void cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp);
+void cdf_inq_attname(int ncid, int varid, int attnum, char *name);
+void cdf_inq_attid(int ncid, int varid, const char *name, int *attnump);
+
+void cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp);
+
+typedef int (*cdi_nc__create_funcp)(const char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp);
+
+typedef void (*cdi_cdf_def_var_funcp)(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp);
+
+int cdi_nc_enddef_serial(int ncid, int streamID);
+int cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align);
+typedef int (*cdi_nc_enddef_funcp)(int ncid, int streamID);
+typedef int (*cdi_nc__enddef_funcp)(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align);
+#endif
+
+#endif /* CDF_INT_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <ctype.h>
+
+
+#ifdef HAVE_LIBNETCDF
+const char *
+cdfLibraryVersion(void)
+{
+  return nc_inq_libvers();
+}
+
+int CDF_Debug = 0;  // If set to 1, debugging
+
+void
+cdfDebug(int debug)
+{
+  CDF_Debug = debug;
+
+  if (CDF_Debug) Message("debug level %d", debug);
+}
+
+static void
+cdfComment(int ncid)
+{
+  static char comment[256] = "Climate Data Interface version ";
+  static bool init = false;
+
+  if (!init)
+    {
+      init = true;
+      const char *libvers = cdiLibraryVersion();
+
+      if (!isdigit((int) *libvers))
+        strcat(comment, "??");
+      else
+        strcat(comment, libvers);
+      strcat(comment, " (https://mpimet.mpg.de/cdi)");
+    }
+
+  cdf_put_att_text(ncid, NC_GLOBAL, "CDI", strlen(comment), comment);
+}
+
+static bool
+has_uri_scheme(const char *uri)
+{
+  const char *pos = strstr(uri, "://");
+  if (pos)
+    {
+      size_t len = (size_t) (pos - uri);
+      if (strncmp(uri, "file", len) == 0 || strncmp(uri, "https", len) == 0 || strncmp(uri, "s3", len) == 0) return true;
+    }
+
+  return false;
+}
+
+static int
+cdf_open_read(const char *filename, int *filetype)
+{
+  int ncid = -1;
+  int readmode = NC_NOWRITE;
+  int status = cdf_open(filename, readmode, &ncid);
+  if (status > 0 && ncid < 0) ncid = CDI_ESYSTEM;
+#ifdef HAVE_NETCDF4
+  else
+    {
+      int format = -1;
+      status = nc_inq_format(ncid, &format);
+      if (status == NC_NOERR && format == NC_FORMAT_NETCDF4_CLASSIC) *filetype = CDI_FILETYPE_NC4C;
+
+#ifdef NC_FORMATX_NCZARR
+      int modeNC;
+      status = nc_inq_format_extended(ncid, &format, &modeNC);
+      if (status == NC_NOERR && format == NC_FORMATX_NCZARR) *filetype = CDI_FILETYPE_NCZARR;
+#endif
+    }
+#endif
+
+  return ncid;
+}
+
+static int
+cdf_open_write(const char *filename, int *filetype)
+{
+  int ncid = -1;
+  int writemode = NC_CLOBBER;
+
+#ifdef NC_64BIT_OFFSET
+  if (*filetype == CDI_FILETYPE_NC2) writemode |= NC_64BIT_OFFSET;
+#endif
+#ifdef NC_64BIT_DATA
+  if (*filetype == CDI_FILETYPE_NC5) writemode |= NC_64BIT_DATA;
+#endif
+#ifdef HAVE_NETCDF4
+  if (*filetype == CDI_FILETYPE_NC4C) writemode |= (NC_NETCDF4 | NC_CLASSIC_MODEL);
+  if (*filetype == CDI_FILETYPE_NC4) writemode |= NC_NETCDF4;
+  if (*filetype == CDI_FILETYPE_NCZARR) writemode |= NC_NETCDF4;
+#endif
+  if (*filetype == CDI_FILETYPE_NCZARR)
+    {
+      if (!has_uri_scheme(filename))
+        {
+          fprintf(stderr, "URI scheme is missing in NCZarr path!\n");
+          return CDI_EINVAL;
+        }
+
+      cdf_create(filename, writemode, &ncid);
+    }
+  else
+    {
+      if (has_uri_scheme(filename)) fprintf(stderr, "URI scheme defined for non NCZarr Data Model!\n");
+
+      cdf__create(filename, writemode, &ncid);
+    }
+
+  return ncid;
+}
+
+static int
+cdfOpenFile(const char *filename, const char *mode, int *filetype)
+{
+  int ncid = -1;
+
+  if (filename == NULL)
+    {
+      ncid = CDI_EINVAL;
+    }
+  else
+    {
+      int fmode = tolower(*mode);
+      switch (fmode)
+        {
+        case 'r': ncid = cdf_open_read(filename, filetype); break;
+        case 'w':
+          ncid = cdf_open_write(filename, filetype);
+          if (ncid != CDI_EINVAL)
+            {
+              if (CDI_Version_Info) cdfComment(ncid);
+              cdf_put_att_text(ncid, NC_GLOBAL, "Conventions", 6, "CF-1.6");
+            }
+          break;
+        case 'a': cdf_open(filename, NC_WRITE, &ncid); break;
+        default: ncid = CDI_EINVAL;
+        }
+    }
+
+  return ncid;
+}
+
+int
+cdfOpen(const char *filename, const char *mode, int filetype)
+{
+  int fileID = -1;
+  bool open_file = true;
+
+  if (CDF_Debug) Message("Open %s with mode %c", filename, *mode);
+
+#ifndef NC_64BIT_OFFSET
+  if (filetype == CDI_FILETYPE_NC2) open_file = false;
+#endif
+#ifndef NC_64BIT_DATA
+  if (filetype == CDI_FILETYPE_NC5) open_file = false;
+#endif
+
+  if (open_file)
+    {
+      fileID = cdfOpenFile(filename, mode, &filetype);
+
+      if (CDF_Debug) Message("File %s opened with id %d", filename, fileID);
+    }
+  else
+    {
+      fileID = CDI_ELIBNAVAIL;
+    }
+
+  return fileID;
+}
+
+int
+cdf4Open(const char *filename, const char *mode, int *filetype)
+{
+  if (CDF_Debug) Message("Open %s with mode %c", filename, *mode);
+
+#ifdef HAVE_NETCDF4
+  int fileID = cdfOpenFile(filename, mode, filetype);
+  if (CDF_Debug) Message("File %s opened with id %d", filename, fileID);
+  return fileID;
+#else
+  return CDI_ELIBNAVAIL;
+#endif
+}
+
+static void
+cdfCloseFile(int fileID)
+{
+  cdf_close(fileID);
+}
+
+void
+cdfClose(int fileID)
+{
+  cdfCloseFile(fileID);
+}
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef NAMESPACE_H
+#define NAMESPACE_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+typedef struct
+{
+  int idx;
+  int nsp;
+} namespaceTuple_t;
+
+enum namespaceSwitch
+{
+  NSSWITCH_NO_SUCH_SWITCH = -1,
+  NSSWITCH_ABORT,
+  NSSWITCH_WARNING,
+  NSSWITCH_SERIALIZE_GET_SIZE,
+  NSSWITCH_SERIALIZE_PACK,
+  NSSWITCH_SERIALIZE_UNPACK,
+  NSSWITCH_FILE_OPEN,
+  NSSWITCH_FILE_WRITE,
+  NSSWITCH_FILE_CLOSE,
+  NSSWITCH_STREAM_OPEN_BACKEND,
+  NSSWITCH_STREAM_DEF_VLIST_,
+  NSSWITCH_STREAM_SETUP_VLIST,
+  NSSWITCH_STREAM_WRITE_VAR_,
+  NSSWITCH_STREAM_WRITE_VAR_CHUNK_,
+  NSSWITCH_STREAM_WRITE_VAR_PART_,
+  NSSWITCH_STREAM_WRITE_SCATTERED_VAR_PART_,
+  NSSWITCH_STREAM_CLOSE_BACKEND,
+  NSSWITCH_STREAM_DEF_TIMESTEP_,
+  NSSWITCH_STREAM_SYNC,
+  NSSWITCH_VLIST_DESTROY_,
+#ifdef HAVE_LIBNETCDF
+  NSSWITCH_NC__CREATE,
+  NSSWITCH_CDF_DEF_VAR,
+  NSSWITCH_NC_ENDDEF,
+  NSSWITCH_NC__ENDDEF,
+  NSSWITCH_CDF_DEF_TIMESTEP,
+  NSSWITCH_CDF_STREAM_SETUP,
+  NSSWITCH_CDF_POSTDEFACTION_GRID_PROP,
+#endif
+  NUM_NAMESPACE_SWITCH,
+};
+
+union namespaceSwitchValue
+{
+  void *data;
+  void (*func)(void);
+};
+
+#define NSSW_FUNC(p) ((union namespaceSwitchValue){ .func = (void (*)(void))(p) })
+#define NSSW_DATA(p) ((union namespaceSwitchValue){ .data = (void *) (p) })
+
+// int              namespaceNew();
+// void             namespaceDelete(int namespaceID);
+void namespaceCleanup(void);
+int namespaceGetNumber(void);
+// void             namespaceSetActive(int namespaceID);
+// int              namespaceGetActive    ( void );
+int namespaceIdxEncode(namespaceTuple_t);
+int namespaceIdxEncode2(int, int);
+namespaceTuple_t namespaceResHDecode(int);
+int namespaceAdaptKey(int originResH, int originNamespace);
+int namespaceAdaptKey2(int);
+void namespaceSwitchSet(int sw, union namespaceSwitchValue value);
+union namespaceSwitchValue namespaceSwitchGet(int sw);
+/* reserve new dynamic key */
+int cdiNamespaceSwitchNewKey(void);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <sys/stat.h>
+
+
+#ifdef HAVE_LIBNETCDF
+
+void
+cdf_create(const char *path, int cmode, int *ncidp)
+{
+  int status = nc_create(path, cmode, ncidp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  mode=%d  file=%s", *ncidp, cmode, path);
+
+  if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status));
+
+  int oldfill;
+  status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill);
+
+  if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status));
+}
+
+void
+cdf__create(const char *path, int cmode, int *ncidp)
+{
+  int status = -1;
+  size_t chunksizehint = 0;
+
+  size_t initialsz = 0;
+
+#if defined(__SX__) || defined(ES)
+  chunksizehint = 16777216;  // 16 MB
+#endif
+
+  if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint;
+
+  cdi_nc__create_funcp my_nc__create = (cdi_nc__create_funcp) namespaceSwitchGet(NSSWITCH_NC__CREATE).func;
+  status = my_nc__create(path, cmode, initialsz, &chunksizehint, ncidp);
+
+  if (status != NC_NOERR)
+    {
+      if (CDF_Debug) Message("ncid=%d  mode=%d  chunksizehint=%zu  file=%s", *ncidp, cmode, chunksizehint, path);
+      Error("%s: %s", path, nc_strerror(status));
+    }
+
+  int oldfill;
+  status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill);
+
+  if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status));
+}
+
+int
+cdf_open(const char *path, int omode, int *ncidp)
+{
+  int status = 0;
+
+  if (strstr(path, ":/"))  // ESDM and DAP
+    {
+      status = nc_open(path, omode, ncidp);
+    }
+  else
+    {
+      struct stat filestat;
+      if (stat(path, &filestat) != 0) SysError(path);
+
+      size_t chunksizehint = 0;
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+      chunksizehint = (size_t) filestat.st_blksize * 4;
+      if (chunksizehint > (size_t) filestat.st_size) chunksizehint = (size_t) filestat.st_size;
+#endif
+      // if (chunksizehint < ChunkSizeMin) chunksizehint = ChunkSizeMin;
+      if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint;
+
+      // FIXME: parallel part missing
+      status = nc__open(path, omode, &chunksizehint, ncidp);
+
+      if (CDF_Debug) Message("chunksizehint %zu", chunksizehint);
+    }
+
+  if (CDF_Debug) Message("ncid=%d  mode=%d  file=%s", *ncidp, omode, path);
+
+  if (CDF_Debug && status != NC_NOERR) Message("%s", nc_strerror(status));
+
+  return status;
+}
+
+void
+cdf_close(int ncid)
+{
+  int status = nc_close(ncid);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_redef(int ncid)
+{
+  int status = nc_redef(ncid);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+int
+cdi_nc_enddef_serial(int ncid, int streamID)
+{
+  (void) streamID;
+  return nc_enddef(ncid);
+}
+
+int
+cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align)
+{
+  (void) streamID;
+  return nc__enddef(ncid, hdr_pad, v_align, v_minfree, r_align);
+}
+
+void
+cdf_enddef(int ncid, int streamID)
+{
+  cdi_nc_enddef_funcp my_nc_enddef = (cdi_nc_enddef_funcp) namespaceSwitchGet(NSSWITCH_NC_ENDDEF).func;
+  int status = my_nc_enddef(ncid, streamID);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf__enddef(int ncid, int streamID, const size_t hdr_pad)
+{
+  const size_t v_align = 4UL;    // [B] Alignment of beginning of data section for fixed variables
+  const size_t v_minfree = 0UL;  // [B] Pad at end of data section for fixed size variables
+  const size_t r_align = 4UL;    // [B] Alignment of beginning of data section for record variables
+
+  // nc_enddef(ncid) is equivalent to nc__enddef(ncid, 0, 4, 0, 4)
+  cdi_nc__enddef_funcp my_nc__enddef = (cdi_nc__enddef_funcp) namespaceSwitchGet(NSSWITCH_NC_ENDDEF).func;
+  int status = my_nc__enddef(ncid, streamID, hdr_pad, v_align, v_minfree, r_align);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_sync(int ncid)
+{
+  int status = nc_sync(ncid);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp)
+{
+  int status = nc_inq(ncid, ndimsp, nvarsp, ngattsp, unlimdimidp);
+
+  if (CDF_Debug || status != NC_NOERR)
+    Message("ncid=%d  ndims=%d  nvars=%d  ngatts=%d  unlimid=%d", ncid, *ndimsp, *nvarsp, *ngattsp, *unlimdimidp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_def_dim(int ncid, const char *name, size_t len, int *dimidp)
+{
+  int status = nc_def_dim(ncid, name, len, dimidp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  name=%s  len=%d", ncid, name, len);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_dimid(int ncid, const char *name, int *dimidp)
+{
+  int status = nc_inq_dimid(ncid, name, dimidp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  name=%s  dimid=%d", ncid, name, *dimidp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp)
+{
+  int status = nc_inq_dim(ncid, dimid, name, lengthp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  dimid=%d  length=%d  name=%s", ncid, dimid, *lengthp, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_dimname(int ncid, int dimid, char *name)
+{
+  int status = nc_inq_dimname(ncid, dimid, name);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  dimid=%d  name=%s", ncid, dimid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp)
+{
+  int status = nc_inq_dimlen(ncid, dimid, lengthp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  dimid=%d  length=%d", ncid, dimid, *lengthp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp)
+{
+  cdi_cdf_def_var_funcp my_cdf_def_var = (cdi_cdf_def_var_funcp) namespaceSwitchGet(NSSWITCH_CDF_DEF_VAR).func;
+  my_cdf_def_var(ncid, name, xtype, ndims, dimids, varidp);
+}
+
+void
+cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp)
+{
+  int status = nc_def_var(ncid, name, xtype, ndims, dimids, varidp);
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  name=%s  xtype=%d  ndims=%d  varid=%d", ncid, name, xtype, ndims, *varidp);
+  if (status == NC_NOERR)
+    {
+      int fileFormat;
+      status = nc_inq_format(ncid, &fileFormat);
+      if (status == NC_NOERR && (fileFormat == NC_FORMAT_NETCDF4 || fileFormat == NC_FORMAT_NETCDF4_CLASSIC))
+        status = nc_def_var_fill(ncid, *varidp, 1, NULL);
+    }
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_varid(int ncid, const char *name, int *varidp)
+{
+  int status = nc_inq_varid(ncid, name, varidp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  name=%s  varid=%d", ncid, name, *varidp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_nvars(int ncid, int *nvarsp)
+{
+  int status = nc_inq_nvars(ncid, nvarsp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  nvars=%d", ncid, *nvarsp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp)
+{
+  int status = nc_inq_var(ncid, varid, name, xtypep, ndimsp, dimids, nattsp);
+
+  if (CDF_Debug || status != NC_NOERR)
+    Message("ncid=%d  varid=%d  ndims=%d  xtype=%d  natts=%d  name=%s", ncid, varid, *ndimsp, *xtypep, *nattsp, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_varname(int ncid, int varid, char *name)
+{
+  int status = nc_inq_varname(ncid, varid, name);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  name=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_vartype(int ncid, int varid, nc_type *xtypep)
+{
+  int status = nc_inq_vartype(ncid, varid, xtypep);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  xtype=%s", ncid, varid, *xtypep);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_varndims(int ncid, int varid, int *ndimsp)
+{
+  int status = nc_inq_varndims(ncid, varid, ndimsp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_vardimid(int ncid, int varid, int dimids[])
+{
+  int status = nc_inq_vardimid(ncid, varid, dimids);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_varnatts(int ncid, int varid, int *nattsp)
+{
+  int status = nc_inq_varnatts(ncid, varid, nattsp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  nattsp=%d", ncid, varid, *nattsp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_text(int ncid, int varid, const char *tp)
+{
+  int status = nc_put_var_text(ncid, varid, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %s", ncid, varid, tp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_short(int ncid, int varid, const short *sp)
+{
+  int status = nc_put_var_short(ncid, varid, sp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %hd", ncid, varid, *sp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_int(int ncid, int varid, const int *ip)
+{
+  int status = nc_put_var_int(ncid, varid, ip);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %d", ncid, varid, *ip);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_long(int ncid, int varid, const long *lp)
+{
+  int status = nc_put_var_long(ncid, varid, lp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %ld", ncid, varid, *lp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_float(int ncid, int varid, const float *fp)
+{
+  int status = nc_put_var_float(ncid, varid, fp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %f", ncid, varid, *fp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+static const char *
+cdf_var_type(nc_type xtype)
+{
+  const char *ctype = "unknown";
+
+  // clang-format off
+  if      (xtype == NC_BYTE  )  ctype = "NC_BYTE";
+  else if (xtype == NC_CHAR  )  ctype = "NC_CHAR";
+  else if (xtype == NC_SHORT )  ctype = "NC_SHORT";
+  else if (xtype == NC_INT   )  ctype = "NC_INT";
+  else if (xtype == NC_FLOAT )  ctype = "NC_FLOAT";
+  else if (xtype == NC_DOUBLE)  ctype = "NC_DOUBLE";
+#ifdef  HAVE_NETCDF4
+  else if (xtype == NC_UBYTE )  ctype = "NC_UBYTE";
+  else if (xtype == NC_LONG  )  ctype = "NC_LONG";
+  else if (xtype == NC_USHORT)  ctype = "NC_USHORT";
+  else if (xtype == NC_UINT  )  ctype = "NC_UINT";
+  else if (xtype == NC_INT64 )  ctype = "NC_INT64";
+  else if (xtype == NC_UINT64)  ctype = "NC_UINT64";
+#endif
+  // clang-format on
+
+  return ctype;
+}
+
+static void
+minmaxval(size_t nvals, const double *array, double *minval, double *maxval)
+{
+  double minv = array[0];
+  double maxv = array[0];
+  for (size_t i = 0; i < nvals; ++i)
+    {
+      minv = (array[i] < minv) ? array[i] : minv;
+      maxv = (array[i] > maxv) ? array[i] : maxv;
+    }
+
+  *minval = minv;
+  *maxval = maxv;
+}
+
+static void
+minmaxvalf(size_t nvals, const float *array, double *minval, double *maxval)
+{
+  float minv = array[0];
+  float maxv = array[0];
+  for (size_t i = 0; i < nvals; ++i)
+    {
+      minv = (array[i] < minv) ? array[i] : minv;
+      maxv = (array[i] > maxv) ? array[i] : maxv;
+    }
+
+  *minval = minv;
+  *maxval = maxv;
+}
+
+void
+cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp)
+{
+  int status = nc_put_vara_double(ncid, varid, start, count, dp);
+
+  if (CDF_Debug || status != NC_NOERR)
+    {
+      char name[256];
+      nc_inq_varname(ncid, varid, name);
+      nc_type xtype;
+      nc_inq_vartype(ncid, varid, &xtype);
+      int ndims;
+      nc_inq_varndims(ncid, varid, &ndims);
+      double minval = 0.0, maxval = 0.0;
+      size_t nvals = 1;
+      for (int i = 0; i < ndims; ++i) nvals *= count[i];
+      minmaxval(nvals, dp, &minval, &maxval);
+      Message("name=%s  type=%s  minval=%f  maxval=%f", name, cdf_var_type(xtype), minval, maxval);
+    }
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp)
+{
+  int status = nc_put_vara_float(ncid, varid, start, count, fp);
+
+  if (CDF_Debug || status != NC_NOERR)
+    {
+      char name[256];
+      nc_inq_varname(ncid, varid, name);
+      nc_type xtype;
+      nc_inq_vartype(ncid, varid, &xtype);
+      int ndims;
+      nc_inq_varndims(ncid, varid, &ndims);
+      double minval = 0.0, maxval = 0.0;
+      size_t nvals = 1;
+      for (int i = 0; i < ndims; ++i) nvals *= count[i];
+      minmaxvalf(nvals, fp, &minval, &maxval);
+      Message("name=%s  type=%s  minval=%f  maxval=%f", name, cdf_var_type(xtype), minval, maxval);
+    }
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp)
+{
+  int status = nc_put_vara(ncid, varid, start, count, cp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp)
+{
+  int status = nc_get_vara(ncid, varid, start, count, cp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *dp)
+{
+  int status = nc_get_vara_int(ncid, varid, start, count, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp)
+{
+  int status = nc_get_vara_double(ncid, varid, start, count, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  start[0]=%zu  count[0]=%zu", ncid, varid, start[0], count[0]);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp)
+{
+  int status = nc_get_vara_float(ncid, varid, start, count, fp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  start[0]=%zu  count[0]=%zu", ncid, varid, start[0], count[0]);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp)
+{
+  int status = nc_get_vara_text(ncid, varid, start, count, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp)
+{
+  int status = nc_get_vara_uchar(ncid, varid, start, count, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var_double(int ncid, int varid, const double *dp)
+{
+  int status = nc_put_var_double(ncid, varid, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  val0=%f", ncid, varid, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp)
+{
+  int status = nc_get_var1_text(ncid, varid, index, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp)
+{
+  int status = nc_get_var1_double(ncid, varid, index, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp)
+{
+  int status = nc_put_var1_double(ncid, varid, index, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  val=%f", ncid, varid, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_text(int ncid, int varid, char *tp)
+{
+  int status = nc_get_var_text(ncid, varid, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_short(int ncid, int varid, short *sp)
+{
+  int status = nc_get_var_short(ncid, varid, sp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_int(int ncid, int varid, int *ip)
+{
+  int status = nc_get_var_int(ncid, varid, ip);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_long(int ncid, int varid, long *lp)
+{
+  int status = nc_get_var_long(ncid, varid, lp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_float(int ncid, int varid, float *fp)
+{
+  int status = nc_get_var_float(ncid, varid, fp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d", ncid, varid);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_var_double(int ncid, int varid, double *dp)
+{
+  int status = nc_get_var_double(ncid, varid, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  val[0]=%f", ncid, varid, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out)
+{
+  int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out);
+
+  if (CDF_Debug || status != NC_NOERR) Message("%d %d %s %d %d", ncid_in, varid_out, name, ncid_out, varid_out);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp)
+{
+  int status = nc_put_att_text(ncid, varid, name, len, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  text=%.*s", ncid, varid, name, (int) len, tp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip)
+{
+  int status = nc_put_att_int(ncid, varid, name, xtype, len, ip);
+
+  if (status == NC_ERANGE) status = NC_NOERR;
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%d", ncid, varid, name, *ip);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp)
+{
+  int status = nc_put_att_float(ncid, varid, name, xtype, len, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%g", ncid, varid, name, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp)
+{
+  int status = nc_put_att_double(ncid, varid, name, xtype, len, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%g", ncid, varid, name, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_att_text(int ncid, int varid, const char *name, char *tp)
+{
+  int status = nc_get_att_text(ncid, varid, name, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  name=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_att_string(int ncid, int varid, const char *name, char **tp)
+{
+#ifdef HAVE_NETCDF4
+  int status = nc_get_att_string(ncid, varid, name, tp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  name=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+#endif
+}
+
+void
+cdf_get_att_int(int ncid, int varid, const char *name, int *ip)
+{
+  int status = nc_get_att_int(ncid, varid, name, ip);
+
+  if (status == NC_ERANGE) status = NC_NOERR;
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%d", ncid, varid, name, *ip);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp)
+{
+#ifdef HAVE_NETCDF4
+  int status = nc_get_att_longlong(ncid, varid, name, llp);
+
+  if (status == NC_ERANGE) status = NC_NOERR;
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%lld", ncid, varid, name, *llp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+#endif
+}
+
+void
+cdf_get_att_double(int ncid, int varid, const char *name, double *dp)
+{
+  int status = nc_get_att_double(ncid, varid, name, dp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  val=%.9g", ncid, varid, name, *dp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp)
+{
+  int status = nc_inq_att(ncid, varid, name, xtypep, lenp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep)
+{
+  int status = nc_inq_atttype(ncid, varid, name, xtypep);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp)
+{
+  int status = nc_inq_attlen(ncid, varid, name, lenp);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s  len=%d", ncid, varid, name, *lenp);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_attname(int ncid, int varid, int attnum, char *name)
+{
+  int status = nc_inq_attname(ncid, varid, attnum, name);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  attnum=%d  att=%s", ncid, varid, attnum, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+void
+cdf_inq_attid(int ncid, int varid, const char *name, int *attnump)
+{
+  int status = nc_inq_attid(ncid, varid, name, attnump);
+
+  if (CDF_Debug || status != NC_NOERR) Message("ncid=%d  varid=%d  att=%s", ncid, varid, name);
+
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+
+#ifdef HAVE_NETCDF4
+void
+cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp)
+{
+  int status = nc_def_var_chunking(ncid, varid, storage, chunksizesp);
+  if (status != NC_NOERR) Error("%s", nc_strerror(status));
+}
+#endif
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDF_UTIL_H_
+#define CDF_UTIL_H_
+
+#include <stdbool.h>
+
+bool xtypeIsText(int xtype);
+
+int get_time_units(size_t len, const char *ptu);
+
+bool is_time_units(const char *timeunits);
+bool is_timeaxis_units(const char *timeunits);
+
+bool is_height_units(const char *units);
+bool is_pressure_units(const char *units);
+bool is_DBL_axis(/*const char *units,*/ const char *longname);
+bool is_depth_axis(const char *stdname, const char *longname);
+bool is_height_axis(const char *stdname, const char *longname);
+bool is_altitude_axis(const char *stdname, const char *longname);
+bool is_reference_axis(const char *stdname, const char *longname);
+
+bool is_lon_axis(const char *units, const char *stdname);
+bool is_lat_axis(const char *units, const char *stdname);
+
+bool is_x_axis(const char *units, const char *stdname);
+bool is_y_axis(const char *units, const char *stdname);
+
+void cdf_set_gridtype(const char *attstring, int *gridtype);
+void cdf_set_zaxistype(const char *attstring, int *zaxistype);
+int attribute_to_calendar(const char *attstring);
+
+#endif
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <string.h>
+#include <ctype.h>
+
+
+char *
+str_to_lower(char *str)
+{
+  if (str)
+    for (size_t i = 0; str[i]; ++i) str[i] = (char) tolower((int) str[i]);
+
+  return str;
+}
+
+bool
+strStartsWith(const char *vstr, const char *cstr)
+{
+  bool is_equal = false;
+  if (vstr && cstr)
+    {
+      size_t clen = strlen(cstr);
+      size_t vlen = strlen(vstr);
+      if (clen <= vlen) is_equal = (memcmp(vstr, cstr, clen) == 0);
+    }
+  return is_equal;
+}
+
+int
+get_time_units(size_t len, const char *ptu)
+{
+  int timeunit = -1;
+
+  while (isspace(*ptu) && len)
+    {
+      ptu++;
+      len--;
+    }
+
+  // clang-format off
+  if (len > 2)
+    {
+      if      (strStartsWith(ptu, "sec"))            timeunit = TUNIT_SECOND;
+      else if (strStartsWith(ptu, "minute"))         timeunit = TUNIT_MINUTE;
+      else if (strStartsWith(ptu, "hour"))           timeunit = TUNIT_HOUR;
+      else if (strStartsWith(ptu, "day"))            timeunit = TUNIT_DAY;
+      else if (strStartsWith(ptu, "month"))          timeunit = TUNIT_MONTH;
+      else if (strStartsWith(ptu, "calendar_month")) timeunit = TUNIT_MONTH;
+      else if (strStartsWith(ptu, "year"))           timeunit = TUNIT_YEAR;
+    }
+  else if     (len == 1 && ptu[0] == 's')            timeunit = TUNIT_SECOND;
+  // clang-format on
+
+  return timeunit;
+}
+
+bool
+is_time_units(const char *timeunits)
+{
+  while (isspace(*timeunits)) timeunits++;
+
+  // clang-format off
+  return (strStartsWith(timeunits, "sec")
+       || strStartsWith(timeunits, "minute")
+       || strStartsWith(timeunits, "hour")
+       || strStartsWith(timeunits, "day")
+       || strStartsWith(timeunits, "month")
+       || strStartsWith(timeunits, "calendar_month")
+       || strStartsWith(timeunits, "year"));
+  // clang-format on
+}
+
+bool
+is_timeaxis_units(const char *timeunits)
+{
+  bool status = false;
+
+  size_t len = strlen(timeunits);
+  char *tu = (char *) malloc((len + 1) * sizeof(char));
+
+  for (size_t i = 0; i < len; i++) tu[i] = (char) tolower((int) timeunits[i]);
+
+  int timeunit = get_time_units(len, tu);
+  if (timeunit != -1)
+    {
+      size_t pos = 0;
+      while (!isspace(tu[pos]) && tu[pos] != 0) pos++;
+      if (tu[pos])
+        {
+          while (isspace(tu[pos])) pos++;
+
+          status = strStartsWith(tu + pos, "as") || strStartsWith(tu + pos, "since");
+        }
+    }
+
+  free(tu);
+
+  return status;
+}
+
+bool
+is_height_units(const char *units)
+{
+  int u0 = units[0];
+
+  // clang-format off
+  return ((u0=='m' && (!units[1] || strStartsWith(units, "meter")))
+       || (!units[2] && units[1]=='m' && (u0=='c' || u0=='d' || u0=='k'))
+       || (strStartsWith(units, "decimeter"))
+       || (strStartsWith(units, "centimeter"))
+       || (strStartsWith(units, "millimeter"))
+       || (strStartsWith(units, "kilometer")));
+  // clang-format on
+}
+
+bool
+is_pressure_units(const char *units)
+{
+  // clang-format off
+  return (strStartsWith(units, "millibar")
+       || strStartsWith(units, "mb")
+       || strStartsWith(units, "hectopas")
+       || strStartsWith(units, "hPa")
+       || strStartsWith(units, "pa")
+       || strStartsWith(units, "Pa"));
+  // clang-format on
+}
+
+bool
+is_DBL_axis(const char *longname)
+{
+  // clang-format off
+  return (str_is_equal(longname, "depth below land")
+       || str_is_equal(longname, "depth_below_land")
+       || str_is_equal(longname, "levels below the surface"));
+  // clang-format on
+}
+
+bool
+is_depth_axis(const char *stdname, const char *longname)
+{
+  // clang-format off
+  return (str_is_equal(stdname, "depth")
+       || str_is_equal(longname, "depth_below_sea")
+       || str_is_equal(longname, "depth below sea"));
+  // clang-format ofn
+}
+
+
+bool is_height_axis(const char *stdname, const char *longname)
+{
+  // clang-format off
+  return (str_is_equal(stdname, "height")
+       || str_is_equal(longname, "height")
+       || str_is_equal(longname, "height above the surface"));
+  // clang-format on
+}
+
+bool
+is_altitude_axis(const char *stdname, const char *longname)
+{
+  // clang-format off
+  return (str_is_equal(stdname, "altitude")
+       || str_is_equal(longname, "altitude"));
+  // clang-format on
+}
+
+bool
+is_reference_axis(const char *stdname, const char *longname)
+{
+  // clang-format off
+  return ((str_is_equal(longname, "generalized_height") || str_is_equal(longname, "generalized height"))
+        && str_is_equal(stdname, "height"));
+  // clang-format on
+}
+
+bool
+is_lon_axis(const char *units, const char *stdname)
+{
+  bool status = false;
+  char lc_units[16];
+
+  memcpy(lc_units, units, 15);
+  lc_units[15] = 0;
+  str_to_lower(lc_units);
+
+  if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian"))
+      && (strStartsWith(stdname, "grid_longitude") || strStartsWith(stdname, "longitude")))
+    {
+      status = true;
+    }
+  else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_latitude") && !strStartsWith(stdname, "latitude"))
+    {
+      int ioff = 6;
+      if (lc_units[ioff] == 's') ioff++;
+      if (lc_units[ioff] == ' ') ioff++;
+      if (lc_units[ioff] == '_') ioff++;
+      if (lc_units[ioff] == 'e') status = true;
+    }
+
+  return status;
+}
+
+bool
+is_lat_axis(const char *units, const char *stdname)
+{
+  bool status = false;
+  char lc_units[16];
+
+  memcpy(lc_units, units, 15);
+  lc_units[15] = 0;
+  str_to_lower(lc_units);
+
+  if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian"))
+      && (strStartsWith(stdname, "grid_latitude") || strStartsWith(stdname, "latitude")))
+    {
+      status = true;
+    }
+  else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_longitude") && !strStartsWith(stdname, "longitude"))
+    {
+      int ioff = 6;
+      if (lc_units[ioff] == 's') ioff++;
+      if (lc_units[ioff] == ' ') ioff++;
+      if (lc_units[ioff] == '_') ioff++;
+      if (lc_units[ioff] == 'n' || lc_units[ioff] == 's') status = true;
+    }
+
+  return status;
+}
+
+bool
+is_x_axis(const char *units, const char *stdname)
+{
+  (void) units;
+  return (str_is_equal(stdname, "projection_x_coordinate"));
+}
+
+bool
+is_y_axis(const char *units, const char *stdname)
+{
+  (void) units;
+  return (str_is_equal(stdname, "projection_y_coordinate"));
+}
+
+void
+cdf_set_gridtype(const char *attstring, int *gridtype)
+{
+  // clang-format off
+  if      (str_is_equal(attstring, "gaussian_reduced")) *gridtype = GRID_GAUSSIAN_REDUCED;
+  else if (str_is_equal(attstring, "gaussian"))         *gridtype = GRID_GAUSSIAN;
+  else if (strStartsWith(attstring, "spectral"))      *gridtype = GRID_SPECTRAL;
+  else if (strStartsWith(attstring, "fourier"))       *gridtype = GRID_FOURIER;
+  else if (str_is_equal(attstring, "trajectory"))       *gridtype = GRID_TRAJECTORY;
+  else if (str_is_equal(attstring, "generic"))          *gridtype = GRID_GENERIC;
+  else if (str_is_equal(attstring, "cell"))             *gridtype = GRID_UNSTRUCTURED;
+  else if (str_is_equal(attstring, "unstructured"))     *gridtype = GRID_UNSTRUCTURED;
+  else if (str_is_equal(attstring, "curvilinear")) ;
+  else if (str_is_equal(attstring, "characterxy"))      *gridtype = GRID_CHARXY;
+  else if (str_is_equal(attstring, "sinusoidal")) ;
+  else if (str_is_equal(attstring, "laea")) ;
+  else if (str_is_equal(attstring, "lcc2")) ;
+  else if (str_is_equal(attstring, "linear")) ; // ignore grid type linear
+  else
+    {
+      static bool warn = true;
+      if (warn)
+        {
+          warn = false;
+          Warning("NetCDF attribute grid_type='%s' unsupported!", attstring);
+        }
+    }
+  // clang-format on
+}
+
+void
+cdf_set_zaxistype(const char *attstring, int *zaxistype)
+{
+  // clang-format off
+  if      (str_is_equal(attstring, "toa"))              *zaxistype = ZAXIS_TOA;
+  else if (str_is_equal(attstring, "tropopause"))       *zaxistype = ZAXIS_TROPOPAUSE;
+  else if (str_is_equal(attstring, "cloudbase"))        *zaxistype = ZAXIS_CLOUD_BASE;
+  else if (str_is_equal(attstring, "cloudtop"))         *zaxistype = ZAXIS_CLOUD_TOP;
+  else if (str_is_equal(attstring, "isotherm0"))        *zaxistype = ZAXIS_ISOTHERM_ZERO;
+  else if (str_is_equal(attstring, "seabottom"))        *zaxistype = ZAXIS_SEA_BOTTOM;
+  else if (str_is_equal(attstring, "lakebottom"))       *zaxistype = ZAXIS_LAKE_BOTTOM;
+  else if (str_is_equal(attstring, "sedimentbottom"))   *zaxistype = ZAXIS_SEDIMENT_BOTTOM;
+  else if (str_is_equal(attstring, "sedimentbottomta")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TA;
+  else if (str_is_equal(attstring, "sedimentbottomtw")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TW;
+  else if (str_is_equal(attstring, "mixlayer"))         *zaxistype = ZAXIS_MIX_LAYER;
+  else if (str_is_equal(attstring, "atmosphere"))       *zaxistype = ZAXIS_ATMOSPHERE;
+  else
+    {
+      static bool warn = true;
+      if (warn)
+        {
+          warn = false;
+          Warning("NetCDF attribute level_type='%s' unsupported!", attstring);
+        }
+    }
+  // clang-format on
+}
+
+int
+attribute_to_calendar(const char *attstring)
+{
+  int calendar = CALENDAR_STANDARD;
+  // clang-format off
+  if      (strStartsWith(attstring, "standard"))  calendar = CALENDAR_STANDARD;
+  else if (strStartsWith(attstring, "gregorian")) calendar = CALENDAR_GREGORIAN;
+  else if (strStartsWith(attstring, "none"))      calendar = CALENDAR_NONE;
+  else if (strStartsWith(attstring, "proleptic")) calendar = CALENDAR_PROLEPTIC;
+  else if (strStartsWith(attstring, "360"))       calendar = CALENDAR_360DAYS;
+  else if (strStartsWith(attstring, "365") ||
+           strStartsWith(attstring, "noleap"))    calendar = CALENDAR_365DAYS;
+  else if (strStartsWith(attstring, "366") ||
+           strStartsWith(attstring, "all_leap"))  calendar = CALENDAR_366DAYS;
+  else Warning("calendar >%s< unsupported!", attstring);
+  // clang-format on
+  return calendar;
+}
+#ifndef CDI_KEY_H
+#define CDI_KEY_H
+
+#include <stdio.h>
+
+// CDI key
+typedef struct
+{
+  int key;     // CDI key
+  int type;    // KEY_INT, KEY_FLOAT, KEY_BYTES
+  int length;  // number of bytes in v.s
+  union
+  {
+    int i;
+    double d;
+    unsigned char *s;
+  } v;
+} cdi_key_t;
+
+typedef struct
+{
+  size_t nalloc;  // number allocated >= nelems
+  size_t nelems;  // length of the array
+  cdi_key_t value[MAX_KEYS];
+} cdi_keys_t;
+
+enum
+{
+  KEY_INT = 1,
+  KEY_FLOAT,
+  KEY_BYTES
+};
+
+void cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value);
+void cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value);
+void cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length);
+int cdiInqVarKeyInt(const cdi_keys_t *keysp, int key);
+int cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length);
+
+cdi_key_t *find_key(cdi_keys_t *keysp, int key);
+const char *cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key);
+
+static inline const char *
+cdiInqVarKeyString(const cdi_keys_t *keysp, int key)
+{
+  const char *string = cdiInqVarKeyStringPtr(keysp, key);
+  if (string == NULL) string = "";
+  return string;
+}
+
+int cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2);
+void cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2);
+void cdiDeleteVarKeys(cdi_keys_t *keysp);
+void cdiDeleteKeys(int cdiID, int varID);
+void cdiPrintKeys(int cdiID, int varID);
+
+void cdiInitKeys(cdi_keys_t *keysp);
+
+int cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_ATT_H
+#define CDI_ATT_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef CDI_LIMITS_H
+#endif
+
+#include <stdio.h>
+
+// CDI attribute
+// clang-format off
+typedef struct
+{
+  size_t    xsz;	  // amount of space at xvalue
+  size_t    namesz;       // size of name
+  char     *name;         // attribute name
+  int       indtype;	  // internal data type of xvalue (INT, FLT or TXT)
+  int       exdtype;      // external data type
+                          // indtype    exdtype
+                          // TXT        TXT
+                          // INT        INT16, INT32
+                          // FLT        FLT32, FLT64
+  size_t    nelems;    	  // number of elements
+  void     *xvalue;       // the actual data
+} cdi_att_t;
+// clang-format on
+
+// clang-format off
+typedef struct
+{
+  size_t     nalloc;		// number allocated >= nelems
+  size_t     nelems;		// length of the array
+  cdi_att_t  value[MAX_ATTRIBUTES];
+} cdi_atts_t;
+// clang-format on
+
+int cdiDeleteAtts(int vlistID, int varID);
+int cdiAttsGetSize(void *p, int varID, void *context);
+void cdiAttsPack(void *p, int varID, void *buf, int size, int *position, void *context);
+void cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context);
+
+int cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef GRID_H
+#define GRID_H
+
+#include <stdbool.h>
+
+
+typedef unsigned char mask_t;
+
+typedef struct grid_t grid_t;
+
+enum gridPropInq
+{
+  GRID_PROP_MASK,
+  GRID_PROP_MASK_GME,
+  GRID_PROP_XVALS,
+  GRID_PROP_YVALS,
+  GRID_PROP_AREA,
+  GRID_PROP_XBOUNDS,
+  GRID_PROP_YBOUNDS,
+};
+
+struct gridVirtTable
+{
+  void (*destroy)(grid_t *gridptr);
+  grid_t *(*copy)(grid_t *gridptr);
+  void (*copyScalarFields)(grid_t *gridptrOrig, grid_t *gridptrDup);
+  void (*copyArrayFields)(grid_t *gridptrOrig, grid_t *gridptrDup);
+  void (*defXVals)(grid_t *gridptr, const double *xvals);
+  void (*defYVals)(grid_t *gridptr, const double *yvals);
+  void (*defMask)(grid_t *gridptr, const int *mask);
+  void (*defMaskGME)(grid_t *gridptr, const int *mask);
+  void (*defXBounds)(grid_t *gridptr, const double *xbounds);
+  void (*defYBounds)(grid_t *gridptr, const double *ybounds);
+  void (*defArea)(grid_t *gridptr, const double *area);
+  double (*inqXVal)(grid_t *gridptr, SizeType index);
+  double (*inqYVal)(grid_t *gridptr, SizeType index);
+  SizeType (*inqXVals)(grid_t *gridptr, double *xvals);
+  SizeType (*inqXValsPart)(grid_t *gridptr, int start, SizeType length, double *xvals);
+  SizeType (*inqYVals)(grid_t *gridptr, double *yvals);
+  SizeType (*inqYValsPart)(grid_t *gridptr, int start, SizeType length, double *yvals);
+  const double *(*inqXValsPtr)(grid_t *gridptr);
+  const double *(*inqYValsPtr)(grid_t *gridptr);
+#ifndef USE_MPI
+  int (*inqXIsc)(grid_t *gridptr);
+  int (*inqYIsc)(grid_t *gridptr);
+  SizeType (*inqXCvals)(grid_t *gridptr, char **xcvals);
+  SizeType (*inqYCvals)(grid_t *gridptr, char **ycvals);
+  const char **(*inqXCvalsPtr)(grid_t *gridptr);
+  const char **(*inqYCvalsPtr)(grid_t *gridptr);
+#endif
+  double (*inqXInc)(grid_t *gridptr);
+  double (*inqYInc)(grid_t *gridptr);
+  // return true if for both grids, any xval and all yval differ
+  bool (*compareXYFull)(grid_t *gridRef, grid_t *gridTest);
+  // return if for both grids, x[0], y[0], x[size-1] and y[size-1] are respectively equal
+  bool (*compareXYAO)(grid_t *gridRef, grid_t *gridTest);
+  void (*inqArea)(grid_t *gridptr, double *area);
+  const double *(*inqAreaPtr)(grid_t *gridptr);
+  /* return 1 if inq property is set */
+  int (*inqPropPresence)(grid_t *gridptr, enum gridPropInq inq);
+  SizeType (*inqMask)(grid_t *gridptr, int *mask);
+  int (*inqMaskGME)(grid_t *gridptr, int *mask_gme);
+  SizeType (*inqXBounds)(grid_t *gridptr, double *xbounds);
+  SizeType (*inqYBounds)(grid_t *gridptr, double *ybounds);
+  const double *(*inqXBoundsPtr)(grid_t *gridptr);
+  const double *(*inqYBoundsPtr)(grid_t *gridptr);
+  int txCode;
+  int (*getPackSize)(grid_t *gridptr, void *context);
+  int (*getPackSizeScalars)(grid_t *gridptr, void *context);
+  int (*getPackSizeArrays)(grid_t *gridptr, void *context);
+  int (*unpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id);
+  grid_t *(*unpackScalars)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context,
+                           int force_id, int *memberMaskP);
+  void (*unpackArrays)(grid_t *gridptr, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos,
+                       int originNamespace, void *context);
+  void (*pack)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context);
+  /* return member mask */
+  int (*packScalars)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context);
+  void (*packArrays)(grid_t *gridptr, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context);
+};
+
+struct gridaxis_t
+{
+  size_t size;  // number of values
+  short flag;   // 0: undefined 1:vals 2:first+inc
+  double first, last, inc;
+  double *vals;
+  double *bounds;
+  cdi_keys_t keys;
+#ifndef USE_MPI
+  int clength;
+  char **cvals;
+#endif
+};
+
+// GME Grid
+struct grid_gme_t
+{
+  int nd, ni, ni2, ni3;  // parameter for GRID_GME
+};
+
+struct grid_t
+{
+  char *name;
+  int self;
+  size_t size;
+  int type;      // grid type
+  int datatype;  // grid data type (used only internal in gridComplete())
+  int proj;      // grid projection
+  int projtype;  // grid projection type
+  mask_t *mask;
+  mask_t *mask_gme;
+  double *area;
+  struct grid_gme_t gme;
+  int trunc;  // parameter for GRID_SPECTRAL
+  int nvertex;
+  int *reducedPoints;
+  int reducedPointsSize;
+  int np;                // number of parallels between a pole and the equator
+  signed char isCyclic;  // three possible states:
+                         // -1 if unknown,
+                         //  0 if found not cyclic, or
+                         //  1 for global cyclic grids
+  bool lcomplex;
+  bool hasdims;
+  struct gridaxis_t x;
+  struct gridaxis_t y;
+  const struct gridVirtTable *vtable;
+  cdi_keys_t keys;
+  cdi_atts_t atts;
+  void *extraData;
+};
+
+void grid_init(grid_t *gridptr);
+void cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size);
+void grid_free(grid_t *gridptr);
+grid_t *grid_to_pointer(int gridID);
+extern const struct gridVirtTable cdiGridVtable;
+
+unsigned cdiGridCount(void);
+
+void gridVerifyProj(int gridID);
+
+double gridInqXincInMeter(int gridID);
+double gridInqYincInMeter(int gridID);
+
+// const double *gridInqXvalsPtr(int gridID);
+// const double *gridInqYvalsPtr(int gridID);
+
+const char **gridInqXCvalsPtr(int gridID);
+const char **gridInqYCvalsPtr(int gridID);
+
+// const double *gridInqXboundsPtr(int gridID);
+// const double *gridInqYboundsPtr(int gridID);
+const double *gridInqAreaPtr(int gridID);
+
+int gridInqPropPresence(int gridID, enum gridPropInq inq);
+
+int gridGenerate(const grid_t *grid);
+
+// int gridIsEqual(int gridID1, int gridID2);
+
+void cdiGridGetIndexList(unsigned, int *);
+
+int gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id);
+
+/* apply func to each grid */
+enum cdiApplyRet cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data);
+
+struct addIfNewRes
+{
+  int Id;
+  int isNew;
+};
+
+struct addIfNewRes cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode);
+
+int gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp);
+int gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp);
+int gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp);
+
+bool isGaussianLatitudes(size_t nlats, const double *latitudes);
+void gaussianLatitudes(size_t nlats, double *latitudes, double *weights);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _STREAM_CDF_H
+#define _STREAM_CDF_H
+
+
+enum
+{
+  POSITIVE_UP = 1,
+  POSITIVE_DOWN = 2,
+};
+
+enum
+{
+  CDF_MAX_TIME_UNIT_STR     /* maximum length of time unit string */
+  = TAXIS_MAX_UNIT_STR_LEN  /* longest result from tunitNamePtr */
+    + 7                     /* room for " since " */
+    + 7 + 1 + 2 + 1 + 2     /* room for year with 7 digits,
+                             * dashes and 2 digits for month and day */
+    + 1 + 2 + 1 + 2 + 1 + 2 /* room for " " and 2 digit hour, minute,
+                             *                          second */
+    + 1                     /* and terminating '\0' */
+};
+
+int cdfDefVar(stream_t *streamptr, int varID);
+void cdfDefCoordinateVars(stream_t *streamptr);
+void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount);
+int cdfInqTimestep(stream_t *streamptr, int tsID);
+int cdfInqContents(stream_t *streamptr);
+
+void cdfEndDef(stream_t *streamptr);
+void cdfDefRecord(stream_t *streamptr);
+
+void cdfCopyRecord(stream_t *streamptr2, stream_t *streamptr1);
+
+void cdfDefineAttributes(int filetype, int vlistID, int varID, int fileID, int ncvarID);
+
+void cdf_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals);
+void cdf_write_record(stream_t *streamptr, int memtype, const void *data, size_t numMissVals);
+
+void cdf_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals);
+void cdf_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals);
+
+void cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals);
+void cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals);
+
+void cdf_write_var_chunk(stream_t *streamptr, int varID, int memtype, const int rect[][2], const void *data, size_t numMissVals);
+
+void cdfDefVarDeflate(int ncid, int ncvarid, int shuffle, int deflateLevel);
+void cdfDefTime(stream_t *streamptr);
+
+void cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor);
+
+int cdfDefDatatype(int datatype, stream_t *streamptr);
+
+void cdf_create_records(stream_t *streamptr, size_t tsID);
+
+#define ChunkSizeMax 65536
+#define ChunkSizeLim 16777216
+size_t calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool yIsUndefined);
+size_t calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDF_LAZY_GRID_H_
+#define CDF_LAZY_GRID_H_
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_MMAP
+#include <unistd.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+#endif
+
+#include <string.h>
+
+
+struct xyValGet
+{
+  double scalefactor, addoffset;
+  size_t start[3], count[3], size, dimsize;
+  int datasetNCId, varNCId;
+  short ndims;
+};
+
+struct cdfLazyGridIds
+{
+  int datasetNCId, varNCId;
+};
+
+struct cdfLazyGrid
+{
+  grid_t base;
+  const struct gridVirtTable *baseVtable;
+  struct cdfLazyGridIds cellAreaGet, xBoundsGet, yBoundsGet;
+  struct xyValGet xValsGet, yValsGet;
+#ifdef HAVE_LIBPTHREAD
+  pthread_mutex_t loadSerialize;
+#endif
+};
+
+extern double *cdfPendingLoad;
+
+void cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype);
+void cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype);
+
+void cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+static struct gridVirtTable cdfLazyGridVtable;
+double *cdfPendingLoad;
+#ifdef HAVE_LIBPTHREAD
+static pthread_once_t cdfLazyInitialized = PTHREAD_ONCE_INIT;
+#else
+static bool cdfLazyInitialized;
+#endif
+
+#ifdef HAVE_LIBPTHREAD
+#define lock_lazy_load(plGrid) pthread_mutex_lock(&((plGrid)->loadSerialize))
+#define unlock_lazy_load(plGrid) pthread_mutex_unlock(&((plGrid)->loadSerialize))
+#define destroy_lazy_load_lock(plGrid) pthread_mutex_destroy(&((plGrid)->loadSerialize))
+#define init_lazy_load_lock(plGrid) pthread_mutex_init(&((plGrid)->loadSerialize), NULL)
+#else
+#define lock_lazy_load(plGrid)
+#define unlock_lazy_load(plGrid)
+#define destroy_lazy_load_lock(plGrid)
+#define init_lazy_load_lock(plGrid)
+#endif
+
+void
+cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid)
+{
+  lazyGrid->base.extraData = NULL;
+  if (lazyGrid->base.area == cdfPendingLoad) lazyGrid->base.area = NULL;
+  if (lazyGrid->base.x.vals == cdfPendingLoad) lazyGrid->base.x.vals = NULL;
+  if (lazyGrid->base.y.vals == cdfPendingLoad) lazyGrid->base.y.vals = NULL;
+  if (lazyGrid->base.x.bounds == cdfPendingLoad) lazyGrid->base.x.bounds = NULL;
+  if (lazyGrid->base.y.bounds == cdfPendingLoad) lazyGrid->base.y.bounds = NULL;
+  destroy_lazy_load_lock(lazyGrid);
+}
+
+static void
+cdfLazyGridDelete(grid_t *grid)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  void (*baseDestroy)(grid_t * grid) = cdfGrid->baseVtable->destroy;
+  cdfLazyGridDestroy(cdfGrid);
+  baseDestroy(grid);
+}
+
+static void
+cdfLazyGridDestroyOnce(void)
+{
+  /*
+#ifdef HAVE_MMAP
+  size_t pgSize = cdiGetPageSize(false);
+  munmap(cdfPendingLoad, pgSize);
+#endif
+  */
+}
+
+static void
+cdfLazyGridDefArea(grid_t *grid, const double *area)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(cdfGrid);
+  if (grid->area == cdfPendingLoad) grid->area = NULL;
+  cdfGrid->cellAreaGet.datasetNCId = -1;
+  cdfGrid->cellAreaGet.varNCId = -1;
+  cdfGrid->baseVtable->defArea(grid, area);
+  unlock_lazy_load(cdfGrid);
+}
+
+static const double *
+cdfLazyGridInqAreaPtr(grid_t *grid)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  if (grid->area == cdfPendingLoad)
+    {
+      grid->area = (double *) Malloc(grid->size * sizeof(double));
+      cdf_get_var_double(lazyGrid->cellAreaGet.datasetNCId, lazyGrid->cellAreaGet.varNCId, grid->area);
+    }
+  unlock_lazy_load(lazyGrid);
+  return lazyGrid->baseVtable->inqAreaPtr(grid);
+}
+
+static void
+cdfLazyGridInqArea(grid_t *grid, double *area)
+{
+  grid->vtable->inqAreaPtr(grid);
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lazyGrid->baseVtable->inqArea(grid, area);
+}
+
+static void
+cdfLazyLoadXYVals(struct xyValGet *valsGet, double **valsp)
+{
+  double *grid_vals = (double *) Malloc(valsGet->size * sizeof(double));
+  *valsp = grid_vals;
+  if (valsGet->ndims == 3)
+    cdf_get_vara_double(valsGet->datasetNCId, valsGet->varNCId, valsGet->start, valsGet->count, grid_vals);
+  else
+    cdf_get_var_double(valsGet->datasetNCId, valsGet->varNCId, grid_vals);
+  cdf_scale_add(valsGet->size, grid_vals, valsGet->addoffset, valsGet->scalefactor);
+}
+
+static const double *
+cdfLazyGridInqXValsPtr(grid_t *grid)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  if (grid->x.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->xValsGet, &grid->x.vals);
+  unlock_lazy_load(lazyGrid);
+  return lazyGrid->baseVtable->inqXValsPtr(grid);
+}
+
+static const double *
+cdfLazyGridInqYValsPtr(grid_t *grid)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  if (grid->y.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->yValsGet, &grid->y.vals);
+  unlock_lazy_load(lazyGrid);
+  return lazyGrid->baseVtable->inqYValsPtr(grid);
+}
+
+static double
+cdfLazyGridInqXYVal(grid_t *grid, size_t index, const struct xyValGet *valsGet, double *vals,
+                    const double *(*inqValsPtr)(grid_t *gridptr))
+{
+  size_t size = valsGet->size;
+  double v;
+  if (vals == cdfPendingLoad)
+    {
+      // prevent full load if only first/last values get inspected
+      if (index == 0 || index == size - 1)
+        {
+          size_t indexND[3];
+          if (valsGet->ndims == 3)
+            {
+              indexND[0] = 0;
+              indexND[1] = index / valsGet->count[2];
+              indexND[2] = index % valsGet->count[2];
+            }
+          else if (valsGet->ndims == 2)
+            {
+              indexND[0] = index / grid->x.size;
+              indexND[1] = index % grid->x.size;
+            }
+          else
+            indexND[0] = index;
+          cdf_get_var1_double(valsGet->datasetNCId, valsGet->varNCId, indexND, &v);
+        }
+      else
+        {
+          const double *grid_vals = inqValsPtr(grid);
+          v = grid_vals[index];
+        }
+    }
+  else if (vals)
+    v = vals[index];
+  else
+    v = 0.0;
+
+  return v;
+}
+
+static void
+cdfLazyGridDefXVals(grid_t *grid, const double *vals)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(cdfGrid);
+  if (grid->x.vals == cdfPendingLoad) grid->x.vals = NULL;
+  cdfGrid->xValsGet.datasetNCId = -1;
+  cdfGrid->xValsGet.varNCId = -1;
+  cdfGrid->baseVtable->defXVals(grid, vals);
+  unlock_lazy_load(cdfGrid);
+}
+
+static void
+cdfLazyGridDefYVals(grid_t *grid, const double *vals)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(cdfGrid);
+  if (grid->y.vals == cdfPendingLoad) grid->y.vals = NULL;
+  cdfGrid->yValsGet.datasetNCId = -1;
+  cdfGrid->yValsGet.varNCId = -1;
+  cdfGrid->baseVtable->defYVals(grid, vals);
+  unlock_lazy_load(cdfGrid);
+}
+
+static double
+cdfLazyGridInqXVal(grid_t *grid, SizeType index)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  const double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->xValsGet, grid->x.vals, grid->vtable->inqXValsPtr);
+  unlock_lazy_load(lazyGrid);
+  return rv;
+}
+
+static double
+cdfLazyGridInqYVal(grid_t *grid, SizeType index)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  const double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->yValsGet, grid->y.vals, grid->vtable->inqYValsPtr);
+  unlock_lazy_load(lazyGrid);
+  return rv;
+}
+
+static bool
+cdfLazyXYValGetCompare(struct cdfLazyGrid *lazyGridRef, struct cdfLazyGrid *lazyGridTest)
+{
+  struct xyValGet *valsGetXRef = &lazyGridRef->xValsGet, *valsGetYRef = &lazyGridRef->yValsGet,
+                  *valsGetXTest = &lazyGridTest->xValsGet, *valsGetYTest = &lazyGridTest->yValsGet;
+  if (valsGetXRef->datasetNCId == -1 || valsGetXTest->datasetNCId == -1 || valsGetYRef->datasetNCId == -1
+      || valsGetYTest->datasetNCId == -1)
+    return lazyGridRef->baseVtable->compareXYFull(&lazyGridRef->base, &lazyGridTest->base);
+
+  return valsGetXRef->datasetNCId != valsGetXTest->datasetNCId || valsGetXRef->varNCId != valsGetXTest->varNCId
+         || valsGetYRef->datasetNCId != valsGetYTest->datasetNCId || valsGetYRef->varNCId != valsGetYTest->varNCId;
+}
+
+static bool
+cdfLazyCompareXYFull(grid_t *gridRef, grid_t *gridTest)
+{
+  bool diff;
+  struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef;
+  if (gridTest->vtable == &cdfLazyGridVtable)
+    diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest);
+  else
+    diff = lazyGridRef->baseVtable->compareXYFull(gridRef, gridTest);
+  return diff;
+}
+
+static bool
+cdfLazyCompareXYAO(grid_t *gridRef, grid_t *gridTest)
+{
+  bool diff;
+  struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef;
+  if (gridTest->vtable == &cdfLazyGridVtable)
+    diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest);
+  else
+    diff = lazyGridRef->baseVtable->compareXYAO(gridRef, gridTest);
+  return diff;
+}
+
+static const double *
+cdfLazyGridInqXBoundsPtr(grid_t *grid)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  if (grid->x.bounds == cdfPendingLoad)
+    {
+      grid->x.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double));
+      cdf_get_var_double(lazyGrid->xBoundsGet.datasetNCId, lazyGrid->xBoundsGet.varNCId, grid->x.bounds);
+    }
+  unlock_lazy_load(lazyGrid);
+  return lazyGrid->baseVtable->inqXBoundsPtr(grid);
+}
+
+static void
+cdfLazyGridDefXBounds(grid_t *grid, const double *xbounds)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(cdfGrid);
+  if (grid->x.bounds == cdfPendingLoad) grid->x.bounds = NULL;
+  cdfGrid->xBoundsGet.datasetNCId = -1;
+  cdfGrid->xBoundsGet.varNCId = -1;
+  cdfGrid->baseVtable->defXBounds(grid, xbounds);
+  unlock_lazy_load(cdfGrid);
+}
+
+static void
+cdfLazyGridDefYBounds(grid_t *grid, const double *ybounds)
+{
+  struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(cdfGrid);
+  if (grid->y.bounds == cdfPendingLoad) grid->y.bounds = NULL;
+  cdfGrid->yBoundsGet.datasetNCId = -1;
+  cdfGrid->yBoundsGet.varNCId = -1;
+  cdfGrid->baseVtable->defYBounds(grid, ybounds);
+  unlock_lazy_load(cdfGrid);
+}
+
+static const double *
+cdfLazyGridInqYBoundsPtr(grid_t *grid)
+{
+  struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid;
+  lock_lazy_load(lazyGrid);
+  if (grid->y.bounds == cdfPendingLoad)
+    {
+      grid->y.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double));
+      cdf_get_var_double(lazyGrid->yBoundsGet.datasetNCId, lazyGrid->yBoundsGet.varNCId, grid->y.bounds);
+    }
+  unlock_lazy_load(lazyGrid);
+  return lazyGrid->baseVtable->inqYBoundsPtr(grid);
+}
+
+static void
+cdfLazyGridCopyScalarFields(grid_t *gridptrOrig, grid_t *gridptrDup)
+{
+  struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) gridptrDup, *lazyGridOrig = (struct cdfLazyGrid *) gridptrOrig;
+  lazyGridOrig->baseVtable->copyScalarFields(gridptrOrig, &lazyGridDup->base);
+  lazyGridDup->baseVtable = lazyGridOrig->baseVtable;
+  lazyGridDup->cellAreaGet = lazyGridOrig->cellAreaGet;
+  lazyGridDup->xBoundsGet = lazyGridOrig->xBoundsGet;
+  lazyGridDup->yBoundsGet = lazyGridOrig->yBoundsGet;
+  lazyGridDup->xValsGet = lazyGridOrig->xValsGet;
+  lazyGridDup->yValsGet = lazyGridOrig->yValsGet;
+  init_lazy_load_lock(lazyGridDup);
+}
+
+static void
+cdfLazyGridCopyArrayFields(grid_t *gridptrOrig, grid_t *gridptrDup)
+{
+  const size_t reducedPointsSize = (size_t) gridptrOrig->reducedPointsSize;
+  const size_t gridsize = gridptrOrig->size;
+  const int gridtype = gridptrOrig->type;
+  const int irregular = (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED);
+
+  if (reducedPointsSize)
+    {
+      gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int));
+      memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int));
+    }
+
+  if (gridptrOrig->x.vals != NULL && gridptrOrig->x.vals != cdfPendingLoad)
+    {
+      const size_t size = irregular ? gridsize : gridptrOrig->x.size;
+      gridptrDup->x.vals = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double));
+    }
+
+  if (gridptrOrig->y.vals != NULL && gridptrOrig->y.vals != cdfPendingLoad)
+    {
+      const size_t size = irregular ? gridsize : gridptrOrig->y.size;
+      gridptrDup->y.vals = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double));
+    }
+
+  if (gridptrOrig->x.bounds != NULL && gridptrOrig->x.bounds != cdfPendingLoad)
+    {
+      const size_t size = (irregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex;
+      gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double));
+    }
+
+  if (gridptrOrig->y.bounds != NULL && gridptrOrig->y.bounds != cdfPendingLoad)
+    {
+      const size_t size = (irregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex;
+      gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double));
+    }
+
+  {
+    if (gridptrOrig->area != NULL && gridptrOrig->area != cdfPendingLoad)
+      {
+        const size_t size = gridsize;
+        gridptrDup->area = (double *) Malloc(size * sizeof(double));
+        memcpy(gridptrDup->area, gridptrOrig->area, size * sizeof(double));
+      }
+  }
+
+  if (gridptrOrig->mask != NULL)
+    {
+      const size_t size = gridsize;
+      gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t));
+      memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t));
+    }
+
+  if (gridptrOrig->mask_gme != NULL)
+    {
+      const size_t size = gridsize;
+      gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t));
+      memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t));
+    }
+}
+
+static grid_t *
+cdfLazyGridCopy(grid_t *gridptrOrig)
+{
+  struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) Malloc(sizeof(*lazyGridDup));
+  gridptrOrig->vtable->copyScalarFields(gridptrOrig, &lazyGridDup->base);
+  gridptrOrig->vtable->copyArrayFields(gridptrOrig, &lazyGridDup->base);
+  return &lazyGridDup->base;
+}
+
+static void
+cdfLazyGridInitOnce(void)
+{
+  cdfLazyGridVtable = cdiGridVtable;
+  cdfLazyGridVtable.destroy = cdfLazyGridDelete;
+  cdfLazyGridVtable.copy = cdfLazyGridCopy;
+  cdfLazyGridVtable.copyScalarFields = cdfLazyGridCopyScalarFields;
+  cdfLazyGridVtable.copyArrayFields = cdfLazyGridCopyArrayFields;
+  cdfLazyGridVtable.defArea = cdfLazyGridDefArea;
+  cdfLazyGridVtable.inqAreaPtr = cdfLazyGridInqAreaPtr;
+  cdfLazyGridVtable.inqArea = cdfLazyGridInqArea;
+  cdfLazyGridVtable.inqXValsPtr = cdfLazyGridInqXValsPtr;
+  cdfLazyGridVtable.inqYValsPtr = cdfLazyGridInqYValsPtr;
+  cdfLazyGridVtable.inqXVal = cdfLazyGridInqXVal;
+  cdfLazyGridVtable.inqYVal = cdfLazyGridInqYVal;
+  cdfLazyGridVtable.defXVals = cdfLazyGridDefXVals;
+  cdfLazyGridVtable.defYVals = cdfLazyGridDefYVals;
+  cdfLazyGridVtable.compareXYFull = cdfLazyCompareXYFull;
+  cdfLazyGridVtable.compareXYAO = cdfLazyCompareXYAO;
+  cdfLazyGridVtable.defXBounds = cdfLazyGridDefXBounds;
+  cdfLazyGridVtable.defYBounds = cdfLazyGridDefYBounds;
+  cdfLazyGridVtable.inqXBoundsPtr = cdfLazyGridInqXBoundsPtr;
+  cdfLazyGridVtable.inqYBoundsPtr = cdfLazyGridInqYBoundsPtr;
+  /* create inaccessible memory area, if possible, this serves as
+   * dummy value for pointers to data not yet loaded */
+  /*
+#ifdef HAVE_MMAP
+  {
+    size_t pgSize = cdiGetPageSize(false);
+    static const char devZero[] = "/dev/zero";
+    int fd = open(devZero, O_RDWR);
+    if (fd == -1)
+      SysError("Could not open %s to map anonymous memory", devZero);
+    void *cdfInvalid = mmap(NULL, pgSize, PROT_NONE, MAP_PRIVATE, fd, 0);
+    if (cdfInvalid == MAP_FAILED)
+      SysError("Could not mmap anonymous memory");
+    cdfPendingLoad = cdfInvalid;
+    int rc = close(fd);
+    if (rc == -1)
+      SysError("Could not close %s file handle %d after mapping anonymous"
+               " memory", devZero, fd);
+  }
+#else
+  */
+  cdfPendingLoad = (double *) &cdfPendingLoad;
+  // #endif
+  atexit(cdfLazyGridDestroyOnce);
+#ifndef HAVE_LIBPTHREAD
+  cdfLazyInitialized = true;
+#endif
+}
+
+static void
+cdfBaseGridInit(grid_t *grid, int gridtype)
+{
+  grid_init(grid);
+  cdiGridTypeInit(grid, gridtype, 0);
+}
+
+static void
+cdfLazyGridInit(struct cdfLazyGrid *grid, int gridtype)
+{
+#ifdef HAVE_LIBPTHREAD
+  pthread_once(&cdfLazyInitialized, cdfLazyGridInitOnce);
+#else
+  if (!cdfLazyInitialized) cdfLazyGridInitOnce();
+#endif
+  cdfBaseGridInit(&grid->base, gridtype);
+  grid->baseVtable = grid->base.vtable;
+  grid->cellAreaGet.datasetNCId = -1;
+  grid->cellAreaGet.varNCId = -1;
+  grid->xValsGet.datasetNCId = -1;
+  grid->xValsGet.varNCId = -1;
+  grid->yValsGet.datasetNCId = -1;
+  grid->yValsGet.varNCId = -1;
+  grid->xBoundsGet.datasetNCId = -1;
+  grid->xBoundsGet.varNCId = -1;
+  grid->yBoundsGet.datasetNCId = -1;
+  grid->yBoundsGet.varNCId = -1;
+  grid->base.vtable = &cdfLazyGridVtable;
+  init_lazy_load_lock(grid);
+}
+
+void
+cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype)
+{
+  struct cdfLazyGrid *restrict grid = *gridpptr;
+  if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(*grid));
+  cdfLazyGridInit(grid, gridtype);
+}
+
+void
+cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype)
+{
+  struct cdfLazyGrid *restrict grid = *gridpptr;
+  if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(grid_t));
+  cdfBaseGridInit((grid_t *) grid, gridtype);
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_CKSUM_H_
+#define CDI_CKSUM_H_
+
+#include <inttypes.h>
+
+/* single checksum computation over one array */
+uint32_t cdiCheckSum(int type, int count, const void *data);
+
+/* composable check-sum computation,
+ * 0. datatype,
+ * 1. init,
+ * 2. partial, appendable computation, and
+ * 3. final checksum-computation
+ */
+struct cdiCheckSumState
+{
+  uint32_t sum;
+  off_t len;
+};
+
+void cdiCheckSumRStart(struct cdiCheckSumState *state);
+void cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *data);
+uint32_t cdiCheckSumRValue(struct cdiCheckSumState state);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <inttypes.h>
+#include <sys/types.h>
+
+void memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len);
+
+void memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size);
+
+uint32_t memcrc_finish(uint32_t *state, off_t total_size);
+
+uint32_t memcrc(const unsigned char *b, size_t n);
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef SERIALIZE_H
+#define SERIALIZE_H
+
+#include <string.h>
+
+#ifndef CDI_CKSUM_H_
+#endif
+#ifndef CDI_KEY_H_
+#endif
+#ifndef ERROR_H
+#endif
+
+/*
+ * Generic interfaces for (de-)marshalling
+ */
+int serializeGetSize(int count, int datatype, void *context);
+void serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context);
+void serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context);
+
+/*
+ * (de-)marshalling function for key/value structures
+ */
+static inline int
+serializeKeysGetPackSize(const cdi_keys_t *keysp, void *context)
+{
+  int packBuffSize = 0;
+
+  int nelems = (int) keysp->nelems;
+  packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context);
+  for (int keyid = 0; keyid < nelems; keyid++)
+    {
+      const cdi_key_t *keyp = &(keysp->value[keyid]);
+      int type = keyp->type;
+      packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context);  // key
+      packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context);  // type
+      if (type == KEY_BYTES)
+        {
+          int length = keyp->length;
+          packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize(length, CDI_DATATYPE_TXT, context);
+        }
+      else if (type == KEY_INT)
+        {
+          packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context);
+        }
+      else if (type == KEY_FLOAT)
+        {
+          packBuffSize += serializeGetSize(1, CDI_DATATYPE_FLT64, context);
+        }
+    }
+  packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+  return packBuffSize;
+}
+
+static inline void
+serializeKeysPack(const cdi_keys_t *keysp, void *buf, int buf_size, int *position, void *context)
+{
+  uint32_t d = 0;
+
+  int nelems = (int) keysp->nelems;
+  serializePack(&nelems, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+  for (int keyid = 0; keyid < nelems; keyid++)
+    {
+      const cdi_key_t *keyp = &(keysp->value[keyid]);
+      int key = keyp->key;
+      int type = keyp->type;
+      serializePack(&key, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+      serializePack(&type, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+      if (type == KEY_BYTES)
+        {
+          int length = keyp->length;
+          serializePack(&length, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+          serializePack(keyp->v.s, length, CDI_DATATYPE_TXT, buf, buf_size, position, context);
+          d ^= cdiCheckSum(CDI_DATATYPE_TXT, length, keyp->v.s);
+        }
+      else if (type == KEY_INT)
+        {
+          serializePack(&keyp->v.i, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+        }
+      else if (type == KEY_FLOAT)
+        {
+          serializePack(&keyp->v.d, 1, CDI_DATATYPE_FLT64, buf, buf_size, position, context);
+        }
+    }
+
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context);
+}
+
+static inline void
+serializeKeysUnpack(const void *buf, int buf_size, int *position, cdi_keys_t *keysp, void *context)
+{
+  uint32_t d, d2 = 0;
+  void *buffer = NULL;
+  int buffersize = 0;
+
+  int nelems;
+  serializeUnpack(buf, buf_size, position, &nelems, 1, CDI_DATATYPE_INT, context);
+  for (int i = 0; i < nelems; ++i)
+    {
+      int key, type;
+      serializeUnpack(buf, buf_size, position, &key, 1, CDI_DATATYPE_INT, context);
+      serializeUnpack(buf, buf_size, position, &type, 1, CDI_DATATYPE_INT, context);
+      if (type == KEY_BYTES)
+        {
+          int length;
+          serializeUnpack(buf, buf_size, position, &length, 1, CDI_DATATYPE_INT, context);
+          if (length > buffersize)
+            {
+              buffersize = length;
+              buffer = Realloc(buffer, (size_t) buffersize);
+            }
+          serializeUnpack(buf, buf_size, position, buffer, length, CDI_DATATYPE_TXT, context);
+          cdiDefVarKeyBytes(keysp, key, (unsigned char *) buffer, length);
+          d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, length, buffer);
+        }
+      else if (type == KEY_INT)
+        {
+          int ival;
+          serializeUnpack(buf, buf_size, position, &ival, 1, CDI_DATATYPE_INT, context);
+          cdiDefVarKeyInt(keysp, key, ival);
+        }
+      else if (type == KEY_FLOAT)
+        {
+          double dval;
+          serializeUnpack(buf, buf_size, position, &dval, 1, CDI_DATATYPE_FLT64, context);
+          cdiDefVarKeyFloat(keysp, key, dval);
+        }
+    }
+  serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context);
+  xassert(d == d2);
+  if (buffer) Free(buffer);
+}
+
+/*
+ * (de-)marshalling function for common data structures
+ */
+static inline int
+serializeStrTabGetPackSize(const char **strTab, int numStr, void *context)
+{
+  xassert(numStr >= 0);
+  int packBuffSize = 0;
+  for (size_t i = 0; i < (size_t) numStr; ++i)
+    {
+      size_t len = strlen(strTab[i]);
+      packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize((int) len, CDI_DATATYPE_TXT, context);
+    }
+  packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+  return packBuffSize;
+}
+
+static inline void
+serializeStrTabPack(const char **strTab, int numStr, void *buf, int buf_size, int *position, void *context)
+{
+  uint32_t d = 0;
+  xassert(numStr >= 0);
+  for (size_t i = 0; i < (size_t) numStr; ++i)
+    {
+      int len = (int) strlen(strTab[i]);
+      serializePack(&len, 1, CDI_DATATYPE_INT, buf, buf_size, position, context);
+      serializePack(strTab[i], len, CDI_DATATYPE_TXT, buf, buf_size, position, context);
+      d ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]);
+    }
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context);
+}
+
+static inline void
+serializeStrTabUnpack(const void *buf, int buf_size, int *position, char **strTab, int numStr, void *context)
+{
+  uint32_t d, d2 = 0;
+  xassert(numStr >= 0);
+  for (size_t i = 0; i < (size_t) numStr; ++i)
+    {
+      int len;
+      serializeUnpack(buf, buf_size, position, &len, 1, CDI_DATATYPE_INT, context);
+      serializeUnpack(buf, buf_size, position, strTab[i], len, CDI_DATATYPE_TXT, context);
+      strTab[i][len] = '\0';
+      d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]);
+    }
+  serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context);
+  xassert(d == d2);
+}
+
+/*
+ * Interfaces for marshalling within a single memory domain
+ */
+int serializeGetSizeInCore(int count, int datatype, void *context);
+void serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context);
+void serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <inttypes.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+
+uint32_t
+cdiCheckSum(int type, int count, const void *buffer)
+{
+  uint32_t s = 0U;
+  xassert(count >= 0);
+  size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL);
+  memcrc_r_eswap(&s, (const unsigned char *) buffer, (size_t) count, elemSize);
+  s = memcrc_finish(&s, (off_t) (elemSize * (size_t) count));
+  return s;
+}
+
+void
+cdiCheckSumRStart(struct cdiCheckSumState *state)
+{
+  state->sum = 0U;
+  state->len = 0;
+}
+
+void
+cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *buffer)
+{
+  size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL);
+  memcrc_r_eswap(&state->sum, (const unsigned char *) buffer, (size_t) count, elemSize);
+  state->len += (off_t) (elemSize * (size_t) count);
+}
+
+uint32_t
+cdiCheckSumRValue(struct cdiCheckSumState state)
+{
+  return memcrc_finish(&state.sum, state.len);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+const char *
+cdiStringError(int cdiErrno)
+{
+  // clang-format off
+  static const char UnknownError[] = "Unknown Error";
+  static const char _ETMOF[]       = "Too many open files";
+  static const char _EINVAL[]      = "Invalid argument";
+  static const char _EISDIR[]      = "Is a directory";
+  static const char _EISEMPTY[]    = "File is empty";
+  static const char _EUFTYPE[]     = "Unsupported file type";
+  static const char _ELIBNAVAIL[]  = "Unsupported file type (library support not compiled in)";
+  static const char _EUFSTRUCT[]   = "Unsupported file structure";
+  static const char _EUNC4[]       = "Unsupported NetCDF4 structure";
+  static const char _EDIMSIZE[]    = "Invalid dimension size";
+  static const char _EQENF[]       = "Query entries not found";
+  static const char _EQNAVAIL[]    = "Query not available for file type";
+  static const char _ELIMIT[]      = "Internal limits exceeded";
+
+  switch (cdiErrno) {
+  case CDI_ESYSTEM:
+    {
+      const char *cp = strerror(errno);
+      if (cp == NULL) break;
+      return cp;
+    }
+  case CDI_ETMOF:      return _ETMOF;
+  case CDI_EINVAL:     return _EINVAL;
+  case CDI_EISDIR:     return _EISDIR;
+  case CDI_EISEMPTY:   return _EISEMPTY;
+  case CDI_EUFTYPE:    return _EUFTYPE;
+  case CDI_ELIBNAVAIL: return _ELIBNAVAIL;
+  case CDI_EUFSTRUCT:  return _EUFSTRUCT;
+  case CDI_EUNC4:      return _EUNC4;
+  case CDI_EDIMSIZE:   return _EDIMSIZE;
+  case CDI_EQENF:      return _EQENF;
+  case CDI_EQNAVAIL:   return _EQNAVAIL;
+  case CDI_ELIMIT:     return _ELIMIT;
+  }
+  // clang-format on
+  return UnknownError;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+// ==================================================================
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  // clang-format off
+void
+cdiDecodeDate(int date, int *year, int *month, int *day)
+{
+  int iyear = date / 10000;
+  *year = iyear;
+  int idate = date - iyear * 10000;
+  if (idate < 0) idate = -idate;
+  int imonth = idate / 100;
+  *month = imonth;
+  *day = idate - imonth * 100;
+}
+
+int
+cdiEncodeDate(int year, int month, int day)
+{
+  int iyear = abs(year);
+  int date = iyear * 10000 + month * 100 + day;
+  if (year < 0) date = -date;
+
+  return date;
+}
+
+void
+cdiDecodeTime(int time, int *hour, int *minute, int *second)
+{
+  int ihour = time / 10000, itime = time - ihour * 10000, iminute = itime / 100;
+  *hour = ihour;
+  *minute = iminute;
+  *second = itime - iminute * 100;
+}
+
+int
+cdiEncodeTime(int hour, int minute, int second)
+{
+  return hour * 10000 + minute * 100 + second;
+}
+  // clang-format on
+
+#ifdef __cplusplus
+}
+#endif
+// ==================================================================
+
+CdiDate
+cdiDate_set(int64_t date)
+{
+  int64_t iyear = date / 10000;
+  int year = (int) iyear;
+  int64_t idate = date - iyear * 10000;
+  if (idate < 0) idate = -idate;
+  int64_t imonth = idate / 100;
+  int month = (int) imonth;
+  int day = (int) (idate - imonth * 100);
+
+  CdiDate cdiDate;
+  cdiDate.year = year;
+  cdiDate.month = (short) month;
+  cdiDate.day = (short) day;
+
+  return cdiDate;
+}
+
+CdiTime
+cdiTime_set(int time)
+{
+  int hour, minute, second, ms = 0;
+  cdiDecodeTime(time, &hour, &minute, &second);
+
+  CdiTime cdiTime;
+  cdiTime.hour = (short) hour;
+  cdiTime.minute = (short) minute;
+  cdiTime.second = (short) second;
+  cdiTime.ms = (short) ms;
+
+  return cdiTime;
+}
+
+CdiDateTime
+cdiDateTime_set(int64_t date, int time)
+{
+  CdiDateTime cdiDateTime;
+  cdiDateTime.date = cdiDate_set(date);
+  cdiDateTime.time = cdiTime_set(time);
+
+  return cdiDateTime;
+}
+
+int64_t
+cdiDate_get(CdiDate cdiDate)
+{
+  int64_t iyear = abs(cdiDate.year);
+  int64_t date = iyear * 10000 + cdiDate.month * 100 + cdiDate.day;
+  if (cdiDate.year < 0) date = -date;
+
+  return date;
+}
+
+int
+cdiTime_get(CdiTime cdiTime)
+{
+  return cdiEncodeTime(cdiTime.hour, cdiTime.minute, cdiTime.second);
+}
+
+CdiDate
+cdiDate_encode(int year, int month, int day)
+{
+  CdiDate cdiDate;
+  cdiDate.year = year;
+  cdiDate.month = (short) month;
+  cdiDate.day = (short) day;
+
+  return cdiDate;
+}
+
+void
+cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day)
+{
+  *year = cdiDate.year;
+  *month = cdiDate.month;
+  *day = cdiDate.day;
+}
+
+CdiTime
+cdiTime_encode(int hour, int minute, int second, int ms)
+{
+  CdiTime cdiTime;
+  cdiTime.hour = (short) hour;
+  cdiTime.minute = (short) minute;
+  cdiTime.second = (short) second;
+  cdiTime.ms = (short) ms;
+
+  return cdiTime;
+}
+
+void
+cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms)
+{
+  *hour = cdiTime.hour;
+  *minute = cdiTime.minute;
+  *second = cdiTime.second;
+  *ms = cdiTime.ms;
+}
+
+void
+cdiDate_init(CdiDate *cdiDate)
+{
+  cdiDate->year = 0;
+  cdiDate->month = 0;
+  cdiDate->day = 0;
+}
+
+void
+cdiTime_init(CdiTime *cdiTime)
+{
+  cdiTime->hour = 0;
+  cdiTime->minute = 0;
+  cdiTime->second = 0;
+  cdiTime->ms = 0;
+}
+
+void
+cdiDateTime_init(CdiDateTime *cdiDateTime)
+{
+  cdiDate_init(&cdiDateTime->date);
+  cdiTime_init(&cdiDateTime->time);
+}
+
+bool
+cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2)
+{
+  // clang-format off
+  return (cdiDate1.year  == cdiDate2.year
+       && cdiDate1.month == cdiDate2.month
+       && cdiDate1.day   == cdiDate2.day);
+  // clang-format on
+}
+
+bool
+cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2)
+{
+  // clang-format off
+  return (cdiTime1.hour   == cdiTime2.hour
+       && cdiTime1.minute == cdiTime2.minute
+       && cdiTime1.second == cdiTime2.second
+       && cdiTime1.ms     == cdiTime2.ms);
+  // clang-format on
+}
+
+bool
+cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2)
+{
+  // clang-format off
+  return (cdiDateTime1.date.year   == cdiDateTime2.date.year
+       && cdiDateTime1.date.month  == cdiDateTime2.date.month
+       && cdiDateTime1.date.day    == cdiDateTime2.date.day
+       && cdiDateTime1.time.hour   == cdiDateTime2.time.hour
+       && cdiDateTime1.time.minute == cdiDateTime2.time.minute
+       && cdiDateTime1.time.second == cdiDateTime2.time.second
+       && cdiDateTime1.time.ms     == cdiDateTime2.time.ms);
+  // clang-format on
+}
+
+bool
+cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2)
+{
+  return !cdiDateTime_isEQ(cdiDateTime1, cdiDateTime2);
+}
+
+bool
+cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2)
+{
+  int64_t date1 = cdiDate_get(cdiDateTime1.date);
+  int64_t date2 = cdiDate_get(cdiDateTime2.date);
+  int time1 = cdiTime_get(cdiDateTime1.time);
+  int time2 = cdiTime_get(cdiDateTime2.time);
+  return (date1 < date2 || (date1 == date2 && time1 < time2));
+}
+
+bool
+cdiDateTime_isNull(CdiDateTime cdiDateTime)
+{
+  // clang-format off
+  return (cdiDateTime.date.year == 0
+       && cdiDateTime.date.month == 0
+       && cdiDateTime.date.day == 0
+       && cdiDateTime.time.hour == 0
+       && cdiDateTime.time.minute == 0
+       && cdiDateTime.time.second == 0
+       && cdiDateTime.time.ms == 0);
+  // clang-format on
+}
+
+#define DATE_FORMAT "%5.4d-%2.2d-%2.2d"
+#define TIME_FORMAT "%2.2d:%2.2d:%2.2d"
+
+const char *
+CdiDateTime_string(CdiDateTime cdiDateTime)
+{
+  int year, month, day;
+  cdiDate_decode(cdiDateTime.date, &year, &month, &day);
+  int hour, minute, second, ms;
+  cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms);
+
+  static char datetimeString[64];
+  snprintf(datetimeString, sizeof(datetimeString), DATE_FORMAT "T" TIME_FORMAT, year, month, day, hour, minute, second);
+
+  return datetimeString;
+}
+#ifndef GRIBAPI_H
+#define GRIBAPI_H
+
+#ifdef HAVE_LIBGRIB_API
+#include <grib_api.h>
+#ifndef ERROR_H
+#endif
+#endif
+
+#ifndef CDI_INT_H
+#endif
+
+// clang-format off
+
+#define  GRIBAPI_MISSVAL  -9.E33
+
+// GRIB2 Level Types
+#define  GRIB2_LTYPE_SURFACE               1
+#define  GRIB2_LTYPE_CLOUD_BASE            2
+#define  GRIB2_LTYPE_CLOUD_TOP             3
+#define  GRIB2_LTYPE_ISOTHERM0             4
+#define  GRIB2_LTYPE_TROPOPAUSE            7
+#define  GRIB2_LTYPE_TOA                   8
+#define  GRIB2_LTYPE_SEA_BOTTOM            9
+#define  GRIB2_LTYPE_ATMOSPHERE           10
+#define  GRIB2_LTYPE_ISOBARIC            100
+#define  GRIB2_LTYPE_MEANSEA             101
+#define  GRIB2_LTYPE_ALTITUDE            102
+#define  GRIB2_LTYPE_HEIGHT              103
+#define  GRIB2_LTYPE_SIGMA               104
+#define  GRIB2_LTYPE_HYBRID              105
+#define  GRIB2_LTYPE_LANDDEPTH           106
+#define  GRIB2_LTYPE_ISENTROPIC          107
+#define  GRIB2_LTYPE_SNOW                114
+#define  GRIB2_LTYPE_REFERENCE           150
+#define  GRIB2_LTYPE_SEADEPTH            160  // Depth Below Sea Level
+#define  GRIB2_LTYPE_LAKE_BOTTOM         162  // Lake or River Bottom
+#define  GRIB2_LTYPE_SEDIMENT_BOTTOM     163  // Bottom Of Sediment Layer
+#define  GRIB2_LTYPE_SEDIMENT_BOTTOM_TA  164  // Bottom Of Thermally Active Sediment Layer
+#define  GRIB2_LTYPE_SEDIMENT_BOTTOM_TW  165  // Bottom Of Sediment Layer Penetrated By Thermal Wave
+#define  GRIB2_LTYPE_MIX_LAYER           166  // Mixing Layer
+
+// GRIB2 Data representation type (Grid Type)
+#define  GRIB2_GTYPE_LATLON                0  // Latitude/longitude (or equidistant cylindrical, or Plate Carree)
+#define  GRIB2_GTYPE_LATLON_ROT            1  // Rotated Latitude/longitude
+#define  GRIB2_GTYPE_LATLON_STR            2  // Stretched Latitude/longitude
+#define  GRIB2_GTYPE_LATLON_ROTSTR         3  // Stretched and Rotated Latitude/longitude
+#define  GRIB2_GTYPE_STERE                20  // Polar stereographic projection
+#define  GRIB2_GTYPE_LCC                  30  // Lambert conformal
+#define  GRIB2_GTYPE_GAUSSIAN             40  // Gaussian latitude/longitude
+#define  GRIB2_GTYPE_GAUSSIAN_ROT         41  // Rotated Gaussian latitude/longitude
+#define  GRIB2_GTYPE_GAUSSIAN_STR         42  // Stretched Gaussian latitude/longitude
+#define  GRIB2_GTYPE_GAUSSIAN_ROTSTR      43  // Stretched and rotated Gaussian latitude/longitude
+#define  GRIB2_GTYPE_SPECTRAL             50  // Spherical harmonic coefficients
+#define  GRIB2_GTYPE_GME                 100  // Triangular grid based on an icosahedron (GME)
+#define  GRIB2_GTYPE_UNSTRUCTURED        101  // General Unstructured Grid
+#define  GRIB2_GTYPE_HEALPIX             150  // HEALPix Grid
+
+const char *gribapiLibraryVersionString(void);
+void gribContainersNew(stream_t *streamptr);
+void gribContainersDelete(stream_t *streamptr);
+
+#ifdef HAVE_LIBGRIB_API
+
+#ifdef ECCODES_VERSION
+#if ECCODES_VERSION >= 23000
+#define HAVE_GRIBAPI_FLOAT_INTERFACE 1
+#endif
+#endif
+
+static inline int have_gribapi_float_interface(void)
+{
+#ifdef HAVE_GRIBAPI_FLOAT_INTERFACE
+  return 1;
+#else
+  return 0;
+#endif
+}
+
+static inline int my_grib_set_double(grib_handle* h, const char* key, double val)
+{
+  if (CDI_gribapi_debug)
+    fprintf(stderr, "grib_set_double(\tgrib_handle* h, \"%s\", %f)\n", key, val);
+
+  int retVal = grib_set_double(h, key, val);
+  if (retVal != 0)
+    fprintf(stderr, "!!! failed call to grib_set_double(\tgrib_handle* h, \"%s\", %f) !!!\n", key, val);
+  return retVal;
+}
+
+static inline int my_grib_set_long(grib_handle* h, const char* key, long val)
+{
+  if (CDI_gribapi_debug)
+    fprintf(stderr, "grib_set_long(  \tgrib_handle* h, \"%s\", %ld)\n", key, val);
+
+  int retVal = grib_set_long(h, key, val);
+  if (retVal != 0)
+    fprintf(stderr, "!!! failed call to grib_set_long(  \tgrib_handle* h, \"%s\", %ld) !!!\n", key, val);
+  return retVal;
+}
+
+static inline int my_grib_set_string(grib_handle* h, const char* key, const char* val, size_t* length)
+{
+  if (CDI_gribapi_debug)
+    fprintf(stderr, "grib_set_string(\tgrib_handle* h, \"%s\", \"%s\")\n", key, val);
+
+  int ret_val = grib_set_string(h, key, val, length);
+  if (ret_val != 0)
+    fprintf(stderr, "!!! grib_set_string(\tgrib_handle* h, \"%s\", \"%s\") !!!\n", key, val);
+  return ret_val;
+}
+#endif
+
+typedef struct {
+  bool init;
+  void *gribHandle;
+}
+gribContainer_t;
+
+// clang-format on
+
+#endif /* GRIBAPI_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CGRIBEX_H
+#define CGRIBEX_H
+
+// clang-format off
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <sys/types.h>
+
+#define  GRIB_MISSVAL  -9.E33
+
+// GRIB1 Level Types
+#define  GRIB1_LTYPE_SURFACE               1
+#define  GRIB1_LTYPE_CLOUD_BASE            2
+#define  GRIB1_LTYPE_CLOUD_TOP             3
+#define  GRIB1_LTYPE_ISOTHERM0             4
+#define  GRIB1_LTYPE_TROPOPAUSE            7
+#define  GRIB1_LTYPE_TOA                   8
+#define  GRIB1_LTYPE_SEA_BOTTOM            9
+#define  GRIB1_LTYPE_ATMOSPHERE           10
+#define  GRIB1_LTYPE_99                   99
+#define  GRIB1_LTYPE_ISOBARIC            100
+#define  GRIB1_LTYPE_ISOBARIC_PA         210
+#define  GRIB1_LTYPE_MEANSEA             102
+#define  GRIB1_LTYPE_ALTITUDE            103
+#define  GRIB1_LTYPE_HEIGHT              105
+#define  GRIB1_LTYPE_SIGMA               107
+#define  GRIB1_LTYPE_SIGMA_LAYER         108
+#define  GRIB1_LTYPE_HYBRID              109
+#define  GRIB1_LTYPE_HYBRID_LAYER        110
+#define  GRIB1_LTYPE_LANDDEPTH           111
+#define  GRIB1_LTYPE_LANDDEPTH_LAYER     112
+#define  GRIB1_LTYPE_ISENTROPIC          113
+#define  GRIB1_LTYPE_SEADEPTH            160  // Depth Below Sea Level                                 
+#define  GRIB1_LTYPE_LAKE_BOTTOM         162  // Lake or River Bottom                                  
+#define  GRIB1_LTYPE_SEDIMENT_BOTTOM     163  // Bottom Of Sediment Layer                              
+#define  GRIB1_LTYPE_SEDIMENT_BOTTOM_TA  164  // Bottom Of Thermally Active Sediment Layer             
+#define  GRIB1_LTYPE_SEDIMENT_BOTTOM_TW  165  // Bottom Of Sediment Layer Penetrated By Thermal Wave   
+#define  GRIB1_LTYPE_MIX_LAYER           166  // Mixing Layer                                          
+
+// GRIB1 Data representation type (Grid Type) [Table 6]
+#define  GRIB1_GTYPE_LATLON                0  //  latitude/longitude                                   
+#define  GRIB1_GTYPE_LATLON_ROT           10  //  rotated latitude/longitude                           
+#define  GRIB1_GTYPE_LATLON_STR           20  //  stretched latitude/longitude                         
+#define  GRIB1_GTYPE_LATLON_ROTSTR        30  //  rotated and stretched latitude/longitude             
+#define  GRIB1_GTYPE_GAUSSIAN              4  //  gaussian grid                                        
+#define  GRIB1_GTYPE_GAUSSIAN_ROT         14  //  rotated gaussian grid                                
+#define  GRIB1_GTYPE_GAUSSIAN_STR         24  //  stretched gaussian grid                              
+#define  GRIB1_GTYPE_GAUSSIAN_ROTSTR      34  //  rotated and stretched gaussian grid                  
+#define  GRIB1_GTYPE_LCC                   3  //  Lambert conformal                                    
+#define  GRIB1_GTYPE_SPECTRAL             50  //  spherical harmonics                                  
+#define  GRIB1_GTYPE_GME                 192  //  hexagonal GME grid                                   
+
+// Macros for the indicator section ( Section 0 )
+#define  ISEC0_GRIB_Len             (isec0[ 0])  //  Number of octets in the GRIB message              
+#define  ISEC0_GRIB_Version         (isec0[ 1])  //  GRIB edition number                               
+
+
+// Macros for the product definition section ( Section 1 )
+#define  ISEC1_TABLE4_MINUTE      0
+#define  ISEC1_TABLE4_HOUR        1
+#define  ISEC1_TABLE4_DAY         2
+#define  ISEC1_TABLE4_3HOURS     10
+#define  ISEC1_TABLE4_6HOURS     11
+#define  ISEC1_TABLE4_12HOURS    12
+#define  ISEC1_TABLE4_QUARTER    13
+#define  ISEC1_TABLE4_30MINUTES  14
+
+
+#define  ISEC1_CodeTable            (isec1[ 0])  //  Version number of code table                 
+#define  ISEC1_CenterID             (isec1[ 1])  //  Identification of centre                     
+#define  ISEC1_ModelID              (isec1[ 2])  //  Identification of model                      
+#define  ISEC1_GridDefinition       (isec1[ 3])  //  Grid definition                              
+#define  ISEC1_Sec2Or3Flag          (isec1[ 4])  //  Section 2 or 3 included                      
+#define  ISEC1_Parameter            (isec1[ 5])  //  Parameter indicator                          
+#define  ISEC1_LevelType            (isec1[ 6])  //  Type of level indicator                      
+#define  ISEC1_Level1               (isec1[ 7])  //  Level 1                                      
+#define  ISEC1_Level2               (isec1[ 8])  //  Level 2                                      
+#define  ISEC1_Year                 (isec1[ 9])  //  Year of century (YY)                         
+#define  ISEC1_Month                (isec1[10])  //  Month (MM)                                   
+#define  ISEC1_Day                  (isec1[11])  //  Day (DD)                                     
+#define  ISEC1_Hour                 (isec1[12])  //  Hour (HH)                                    
+#define  ISEC1_Minute               (isec1[13])  //  Minute (MM)                                  
+#define  ISEC1_TimeUnit             (isec1[14])  //  Time unit indicator                          
+#define  ISEC1_TimePeriod1          (isec1[15])  //  P1 Time period                               
+#define  ISEC1_TimePeriod2          (isec1[16])  //  P2 Time period                               
+#define  ISEC1_TimeRange            (isec1[17])  //  Time range indicator                         
+#define  ISEC1_AvgNum               (isec1[18])  //  Number of products included in an average    
+#define  ISEC1_AvgMiss              (isec1[19])  //  Number of products missing from an average   
+#define  ISEC1_Century              (isec1[20])  //  Century                                      
+#define  ISEC1_SubCenterID          (isec1[21])  //  Subcenter identifier                         
+#define  ISEC1_DecScaleFactor       (isec1[22])  //  Decimal scale factor                         
+#define  ISEC1_LocalFLag            (isec1[23])  //  Flag field to indicate local use in isec1    
+
+#define  ISEC1_ECMWF_LocalExtension (isec1[36])
+#define  ISEC1_ECMWF_Class          (isec1[37])
+
+
+// Macros for the grid definition section ( Section 2 )
+#define  ISEC2_GridType             (isec2[ 0])  // Data representation type 
+
+// Triangular grids
+
+#define  ISEC2_GME_NI2              (isec2[ 1])  //  Number of factor 2 in factorisation of Ni    
+#define  ISEC2_GME_NI3              (isec2[ 2])  //  Number of factor 3 in factorisation of Ni    
+#define  ISEC2_GME_ND               (isec2[ 3])  //  Nubmer of diamonds                           
+#define  ISEC2_GME_NI               (isec2[ 4])  //  Number of tri. subdiv. of the icosahedron    
+#define  ISEC2_GME_AFlag            (isec2[ 5])  //  Flag for orientation of diamonds (Table A)   
+#define  ISEC2_GME_LatPP            (isec2[ 6])  //  Latitude of pole point                       
+#define  ISEC2_GME_LonPP            (isec2[ 7])  //  Longitude of pole point                      
+#define  ISEC2_GME_LonMPL           (isec2[ 8])  //  Longitude of the first diamond               
+#define  ISEC2_GME_BFlag            (isec2[ 9])  //  Flag for storage sequence (Table B)          
+
+// Spherical harmonic coeficients
+
+#define  ISEC2_PentaJ               (isec2[ 1])  //  J pentagonal resolution parameter            
+#define  ISEC2_PentaK               (isec2[ 2])  //  K pentagonal resolution parameter            
+#define  ISEC2_PentaM               (isec2[ 3])  //  M pentagonal resolution parameter            
+#define  ISEC2_RepType              (isec2[ 4])  //  Representation type                          
+#define  ISEC2_RepMode              (isec2[ 5])  //  Representation mode                          
+
+// Gaussian grids
+
+#define  ISEC2_NumLon               (isec2[ 1])  //  Number of points along a parallel (Ni)       
+#define  ISEC2_NumLat               (isec2[ 2])  //  Number of points along a meridian (Nj)       
+#define  ISEC2_FirstLat             (isec2[ 3])  //  Latitude of the first grid point             
+#define  ISEC2_FirstLon             (isec2[ 4])  //  Longitude of the first grid point            
+#define  ISEC2_ResFlag              (isec2[ 5])  //  Resolution flag: 128 regular grid            
+#define  ISEC2_LastLat              (isec2[ 6])  //  Latitude of the last grid point              
+#define  ISEC2_LastLon              (isec2[ 7])  //  Longitude of the last grid point             
+#define  ISEC2_LonIncr              (isec2[ 8])  //  i direction increment                        
+#define  ISEC2_LatIncr              (isec2[ 9])  //  j direction increment                        
+#define  ISEC2_NumPar               (isec2[ 9])  //  Number of parallels between a pole and the E.
+#define  ISEC2_ScanFlag             (isec2[10])  //  Scanning mode flags                          
+#define  ISEC2_NumVCP               (isec2[11])  //  Number of vertical coordinate parameters     
+
+// Lambert
+
+#define  ISEC2_Lambert_Lov          (isec2[ 6])  //  Orientation of the grid                      
+#define  ISEC2_Lambert_dx           (isec2[ 8])  //  X-direction grid length                      
+#define  ISEC2_Lambert_dy           (isec2[ 9])  //  Y-direction grid length                      
+#define  ISEC2_Lambert_ProjFlag     (isec2[12])  //  Projection centre flag                       
+#define  ISEC2_Lambert_LatS1        (isec2[13])  //  First lat at which the secant cone cuts the sphere 
+#define  ISEC2_Lambert_LatS2        (isec2[14])  //  Second lat at which the secant cone cuts the sphere 
+#define  ISEC2_Lambert_LatSP        (isec2[19])  //  Latitude of the southern pole                
+#define  ISEC2_Lambert_LonSP        (isec2[20])  //  Longitude of the southern pole               
+
+
+#define  ISEC2_Reduced              (isec2[16])  // 0: regular, 1: reduced grid                   
+
+#define  ISEC2_ReducedPointsPtr     (&isec2[22])
+#define  ISEC2_ReducedPoints(i)     (isec2[22+i]) // Number of points along each parallel         
+
+
+#define  ISEC2_LatSP                (isec2[12])  // Latitude of the southern pole of rotation     
+#define  ISEC2_LonSP                (isec2[13])  // Longitude of the southern pole of rotation    
+
+#define  FSEC2_RotAngle             (fsec2[ 0])  // Angle of rotation                             
+#define  FSEC2_StrFact              (fsec2[ 1])  // Stretching factor                             
+
+// Macros for the bit map section ( Section 3 )
+
+#define  ISEC3_PredefBitmap         (isec3[ 0])  // Predefined bitmap                             
+#define  ISEC3_MissVal              (isec3[ 1])  // Missing data value for integers               
+#define  FSEC3_MissVal              (fsec3[ 1])  // Missing data value for floats                 
+
+// Macros for the binary data section ( Section 4 )
+
+#define  ISEC4_NumValues            (isec4[ 0])  // Number of data values for encode/decode       
+#define  ISEC4_NumBits              (isec4[ 1])  // Number of bits used for each encoded value    
+#define  ISEC4_NumNonMissValues     (isec4[20])  // Number of non-missing values                  
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+void  gribFixZSE(int flag);     // 1: Fix ZeroShiftError of simple packed spherical harmonics
+void  gribSetConst(int flag);   // 1: Don't pack constant fields on regular grids
+void  gribSetDebug(int debug);  // 1: Debugging
+void  gribSetRound(int round);
+void  gribSetRefDP(double refval);
+void  gribSetRefSP(float  refval);
+void  gribSetValueCheck(int vcheck);
+
+
+void  gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3,
+               float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib,
+               int kleng, int *kword, const char *hoper, int *kret);
+
+void  gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3,
+               double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib,
+               int kleng, int *kword, const char *hoper, int *kret);
+
+
+const char *cgribexLibraryVersion(void);
+
+void  gribDebug(int debug);
+void  gribSetCalendar(int calendar);
+
+void  gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime);
+void  gribDateTime(int *isec1, int *date, int *time);
+int   gribRefDate(const int *isec1);
+int   gribRefTime(const int *isec1);
+
+bool  gribTimeIsFC(const int *isec1);
+
+void  gribPrintSec0(int *isec0);
+void  gribPrintSec1(int *isec0, int *isec1);
+void  gribPrintSec2DP(int *isec0, int *isec2, double *fsec2);
+void  gribPrintSec2SP(int *isec0, int *isec2, float  *fsec2);
+void  gribPrintSec3DP(int *isec0, int *isec3, double *fsec3);
+void  gribPrintSec3SP(int *isec0, int *isec3, float  *fsec3);
+void  gribPrintSec4DP(int *isec0, int *isec4, double *fsec4);
+void  gribPrintSec4SP(int *isec0, int *isec4, float  *fsec4);
+void  gribPrintSec4Wave(int *isec4);
+
+void  gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer);
+void  gribRepair1(int nrec, long recsize, unsigned char *gribbuffer);
+
+int   gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize);
+
+int   gribBzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize);
+int   gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize);
+int   gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize);
+
+int   gribOpen(const char *filename, const char *mode);
+void  gribClose(int fileID);
+
+int   gribRead(int fileID, void *buffer, size_t *buffersize);
+int   gribWrite(int fileID, void *buffer, size_t buffersize);
+off_t gribGetPos(int fileID);
+size_t gribGetSize(int fileID);
+int   gribCheckSeek(int fileID, long *offset, int *version);
+int   gribFileSeek(int fileID, long *offset);
+size_t gribReadSize(int fileID);
+int   gribVersion(unsigned char *buffer, size_t buffersize);
+
+int   grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum);
+
+double calculate_pfactor_float(const float* spectralField, long fieldTruncation, long subsetTruncation);
+double calculate_pfactor_double(const double* spectralField, long fieldTruncation, long subsetTruncation);
+
+#ifdef  __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* CGRIBEX_H */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <ctype.h>
+
+
+#ifdef HAVE_LIBCGRIBEX
+#endif
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+pthread_mutex_t CDI_IO_Mutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+int CDI_Default_Calendar = CALENDAR_PROLEPTIC;
+
+int CDI_Default_InstID = CDI_UNDEFID;
+int CDI_Default_ModelID = CDI_UNDEFID;
+int CDI_Default_TableID = CDI_UNDEFID;
+// int cdiNcMissingValue  = CDI_UNDEFID;
+int CDI_Netcdf_Chunksizehint = CDI_UNDEFID;
+int CDI_Split_Ltype105 = CDI_UNDEFID;
+
+bool CDI_Ignore_Att_Coordinates = false;
+bool CDI_Coordinates_Lon_Lat = false;
+bool CDI_Ignore_Valid_Range = false;
+int CDI_Skip_Records = 0;
+const char *CDI_GRIB1_Template = NULL;
+const char *CDI_GRIB2_Template = NULL;
+int CDI_Convention = CDI_CONVENTION_ECHAM;
+int CDI_Inventory_Mode = 1;
+int CDI_Version_Info = 1;
+int CDI_Query_Abort = 1;
+int CDI_Convert_Cubesphere = 1;
+int CDI_Read_Cell_Corners = 1;
+int CDI_CMOR_Mode = 0;
+int CDI_Reduce_Dim = 0;
+int CDI_Shuffle = 0;
+int CDI_Test = 0;
+size_t CDI_Netcdf_Hdr_Pad = 0UL;
+bool CDI_Chunk_Cache_Info = false;
+long CDI_Chunk_Cache = -1L;
+size_t CDI_Chunk_Cache_Max = 0UL;
+bool CDI_Netcdf_Lazy_Grid_Load = false;
+
+char *cdiPartabPath = NULL;
+int cdiPartabIntern = 1;
+
+double CDI_Default_Missval = -9.E33;
+double CDI_Grid_Missval = -9999.;
+
+// clang-format off
+static const char Filetypes[][9] = {
+  "UNKNOWN",
+  "GRIB",
+  "GRIB2",
+  "NetCDF",
+  "NetCDF2",
+  "NetCDF4",
+  "NetCDF4c",
+  "NetCDF5",
+  "SERVICE",
+  "EXTRA",
+  "IEG",
+  "NCZarr",
+  "HDF5",
+};
+// clang-format on
+
+int CDI_Debug = 0;  // If set to 1, debugging
+int CDI_Recopt = 0;
+
+bool CDI_gribapi_debug = false;
+bool CDI_gribapi_grib1 = false;
+bool CDI_Lock_IO = false;
+bool CDI_Threadsafe = false;
+int cdiDefaultLeveltype = -1;
+int cdiDataUnreduced = 0;
+int cdiSortName = 0;
+int cdiHaveMissval = 0;
+
+static long
+cdi_getenv_int(const char *envName)
+{
+  long envValue = -1;
+
+  char *envString = getenv(envName);
+  if (envString)
+    {
+      long fact = 1;
+      int len = (int) strlen(envString);
+      for (int loop = 0; loop < len; loop++)
+        {
+          if (!isdigit((int) envString[loop]))
+            {
+              switch (tolower((int) envString[loop]))
+                {
+                case 'k': fact = 1024; break;
+                case 'm': fact = 1048576; break;
+                case 'g': fact = 1073741824; break;
+                default:
+                  fact = 0;
+                  Warning("Invalid number string in %s: %s", envName, envString);
+                  Warning("%s must comprise only digits [0-9].", envName);
+                  break;
+                }
+              break;
+            }
+        }
+
+      if (fact) envValue = fact * atol(envString);
+
+      if (CDI_Debug) Message("set %s to %ld", envName, envValue);
+    }
+
+  return envValue;
+}
+
+static void
+cdiPrintDefaults(void)
+{
+  fprintf(stderr,
+          "default instID     :  %d\n"
+          "default modelID    :  %d\n"
+          "default tableID    :  %d\n"
+          "default missval    :  %g\n",
+          CDI_Default_InstID, CDI_Default_ModelID, CDI_Default_TableID, CDI_Default_Missval);
+}
+
+#ifdef HAVE_LIBFDB5
+#include <fdb5/fdb5_config.h>
+#endif
+
+void
+cdiPrintVersion(void)
+{
+  fprintf(stdout, "     CDI library version : %s\n", cdiLibraryVersion());
+#ifdef HAVE_LIBCGRIBEX
+  fprintf(stdout, " cgribex library version : %s\n", cgribexLibraryVersion());
+#endif
+#ifdef HAVE_LIBGRIB_API
+  fprintf(stdout, " ecCodes library version : %s\n", gribapiLibraryVersionString());
+#endif
+#ifdef HAVE_LIBNETCDF
+  fprintf(stdout, "  NetCDF library version : %s\n", cdfLibraryVersion());
+#endif
+#ifdef HAVE_LIBSERVICE
+  fprintf(stdout, "    exse library version : %s\n", srvLibraryVersion());
+#endif
+  fprintf(stdout, "    FILE library version : %s\n", fileLibraryVersion());
+#ifdef HAVE_LIBFDB5
+  fprintf(stdout, "    FDB5 library version : %s\n", fdb5_version());
+#endif
+}
+
+static void
+cdiPrintDatatypes(void)
+{
+#define XSTRING(x) #x
+#define STRING(x) XSTRING(x)
+
+  fprintf(stderr,
+          "+-------------+-------+\n"
+          "| types       | bytes |\n"
+          "+-------------+-------+\n"
+          "| void *      |   %3d |\n"
+          "+-------------+-------+\n"
+          "| char        |   %3d |\n"
+          "+-------------+-------+\n"
+          "| bool        |   %3d |\n"
+          "| short       |   %3d |\n"
+          "| int         |   %3d |\n"
+          "| long        |   %3d |\n"
+          "| long long   |   %3d |\n"
+          "| size_t      |   %3d |\n"
+          "| off_t       |   %3d |\n"
+          "+-------------+-------+\n"
+          "| float       |   %3d |\n"
+          "| double      |   %3d |\n"
+          "| long double |   %3d |\n"
+          "+-------------+-------+\n\n",
+          (int) sizeof(void *), (int) sizeof(char), (int) sizeof(bool), (int) sizeof(short), (int) sizeof(int), (int) sizeof(long),
+          (int) sizeof(long long), (int) sizeof(size_t), (int) sizeof(off_t), (int) sizeof(float), (int) sizeof(double),
+          (int) sizeof(long double));
+
+  fprintf(stderr,
+          "+-------------+-----------+\n"
+          "| INT32       | %-9s |\n"
+          "| INT64       | %-9s |\n"
+          "| FLT32       | %-9s |\n"
+          "| FLT64       | %-9s |\n"
+          "| SizeType    | %-9s |\n"
+          "+-------------+-----------+\n",
+          STRING(INT32), STRING(INT64), STRING(FLT32), STRING(FLT64), STRING(CDI_SIZE_TYPE));
+
+  fprintf(stderr, "\n  byte ordering is %s\n\n",
+          ((HOST_ENDIANNESS == CDI_BIGENDIAN)
+               ? "BIGENDIAN"
+               : ((HOST_ENDIANNESS == CDI_LITTLEENDIAN) ? "LITTLEENDIAN" : "Unhandled endianness!")));
+
+#undef STRING
+#undef XSTRING
+}
+
+void
+cdiDebug(int level)
+{
+  unsigned ulevel = (level == 1) ? (1U << 16) : (unsigned) level;
+
+  if (ulevel & 2) CDI_Debug = 1;
+  if (ulevel & 4) memDebug(1);
+  if (ulevel & 8) fileDebug(1);
+
+  if (ulevel & 16)
+    {
+#ifdef HAVE_LIBCGRIBEX
+      gribSetDebug(1);
+#endif
+#ifdef HAVE_LIBNETCDF
+      cdfDebug(1);
+#endif
+#ifdef HAVE_LIBSERVICE
+      srvDebug(1);
+#endif
+#ifdef HAVE_LIBEXTRA
+      extDebug(1);
+#endif
+#ifdef HAVE_LIBIEG
+      iegDebug(1);
+#endif
+    }
+
+  if (CDI_Debug)
+    {
+      cdiPrintDefaults();
+      cdiPrintDatatypes();
+    }
+}
+
+int
+cdiHaveFiletype(int filetype)
+{
+  int status = 0;
+
+  switch (filetype)
+    {
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: status = 1; break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: status = 1; break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: status = 1; break;
+#endif
+#ifdef HAVE_LIBGRIB
+#if defined HAVE_LIBGRIB_API || defined HAVE_LIBCGRIBEX
+    case CDI_FILETYPE_GRB: status = 1; break;
+#endif
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRB2: status = 1; break;
+#endif
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NC: status = 1; break;
+#ifdef HAVE_NETCDF2
+    case CDI_FILETYPE_NC2: status = 1; break;
+#endif
+#ifdef HAVE_NETCDF4
+    case CDI_FILETYPE_NC4: status = 1; break;
+    case CDI_FILETYPE_NC4C: status = 1; break;
+#endif
+#ifdef HAVE_NCZARR
+    case CDI_FILETYPE_NCZARR: status = 1; break;
+#endif
+#ifdef HAVE_NETCDF5
+    case CDI_FILETYPE_NC5: status = 1; break;
+#endif
+#endif
+    default: status = 0; break;
+    }
+
+  return status;
+}
+
+void
+cdiDefTableID(int tableID)
+{
+  CDI_Default_TableID = tableID;
+  int modelID = CDI_Default_ModelID = tableInqModel(tableID);
+  CDI_Default_InstID = modelInqInstitut(modelID);
+}
+
+void
+cdiSetEccodesGrib1(bool value)
+{
+#ifndef HAVE_LIBGRIB_API
+  if (value)
+    {
+      Warning("ecCodes support not compiled in, used CGRIBEX to decode/encode GRIB1 records!");
+      value = false;
+    }
+#endif
+  CDI_gribapi_grib1 = value;
+}
+
+void
+cdiInitialize(void)
+{
+  static bool Init_CDI = false;
+
+  if (!Init_CDI)
+    {
+      Init_CDI = true;
+      char *envstr;
+      long value;
+
+#ifdef HAVE_LIBCGRIBEX
+      gribFixZSE(1);    // 1: Fix ZeroShiftError of simple packed spherical harmonics
+      gribSetConst(1);  // 1: Don't pack constant fields on regular grids
+#endif
+#ifdef HAVE_LIBGRIB_API
+      grib_multi_support_off(NULL);
+#endif
+
+      value = cdi_getenv_int("CDI_DEBUG");
+      if (value >= 0) CDI_Debug = (int) value;
+
+      value = cdi_getenv_int("CDI_GRIBAPI_DEBUG");
+      if (value >= 0) CDI_gribapi_debug = (bool) value;
+
+      value = cdi_getenv_int("CDI_ECCODES_DEBUG");
+      if (value >= 0) CDI_gribapi_debug = (bool) value;
+
+      value = cdi_getenv_int("CDI_ECCODES_GRIB1");
+      if (value >= 0) cdiSetEccodesGrib1((bool) value);
+
+      value = cdi_getenv_int("CDI_LOCK_IO");
+      if (value >= 0) CDI_Lock_IO = (bool) value;
+
+      value = cdi_getenv_int("CDI_READ_CELL_CORNERS");
+      if (value >= 0) CDI_Read_Cell_Corners = (int) value;
+
+      value = cdi_getenv_int("CDI_RECOPT");
+      if (value >= 0) CDI_Recopt = (int) value;
+
+      value = cdi_getenv_int("CDI_REGULARGRID");
+      if (value >= 0) cdiDataUnreduced = (int) value;
+
+      value = cdi_getenv_int("CDI_SORTNAME");
+      if (value >= 0) cdiSortName = (int) value;
+
+      value = cdi_getenv_int("CDI_HAVE_MISSVAL");
+      if (value >= 0) cdiHaveMissval = (int) value;
+
+      value = cdi_getenv_int("CDI_LEVELTYPE");
+      if (value >= 0) cdiDefaultLeveltype = (int) value;
+
+      value = cdi_getenv_int("CDI_NETCDF_HDR_PAD");
+      if (value >= 0) CDI_Netcdf_Hdr_Pad = (size_t) value;
+
+      value = cdi_getenv_int("CDI_CHUNK_CACHE_INFO");
+      if (value > 0) CDI_Chunk_Cache_Info = true;
+
+      value = cdi_getenv_int("CDI_CHUNK_CACHE");
+      if (value >= 0) CDI_Chunk_Cache = value;
+
+      value = cdi_getenv_int("CDI_CHUNK_CACHE_MAX");
+      if (value >= 0) CDI_Chunk_Cache_Max = (size_t) value;
+
+      value = cdi_getenv_int("CDI_TEST");
+      if (value >= 0) CDI_Test = (int) value;
+
+      envstr = getenv("CDI_GRIB1_TEMPLATE");
+      if (envstr) CDI_GRIB1_Template = envstr;
+
+      envstr = getenv("CDI_GRIB2_TEMPLATE");
+      if (envstr) CDI_GRIB2_Template = envstr;
+
+      envstr = getenv("CDI_SHUFFLE");
+      if (envstr) CDI_Shuffle = atoi(envstr);
+
+      envstr = getenv("CDI_MISSVAL");
+      if (envstr) CDI_Default_Missval = atof(envstr);
+      /*
+      envstr = getenv("NC_MISSING_VALUE");
+      if ( envstr ) cdiNcMissingValue = atoi(envstr);
+      */
+      envstr = getenv("NC_CHUNKSIZEHINT");
+      if (envstr) CDI_Netcdf_Chunksizehint = atoi(envstr);
+
+      envstr = getenv("SPLIT_LTYPE_105");
+      if (envstr) CDI_Split_Ltype105 = atoi(envstr);
+
+      envstr = getenv("IGNORE_ATT_COORDINATES");
+      if (envstr) CDI_Ignore_Att_Coordinates = atoi(envstr) > 0;
+
+      envstr = getenv("CDI_COORDINATES_LONLAT");
+      if (envstr) CDI_Coordinates_Lon_Lat = atoi(envstr) > 0;
+
+      envstr = getenv("IGNORE_VALID_RANGE");
+      if (envstr) CDI_Ignore_Valid_Range = atoi(envstr) > 0;
+
+      envstr = getenv("CDI_SKIP_RECORDS");
+      if (envstr)
+        {
+          CDI_Skip_Records = atoi(envstr);
+          CDI_Skip_Records = CDI_Skip_Records > 0 ? CDI_Skip_Records : 0;
+        }
+
+      envstr = getenv("CDI_CONVENTION");
+      if (envstr)
+        {
+          if (str_is_equal(envstr, "CF") || str_is_equal(envstr, "cf"))
+            {
+              CDI_Convention = CDI_CONVENTION_CF;
+              if (CDI_Debug) Message("CDI convention was set to CF!");
+            }
+        }
+
+      envstr = getenv("CDI_INVENTORY_MODE");
+      if (envstr)
+        {
+          if (strncmp(envstr, "time", 4) == 0)
+            {
+              CDI_Inventory_Mode = 2;
+              if (CDI_Debug) Message("Inventory mode was set to timestep!");
+            }
+        }
+
+      envstr = getenv("CDI_QUERY_ABORT");
+      if (envstr)
+        {
+          int ival = atoi(envstr);
+          if (ival == 0 || ival == 1)
+            {
+              CDI_Query_Abort = ival;
+              if (CDI_Debug) Message("CDI_Query_Abort = %s", envstr);
+            }
+        }
+
+      envstr = getenv("CDI_VERSION_INFO");
+      if (envstr)
+        {
+          int ival = atoi(envstr);
+          if (ival == 0 || ival == 1)
+            {
+              CDI_Version_Info = ival;
+              if (CDI_Debug) Message("CDI_Version_Info = %s", envstr);
+            }
+        }
+
+      envstr = getenv("CDI_CONVERT_CUBESPHERE");
+      if (envstr)
+        {
+          int ival = atoi(envstr);
+          if (ival == 0 || ival == 1)
+            {
+              CDI_Convert_Cubesphere = ival;
+              if (CDI_Debug) Message("CDI_Convert_Cubesphere = %s", envstr);
+            }
+        }
+
+      envstr = getenv("CDI_CALENDAR");
+      if (envstr)
+        {
+          // clang-format off
+	      if      (strncmp(envstr, "standard", 8)  == 0) CDI_Default_Calendar = CALENDAR_STANDARD;
+	      else if (strncmp(envstr, "gregorian", 9) == 0) CDI_Default_Calendar = CALENDAR_GREGORIAN;
+	      else if (strncmp(envstr, "proleptic", 9) == 0) CDI_Default_Calendar = CALENDAR_PROLEPTIC;
+	      else if (strncmp(envstr, "360days", 7)   == 0) CDI_Default_Calendar = CALENDAR_360DAYS;
+	      else if (strncmp(envstr, "365days", 7)   == 0) CDI_Default_Calendar = CALENDAR_365DAYS;
+	      else if (strncmp(envstr, "366days", 7)   == 0) CDI_Default_Calendar = CALENDAR_366DAYS;
+	      else if (strncmp(envstr, "none", 4)      == 0) CDI_Default_Calendar = CALENDAR_NONE;
+          // clang-format on
+          if (CDI_Debug) Message("Default calendar set to %s!", envstr);
+        }
+#ifdef HAVE_LIBCGRIBEX
+      gribSetCalendar(CDI_Default_Calendar);
+#endif
+
+      envstr = getenv("PARTAB_INTERN");
+      if (envstr) cdiPartabIntern = atoi(envstr);
+
+      envstr = getenv("PARTAB_PATH");
+      if (envstr) cdiPartabPath = strdup(envstr);
+    }
+}
+
+const char *
+strfiletype(int filetype)
+{
+  int size = (int) (sizeof(Filetypes) / sizeof(char *));
+  return (filetype > 0 && filetype < size) ? Filetypes[filetype] : Filetypes[0];
+}
+
+void
+cdiDefGlobal(const char *string, int value)
+{
+  // clang-format off
+  if      (str_is_equal(string, "REGULARGRID"))           cdiDataUnreduced = value;
+  else if (str_is_equal(string, "LOCKIO"))                CDI_Lock_IO = (bool) value;
+  else if (str_is_equal(string, "THREADSAFE"))            CDI_Threadsafe = (bool) value;
+  else if (str_is_equal(string, "ECCODES_DEBUG"))         CDI_gribapi_debug = (bool) value;
+  else if (str_is_equal(string, "ECCODES_GRIB1"))         cdiSetEccodesGrib1((bool) value);
+  else if (str_is_equal(string, "SORTNAME"))              cdiSortName = value;
+  else if (str_is_equal(string, "HAVE_MISSVAL"))          cdiHaveMissval = value;
+  else if (str_is_equal(string, "NC_CHUNKSIZEHINT"))      CDI_Netcdf_Chunksizehint = value;
+  else if (str_is_equal(string, "READ_CELL_CORNERS"))     CDI_Read_Cell_Corners = value;
+  else if (str_is_equal(string, "CMOR_MODE"))             CDI_CMOR_Mode = value;
+  else if (str_is_equal(string, "REDUCE_DIM"))            CDI_Reduce_Dim = value;
+  else if (str_is_equal(string, "NETCDF_HDR_PAD"))        CDI_Netcdf_Hdr_Pad = (size_t) value;
+  else if (str_is_equal(string, "NETCDF_LAZY_GRID_LOAD")) CDI_Netcdf_Lazy_Grid_Load = (bool) value;
+  else Warning("Unsupported global key: %s", string);
+  // clang-format on
+}
+
+void
+cdiDefMissval(double missval)
+{
+  cdiInitialize();
+
+  CDI_Default_Missval = missval;
+}
+
+double
+cdiInqMissval(void)
+{
+  cdiInitialize();
+
+  return CDI_Default_Missval;
+}
+
+bool
+cdiFiletypeIsExse(int filetype)
+{
+  return (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG);
+}
+
+int
+cdiBaseFiletype(int filetype)
+{
+  switch (filetype)
+    {
+    case CDI_FILETYPE_GRB:
+    case CDI_FILETYPE_GRB2: return CDI_FILETYPE_GRIB;
+    case CDI_FILETYPE_NC:
+    case CDI_FILETYPE_NC2:
+    case CDI_FILETYPE_NC4:
+    case CDI_FILETYPE_NC4C:
+    case CDI_FILETYPE_NCZARR:
+    case CDI_FILETYPE_NC5: return CDI_FILETYPE_NETCDF;
+    }
+
+  return filetype;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <string.h>
+#include <stdlib.h>
+
+static int
+sum_found(int listSize, bool *listFound)
+{
+  int numFound = 0;
+  for (int i = 0; i < listSize; ++i) numFound += listFound[i];
+  return numFound;
+}
+
+static int
+sum_not_found(int listSize, bool *listFound)
+{
+  return listSize - sum_found(listSize, listFound);
+}
+
+void
+cdiQueryInit(CdiQuery *query)
+{
+  query->numEntries = 0;
+
+  query->numNames = 0;
+  query->names = NULL;
+  query->namesFound = NULL;
+
+  query->numCellidx = 0;
+  query->cellidx = NULL;
+  query->cellidxFound = NULL;
+
+  query->numLevidx = 0;
+  query->levidx = NULL;
+  query->levidxFound = NULL;
+
+  query->numStepidx = 0;
+  query->stepidx = NULL;
+  query->stepidxFound = NULL;
+}
+
+CdiQuery *
+cdiQueryCreate(void)
+{
+  CdiQuery *query = (CdiQuery *) Malloc(sizeof(CdiQuery));
+  cdiQueryInit(query);
+  return query;
+}
+
+void
+cdiQueryDelete(CdiQuery *query)
+{
+  if (query)
+    {
+      if (query->numNames)
+        {
+          for (int i = 0; i < query->numNames; ++i) Free(query->names[i]);
+          Free(query->names);
+          Free(query->namesFound);
+        }
+
+      if (query->numCellidx)
+        {
+          Free(query->cellidx);
+          Free(query->cellidxFound);
+        }
+
+      if (query->numLevidx)
+        {
+          Free(query->levidx);
+          Free(query->levidxFound);
+        }
+
+      if (query->numStepidx)
+        {
+          Free(query->stepidx);
+          Free(query->stepidxFound);
+        }
+
+      cdiQueryInit(query);
+      Free(query);
+    }
+}
+
+int
+cdiQueryNumNames(const CdiQuery *query)
+{
+  return query ? query->numNames : 0;
+}
+
+int
+cdiQueryNumCellidx(const CdiQuery *query)
+{
+  return query ? query->numCellidx : 0;
+}
+
+int
+cdiQueryNumStepidx(const CdiQuery *query)
+{
+  return query ? query->numStepidx : 0;
+}
+
+int
+cdiQueryNumEntries(const CdiQuery *query)
+{
+  return query ? query->numEntries : 0;
+}
+
+void
+cdiQuerySetNames(CdiQuery *query, int numEntries, char **names)
+{
+  if (numEntries > 0)
+    {
+      query->numEntries += numEntries;
+      query->numNames = numEntries;
+      query->namesFound = (bool *) Calloc((size_t) numEntries, sizeof(bool));
+      query->names = (char **) Malloc((size_t) numEntries * sizeof(char *));
+      for (int i = 0; i < numEntries; ++i) query->names[i] = strdup(names[i]);
+    }
+}
+
+void
+cdiQuerySetCellidx(CdiQuery *query, int numEntries, size_t *cellidx)
+{
+  if (numEntries > 0)
+    {
+      query->numEntries += numEntries;
+      query->numCellidx = numEntries;
+      query->cellidxFound = (bool *) Calloc((size_t) numEntries, sizeof(bool));
+      query->cellidx = (size_t *) Malloc((size_t) numEntries * sizeof(size_t));
+      for (int i = 0; i < numEntries; ++i) query->cellidx[i] = cellidx[i];
+    }
+}
+
+void
+cdiQuerySetLevidx(CdiQuery *query, int numEntries, int *levidx)
+{
+  if (numEntries > 0)
+    {
+      query->numEntries += numEntries;
+      query->numLevidx = numEntries;
+      query->levidxFound = (bool *) Calloc((size_t) numEntries, sizeof(bool));
+      query->levidx = (int *) Malloc((size_t) numEntries * sizeof(int));
+      for (int i = 0; i < numEntries; ++i) query->levidx[i] = levidx[i];
+    }
+}
+
+void
+cdiQuerySetStepidx(CdiQuery *query, int numEntries, int *stepidx)
+{
+  if (numEntries > 0)
+    {
+      query->numEntries += numEntries;
+      query->numStepidx = numEntries;
+      query->stepidxFound = (bool *) Calloc((size_t) numEntries, sizeof(bool));
+      query->stepidx = (int *) Malloc((size_t) numEntries * sizeof(int));
+      for (int i = 0; i < numEntries; ++i) query->stepidx[i] = stepidx[i];
+    }
+}
+
+size_t
+cdiQueryGetCellidx(const CdiQuery *query, int index)
+{
+  return (index >= 0 && index < query->numCellidx) ? query->cellidx[index] : (size_t) -1;
+}
+
+CdiQuery *
+cdiQueryClone(const CdiQuery *query)
+{
+  CdiQuery *queryOut = cdiQueryCreate();
+
+  if (query)
+    {
+      cdiQuerySetNames(queryOut, query->numNames, query->names);
+      cdiQuerySetCellidx(queryOut, query->numCellidx, query->cellidx);
+      cdiQuerySetLevidx(queryOut, query->numLevidx, query->levidx);
+      cdiQuerySetStepidx(queryOut, query->numStepidx, query->stepidx);
+    }
+
+  return queryOut;
+}
+
+static void
+print_list_compact_int(int n, const int *list)
+{
+  for (int i = 0; i < n; ++i)
+    {
+      int value = list[i];
+      printf(" %d", value);
+      if ((i + 2) < n && (value + 1) == list[i + 1] && (value + 2) == list[i + 2])
+        {
+          printf("/to/");
+          int last = list[++i];
+          while ((i + 1) < n && (last + 1) == list[i + 1]) last = list[++i];
+          printf("%d", last);
+        }
+    }
+  printf("\n");
+}
+
+void
+cdiQueryPrint(const CdiQuery *query)
+{
+  if (query)
+    {
+      if (query->numNames)
+        {
+          printf("Names:");
+          for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]);
+          printf("\n");
+        }
+
+      if (query->numCellidx)
+        {
+          printf("Cellidx:");
+          for (int i = 0; i < query->numCellidx; ++i) printf(" %zu", query->cellidx[i]);
+          printf("\n");
+        }
+
+      if (query->numLevidx)
+        {
+          printf("Levidx:");
+          print_list_compact_int(query->numLevidx, query->levidx);
+        }
+
+      if (query->numStepidx)
+        {
+          printf("Stepidx:");
+          print_list_compact_int(query->numStepidx, query->stepidx);
+        }
+    }
+}
+
+int
+cdiQueryNumEntriesFound(const CdiQuery *query)
+{
+  int numEntriesFound = 0;
+
+  if (query)
+    {
+      if (query->numNames) numEntriesFound += sum_found(query->numNames, query->namesFound);
+      if (query->numCellidx) numEntriesFound += sum_found(query->numCellidx, query->cellidxFound);
+      if (query->numLevidx) numEntriesFound += sum_found(query->numLevidx, query->levidxFound);
+      if (query->numStepidx) numEntriesFound += sum_found(query->numStepidx, query->stepidxFound);
+    }
+
+  return numEntriesFound;
+}
+
+void
+cdiQueryPrintEntriesNotFound(const CdiQuery *query)
+{
+  if (query)
+    {
+      int numEntriesNotFound = cdiQueryNumEntries(query) - cdiQueryNumEntriesFound(query);
+      if (numEntriesNotFound > 0)
+        {
+          if (query->numNames)
+            {
+              if (sum_not_found(query->numNames, query->namesFound) > 0)
+                {
+                  printf("Name not found:");
+                  for (int i = 0; i < query->numNames; ++i)
+                    if (!query->namesFound[i]) printf(" %s", query->names[i]);
+                  printf("\n");
+                }
+            }
+
+          if (query->numCellidx)
+            {
+              if (sum_not_found(query->numCellidx, query->cellidxFound) > 0)
+                {
+                  printf("Grid cell index not found:");
+                  for (int i = 0; i < query->numCellidx; ++i)
+                    if (!query->cellidxFound[i]) printf(" %zu", query->cellidx[i]);
+                  printf("\n");
+                }
+            }
+
+          if (query->numLevidx)
+            {
+              if (sum_not_found(query->numLevidx, query->levidxFound) > 0)
+                {
+                  printf("Level index not found:");
+                  for (int i = 0; i < query->numLevidx; ++i)
+                    if (!query->levidxFound[i]) printf(" %d", query->levidx[i]);
+                  printf("\n");
+                }
+            }
+
+          if (query->numStepidx)
+            {
+              if (sum_not_found(query->numStepidx, query->stepidxFound) > 0)
+                {
+                  printf("Step index not found:");
+                  for (int i = 0; i < query->numStepidx; ++i)
+                    if (!query->stepidxFound[i]) printf(" %d", query->stepidx[i]);
+                  printf("\n");
+                }
+            }
+        }
+    }
+}
+
+int
+cdiQueryName(CdiQuery *query, const char *name)
+{
+  if (query && query->numNames && name && *name)
+    {
+      for (int i = 0; i < query->numNames; ++i)
+        if (strcmp(name, query->names[i]) == 0)
+          {
+            query->namesFound[i] = true;
+            return 0;
+          }
+    }
+
+  return -1;
+}
+
+int
+cdiQueryCellidx(CdiQuery *query, size_t cellidx)
+{
+  if (query && query->numCellidx)
+    {
+      for (int i = 0; i < query->numCellidx; ++i)
+        if (query->cellidx[i] == cellidx)
+          {
+            query->cellidxFound[i] = true;
+            return 0;
+          }
+    }
+
+  return -1;
+}
+
+int
+cdiQueryLevidx(CdiQuery *query, int levidx)
+{
+  if (query && query->numLevidx)
+    {
+      for (int i = 0; i < query->numLevidx; ++i)
+        if (query->levidx[i] == levidx)
+          {
+            query->levidxFound[i] = true;
+            return 0;
+          }
+    }
+
+  return -1;
+}
+
+int
+cdiQueryStepidx(CdiQuery *query, int stepidx)
+{
+  if (query && query->numStepidx)
+    {
+      for (int i = 0; i < query->numStepidx; ++i)
+        if (query->stepidx[i] == stepidx)
+          {
+            query->stepidxFound[i] = true;
+            return 0;
+          }
+    }
+
+  return -1;
+}
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <unistd.h>
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void
+cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis)
+{
+  unsigned uparam = (unsigned) param;
+
+  *pdis = (int) (0xffU & uparam);
+  *pcat = (int) (0xffU & (uparam >> 8));
+  unsigned upnum = 0xffffU & (uparam >> 16);
+  if (upnum > 0x7fffU) upnum = 0x8000U - upnum;
+  *pnum = (int) upnum;
+}
+
+int
+cdiEncodeParam(int pnum, int pcat, int pdis)
+{
+  if (pcat < 0 || pcat > 255) pcat = 255;
+  if (pdis < 0 || pdis > 255) pdis = 255;
+
+  unsigned upnum = (unsigned) pnum;
+  if (pnum < 0) upnum = (unsigned) (0x8000 - pnum);
+
+  unsigned uparam = (upnum << 16) | (((unsigned) pcat) << 8) | (unsigned) pdis;
+
+  return (int) uparam;
+}
+
+void
+cdiParamToString(int param, char *paramstr, int maxlen)
+{
+  int dis, cat, num;
+  cdiDecodeParam(param, &num, &cat, &dis);
+
+  size_t umaxlen = maxlen >= 0 ? (unsigned) maxlen : 0U;
+  int len;
+  if (dis == 255 && (cat == 255 || cat == 0))
+    len = snprintf(paramstr, umaxlen, "%d", num);
+  else if (dis == 255)
+    len = snprintf(paramstr, umaxlen, "%d.%d", num, cat);
+  else
+    len = snprintf(paramstr, umaxlen, "%d.%d.%d", num, cat, dis);
+
+  if (len >= maxlen || len < 0) fprintf(stderr, "Internal problem (%s): size of input string is too small!\n", __func__);
+}
+
+const char *
+cdiUnitNamePtr(int cdi_unit)
+{
+  const char *cdiUnits[] = {
+    /*  0 */ "undefined",
+    /*  1 */ "Pa",
+    /*  2 */ "hPa",
+    /*  3 */ "mm",
+    /*  4 */ "cm",
+    /*  5 */ "dm",
+    /*  6 */ "m",
+  };
+  enum
+  {
+    numUnits = (int) (sizeof(cdiUnits) / sizeof(char *))
+  };
+  const char *name = (cdi_unit > 0 && cdi_unit < numUnits) ? cdiUnits[cdi_unit] : NULL;
+
+  return name;
+}
+
+size_t
+cdiGetPageSize(bool largePageAlign)
+{
+  long pagesize = -1L;
+#if HAVE_DECL__SC_LARGE_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE || HAVE_DECL__SC_PAGESIZE
+  bool nameAssigned = false;
+  int name = 0;
+#if HAVE_DECL__SC_LARGE_PAGESIZE
+  if (largePageAlign)
+    {
+      name = _SC_LARGE_PAGESIZE;
+      nameAssigned = true;
+    }
+  else
+#else
+  (void) largePageAlign;
+#endif
+    {
+#if HAVE_DECL__SC_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE
+      name =
+#if HAVE_DECL__SC_PAGESIZE
+          _SC_PAGESIZE;
+#else
+          _SC_PAGE_SIZE;
+#endif
+      nameAssigned = true;
+#endif
+    }
+  if (nameAssigned) pagesize = sysconf(name);
+#endif
+  if (pagesize == -1L)
+    pagesize =
+#if HAVE_DECL_PAGESIZE
+        PAGESIZE;
+#elif HAVE_DECL_PAGE_SIZE
+        PAGE_SIZE;
+#else
+        commonPageSize;
+#endif
+  return (size_t) pagesize;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+
+// Automatically generated by m214003 at 2024-06-08, do not edit
+
+// CGRIBEXLIB_VERSION="2.3.0"
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) || defined(__clang__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#pragma GCC diagnostic warning "-Wstrict-overflow"
+#endif
+
+#ifdef _ARCH_PWR6
+#pragma options nostrict
+#include <ppu_intrinsics.h>
+#endif
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <sys/types.h>
+#include <limits.h>
+#include <inttypes.h>
+
+
+#ifndef CGRIBEX_TEMPLATES_H
+#define CGRIBEX_TEMPLATES_H
+
+// clang-format off
+#define CAT(X,Y)      X##_##Y
+#define TEMPLATE(X,Y) CAT(X,Y)
+// clang-format on
+
+#endif
+#ifndef GRIB_INT_H
+#define GRIB_INT_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <math.h>
+#include <float.h>
+
+// clang-format off
+
+#ifndef  CGRIBEX_H
+#endif
+#ifndef  ERROR_H
+#endif
+
+#ifndef UCHAR
+#define  UCHAR  unsigned char
+#endif
+
+
+#if defined (CRAY) || defined (SX) || defined (__uxpch__)
+#define VECTORCODE 1
+#endif
+
+
+#ifdef VECTORCODE
+#  define  GRIBPACK     uint32_t
+#  define  PACK_GRIB    packInt32
+#  define  UNPACK_GRIB  unpackInt32
+#else
+#  define  GRIBPACK     unsigned char
+#endif
+
+#ifndef HOST_ENDIANNESS
+#ifdef __cplusplus
+static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) };
+#define HOST_ENDIANNESS (((const unsigned char *)HOST_ENDIANNESS_temp)[0])
+#else
+#define HOST_ENDIANNESS (((const unsigned char *)&(const uint32_t[1]){UINT32_C(0x00030201)})[0])
+#endif
+#endif
+
+#define  IS_BIGENDIAN()  (HOST_ENDIANNESS == 0)
+
+#if defined (__xlC__) /* performance problems on IBM */
+#ifndef DBL_IS_NAN
+#  define DBL_IS_NAN(x)     ((x) != (x))
+#endif
+#else
+#ifndef DBL_IS_NAN
+#if  defined  (HAVE_DECL_ISNAN)
+#  define DBL_IS_NAN(x)     (isnan(x))
+#elif  defined  (FP_NAN)
+#  define DBL_IS_NAN(x)     (fpclassify(x) == FP_NAN)
+#else
+#  define DBL_IS_NAN(x)     ((x) != (x))
+#endif
+#endif
+#endif
+
+#ifndef IS_EQUAL
+#  define IS_NOT_EQUAL(x,y) (x < y || y < x)
+#  define IS_EQUAL(x,y)     (!IS_NOT_EQUAL(x,y))
+#endif
+
+/* dummy use of unused parameters to silence compiler warnings */
+#ifndef UNUSED
+#define  UNUSED(x) (void)(x)
+#endif
+
+#define  JP24SET    0xFFFFFF  /* 2**24     (---> 16777215) */
+#define  JP23SET    0x7FFFFF  /* 2**23 - 1 (--->  8388607) */
+
+#define  POW_2_M24  0.000000059604644775390625  /* pow(2.0, -24.0) */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define intpow2(x) (ldexp(1.0, (x)))
+
+static inline int
+gribrec_len(unsigned b1, unsigned b2, unsigned b3)
+{
+  /*
+    If bit 7 of b1 is set, we have to rescale by factor of 120.
+    This is a fixup to get round the restriction on product lengths
+    due to the count being only 24 bits. It is only possible because
+    the (default) rounding for GRIB products is 120 bytes.
+  */
+  const int needRescaling = b1 & (1 << 7);
+
+  int gribsize = (int)((((b1&127) << 16)+(b2<<8) + b3));
+
+  if ( needRescaling ) gribsize *= 120;
+
+  return gribsize;
+
+}
+
+unsigned correct_bdslen(unsigned bdslen, long recsize, long gribpos);
+
+/* CDI converter routines */
+
+/* param format:  DDDCCCNNN */
+
+void    cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis);
+int     cdiEncodeParam(int pnum, int pcat, int pdis);
+
+/* date format:  YYYYMMDD */
+/* time format:  hhmmss   */
+
+void    cdiDecodeDate(int date, int *year, int *month, int *day);
+int     cdiEncodeDate(int year, int month, int day);
+
+void    cdiDecodeTime(int time, int *hour, int *minute, int *second);
+int     cdiEncodeTime(int hour, int minute, int second);
+
+/* CALENDAR types */
+
+#define  CALENDAR_STANDARD        0  /* don't change this value (used also in cgribexlib)! */
+#define  CALENDAR_GREGORIAN       1
+#define  CALENDAR_PROLEPTIC       2
+#define  CALENDAR_360DAYS         3
+#define  CALENDAR_365DAYS         4
+#define  CALENDAR_366DAYS         5
+#define  CALENDAR_NONE            6
+
+extern FILE *grprsm;
+
+extern int  CGRIBEX_Debug, CGRIBEX_Fix_ZSE, CGRIBEX_Const;
+extern int  CGRIBEX_grib_calendar;
+
+void   gprintf(const char *caller, const char *fmt, ...);
+
+void   grsdef(void);
+
+void   prtbin(int kin, int knbit, int *kout, int *kerr);
+void   confp3(double pval, int *kexp, int *kmant, int kbits, int kround);
+double decfp2(int kexp, int kmant);
+void   ref2ibm(double *pref, int kbits);
+
+void   scale_complex_double(double *fpdata, int pcStart, int pcScale, int trunc, int inv);
+void   scale_complex_float(float *fpdata, int pcStart, int pcScale, int trunc, int inv);
+void   scatter_complex_double(double *fpdata, int pcStart, int trunc, int nsp);
+void   scatter_complex_float(float *fpdata, int pcStart, int trunc, int nsp);
+void   gather_complex_double(double *fpdata, size_t pcStart, size_t trunc, size_t nsp);
+void   gather_complex_float(float *fpdata, size_t pcStart, size_t trunc, size_t nsp);
+
+int    qu2reg2(double *pfield, int *kpoint, int klat, int klon,
+	       double *ztemp, double msval, int *kret);
+int    qu2reg3_double(double *pfield, int *kpoint, int klat, int klon,
+		      double msval, int *kret, int omisng, int operio, int oveggy);
+int    qu2reg3_float(float *pfield, int *kpoint, int klat, int klon,
+		     float msval, int *kret, int omisng, int operio, int oveggy);
+
+long   packInt32(uint32_t *up, unsigned char *cp, long bc, long tc);
+long   packInt64(uint64_t *up, unsigned char *cp, long bc, long tc);
+long   unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc);
+long   unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc);
+
+void  grib_encode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3,
+			 double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib,
+			 int kleng, int *kword, int efunc, int *kret);
+void  grib_encode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3,
+			float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib,
+			int kleng, int *kword, int efunc, int *kret);
+
+void  grib_decode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3,
+			 double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib,
+			 int kleng, int *kword, int dfunc, int *kret);
+void  grib_decode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3,
+			float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib,
+			int kleng, int *kword, int dfunc, int *kret);
+
+
+int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp,
+		  unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize);
+int grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp,
+		  unsigned char **lusp, unsigned char **gdsp, unsigned char **pdsp,
+		  unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp);
+
+#ifdef  __cplusplus
+}
+#endif
+
+// clang-format on
+
+#endif /* GRIB_INT_H */
+#ifndef GRIBDECODE_H
+#define GRIBDECODE_H
+
+// clang-format off
+
+#define  UNDEFINED          9.999e20
+
+
+#define  GET_INT3(a,b,c)    ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 16)+(b<<8)+c))
+#define  GET_INT2(a,b)      ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 8) + b))
+#define  GET_INT1(a)        ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (a&127))
+
+/* this requires a 32-bit default integer machine */
+#define  GET_UINT4(a,b,c,d) ((unsigned) ((a << 24) + (b << 16) + (c << 8) + (d)))
+#define  GET_UINT3(a,b,c)   ((unsigned) ((a << 16) + (b << 8)  + (c)))
+#define  GET_UINT2(a,b)     ((unsigned) ((a << 8)  + (b)))
+#define  GET_UINT1(a)       ((unsigned)  (a))
+
+#define  BUDG_START(s)      (s[0]=='B' && s[1]=='U' && s[2]=='D' && s[3]=='G')
+#define  TIDE_START(s)      (s[0]=='T' && s[1]=='I' && s[2]=='D' && s[3]=='E')
+#define  GRIB_START(s)      (s[0]=='G' && s[1]=='R' && s[2]=='I' && s[3]=='B')
+#define  GRIB_FIN(s)        (s[0]=='7' && s[1]=='7' && s[2]=='7' && s[3]=='7')
+
+/* GRIB1 Section 0: Indicator Section (IS) */
+
+#define  GRIB1_SECLEN(s)     GET_UINT3(s[ 4], s[ 5], s[ 6])
+#define  GRIB_EDITION(s)     GET_UINT1(s[ 7])
+
+/* GRIB1 Section 1: Product Definition Section (PDS) */
+
+#define  PDS_Len             GET_UINT3(pds[ 0], pds[ 1], pds[ 2])
+#define  PDS_CodeTable       GET_UINT1(pds[ 3])
+#define  PDS_CenterID        GET_UINT1(pds[ 4])
+#define  PDS_ModelID         GET_UINT1(pds[ 5])
+#define  PDS_GridDefinition  GET_UINT1(pds[ 6])
+#define  PDS_Sec2Or3Flag     GET_UINT1(pds[ 7])
+#define  PDS_HAS_GDS         ((pds[7] & 128) != 0)
+#define  PDS_HAS_BMS         ((pds[7] &  64) != 0)
+#define  PDS_Parameter       GET_UINT1(pds[ 8])
+#define  PDS_LevelType       GET_UINT1(pds[ 9])
+#define  PDS_Level1          (pds[10])
+#define  PDS_Level2	     (pds[11])
+#define  PDS_Level	     GET_UINT2(pds[10], pds[11])
+#define  PDS_Year            GET_INT1(pds[12])
+#define  PDS_Month           GET_UINT1(pds[13])
+#define  PDS_Day             GET_UINT1(pds[14])
+#define  PDS_Hour            GET_UINT1(pds[15])
+#define  PDS_Minute          GET_UINT1(pds[16])
+#define  PDS_Date            (PDS_Year*10000+PDS_Month*100+PDS_Day)
+#define  PDS_Time            (PDS_Hour*100+PDS_Minute)
+#define  PDS_TimeUnit        GET_UINT1(pds[17])
+#define  PDS_TimePeriod1     GET_UINT1(pds[18])
+#define  PDS_TimePeriod2     GET_UINT1(pds[19])
+#define  PDS_TimeRange       GET_UINT1(pds[20])
+#define  PDS_AvgNum          GET_UINT2(pds[21], pds[22])
+#define  PDS_AvgMiss         GET_UINT1(pds[23])
+#define  PDS_Century         GET_UINT1(pds[24])
+#define  PDS_Subcenter       GET_UINT1(pds[25])
+#define  PDS_DecimalScale    GET_INT2(pds[26],pds[27])
+
+
+/* GRIB1 Section 2: Grid Description Section (GDS) */
+
+#define  GDS_Len             ((gds) == NULL ? 0 : GET_UINT3(gds[0], gds[1], gds[2]))
+#define  GDS_NV              GET_UINT1(gds[ 3])
+#define  GDS_PVPL            GET_UINT1(gds[ 4])
+#define  GDS_PV	             ((gds[3] ==    0) ? -1 : (int) gds[4] - 1)
+#define  GDS_PL	             ((gds[4] == 0xFF) ? -1 : (int) gds[3] * 4 + (int) gds[4] - 1)
+#define  GDS_GridType        GET_UINT1(gds[ 5])
+
+
+/* GRIB1 Triangular grid of DWD */
+#define  GDS_GME_NI2         GET_UINT2(gds[ 6], gds[ 7])
+#define  GDS_GME_NI3         GET_UINT2(gds[ 8], gds[ 9])
+#define  GDS_GME_ND          GET_UINT3(gds[10], gds[11], gds[12])
+#define  GDS_GME_NI          GET_UINT3(gds[13], gds[14], gds[15])
+#define  GDS_GME_AFlag       GET_UINT1(gds[16])
+#define  GDS_GME_LatPP       GET_INT3(gds[17], gds[18], gds[19])
+#define  GDS_GME_LonPP       GET_INT3(gds[20], gds[21], gds[22])
+#define  GDS_GME_LonMPL      GET_INT3(gds[23], gds[24], gds[25])
+#define  GDS_GME_BFlag       GET_UINT1(gds[27])
+
+/* GRIB1 Spectral */
+#define  GDS_PentaJ          GET_UINT2(gds[ 6], gds[ 7])
+#define  GDS_PentaK          GET_UINT2(gds[ 8], gds[ 9])
+#define  GDS_PentaM          GET_UINT2(gds[10], gds[11])
+#define  GDS_RepType         GET_UINT1(gds[12])
+#define  GDS_RepMode         GET_UINT1(gds[13])
+
+/* GRIB1 Regular grid */
+#define  GDS_NumLon          GET_UINT2(gds[ 6], gds[ 7])
+#define  GDS_NumLat          GET_UINT2(gds[ 8], gds[ 9])
+#define  GDS_FirstLat        GET_INT3(gds[10], gds[11], gds[12])
+#define  GDS_FirstLon        GET_INT3(gds[13], gds[14], gds[15])
+#define  GDS_ResFlag         GET_UINT1(gds[16])
+#define  GDS_LastLat         GET_INT3(gds[17], gds[18], gds[19])
+#define  GDS_LastLon         GET_INT3(gds[20], gds[21], gds[22])
+#define  GDS_LonIncr         GET_UINT2(gds[23], gds[24])
+#define  GDS_LatIncr         GET_UINT2(gds[25], gds[26])
+#define  GDS_NumPar          GET_UINT2(gds[25], gds[26])
+#define  GDS_ScanFlag        GET_UINT1(gds[27])
+#define  GDS_LatSP           GET_INT3(gds[32], gds[33], gds[34])
+#define  GDS_LonSP           GET_INT3(gds[35], gds[36], gds[37])
+#define  GDS_RotAngle        (GET_Real(&(gds[38])))
+
+/* GRIB1 Lambert */
+#define  GDS_Lambert_Lov     GET_INT3(gds[17], gds[18], gds[19])
+#define  GDS_Lambert_dx	     GET_INT3(gds[20], gds[21], gds[22])
+#define  GDS_Lambert_dy	     GET_INT3(gds[23], gds[24], gds[25])
+#define  GDS_Lambert_ProjFlag GET_UINT1(gds[26])
+#define  GDS_Lambert_LatS1   GET_INT3(gds[28], gds[29], gds[30])
+#define  GDS_Lambert_LatS2   GET_INT3(gds[31], gds[32], gds[33])
+#define  GDS_Lambert_LatSP   GET_INT3(gds[34], gds[35], gds[36])
+#define  GDS_Lambert_LonSP   GET_INT3(gds[37], gds[37], gds[37])
+
+/* GRIB1 Section 3: Bit Map Section (BMS) */
+
+#define  BMS_Len	     ((bms) == NULL ? 0 : GET_UINT3(bms[0], bms[1], bms[2]))
+#define  BMS_UnusedBits      (bms[3])
+#define  BMS_Bitmap	     ((bms) == NULL ? NULL : (bms)+6)
+#define  BMS_BitmapSize      (((((bms[0]<<16)+(bms[1]<<8)+bms[2]) - 6)<<3) - bms[3])
+
+/* GRIB1 Section 4: Binary Data Section (BDS) */
+
+#define  BDS_Len	    GET_UINT3(bds[0], bds[1], bds[2])
+#define  BDS_Flag	    (bds[3])
+#define  BDS_BinScale       GET_INT2(bds[ 4], bds[ 5])
+#define  BDS_RefValue       (decfp2((int)bds[ 6], (int)(GET_UINT3(bds[7], bds[8], bds[9]))))
+#define  BDS_NumBits        ((int) bds[10])
+#define  BDS_RealCoef       (decfp2((int)bds[zoff+11], (int)(GET_UINT3(bds[zoff+12], bds[zoff+13], bds[zoff+14]))))
+#define  BDS_PackData       ((int) ((bds[zoff+11]<<8) + bds[zoff+12]))
+#define  BDS_Power          GET_INT2(bds[zoff+13], bds[zoff+14])
+#define  BDS_Z              (bds[13])
+
+/* GRIB1 Section 5: End Section (ES) */
+
+/* GRIB2 */
+
+#define  GRIB2_SECLEN(section)   (GET_UINT4(section[0], section[1], section[2], section[3]))
+#define  GRIB2_SECNUM(section)   (GET_UINT1(section[4]))
+
+// clang-format on
+
+#endif /* GRIBDECODE_H */
+#ifndef CGRIBEX_GRIB_ENCODE_H
+#define CGRIBEX_GRIB_ENCODE_H
+
+#include <limits.h>
+
+// clang-format off
+
+#define PutnZero(n) \
+{ \
+  for ( size_t i___ = z >= 0 ? (size_t)z : 0; i___ < (size_t)(z+n); i___++ ) lGrib[i___] = 0; \
+  z += n; \
+}
+
+#define Put1Byte(Value)  (lGrib[z++] = (GRIBPACK)(Value))
+#define Put2Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >>  8)),      \
+                         (lGrib[z++] = (GRIBPACK)(Value)))
+#define Put3Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 16)),      \
+                         (lGrib[z++] = (GRIBPACK)((Value) >>  8)),      \
+                         (lGrib[z++] = (GRIBPACK)(Value)))
+#define Put4Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 24)),      \
+                         (lGrib[z++] = (GRIBPACK)((Value) >> 16)),      \
+                         (lGrib[z++] = (GRIBPACK)((Value) >>  8)),      \
+                         (lGrib[z++] = (GRIBPACK)(Value)))
+
+#define Put1Int(Value)  {ival = Value; if ( ival < 0 ) ival =     0x80 - ival; Put1Byte(ival);}
+#define Put2Int(Value)  {ival = Value; if ( ival < 0 ) ival =   0x8000 - ival; Put2Byte(ival);}
+#define Put3Int(Value)  {ival = Value; if ( ival < 0 ) ival = 0x800000 - ival; Put3Byte(ival);}
+
+enum {
+  BitsPerInt = (int) (sizeof(int) * CHAR_BIT),
+};
+
+
+#define Put1Real(Value)          \
+{                                \
+  confp3(Value, &exponent, &mantissa, BitsPerInt, 1); \
+  Put1Byte(exponent);            \
+  Put3Byte(mantissa);            \
+}
+
+// clang-format on
+
+#endif /* CGRIBEX_GRIB_ENCODE_H */
+#ifndef CODEC_COMMON_H
+#define CODEC_COMMON_H
+#define gribSwapByteOrder_uint16(ui16) ((uint16_t) ((ui16 << 8) | (ui16 >> 8)))
+#endif /* CODEC_COMMON_H */
+/*
+icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -qopenmp -DOMP_SIMD minmax_val.c
+ result on hama2 (icc 16.0.0):
+     float:
+minmax_val: fmin: -500000  fmax: 499999  time:   1.22s
+simd      : fmin: -500000  fmax: 499999  time:   1.20s
+    double:
+minmax_val: fmin: -500000  fmax: 499999  time:   2.86s
+orig      : fmin: -500000  fmax: 499999  time:   2.74s
+simd      : fmin: -500000  fmax: 499999  time:   2.70s
+avx       : fmin: -500000  fmax: 499999  time:   2.99s
+
+gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c
+ result on thunder5 (gcc 6.1.0):
+float:
+minmax_val: fmin: -500000  fmax: 499999  time:   8.25s
+  simd    : fmin: -500000  fmax: 499999  time:   1.24s
+double:
+minmax_val: fmin: -500000  fmax: 499999  time:   2.73s
+  orig    : fmin: -500000  fmax: 499999  time:   9.24s
+  simd    : fmin: -500000  fmax: 499999  time:   2.78s
+  avx     : fmin: -500000  fmax: 499999  time:   2.90s
+
+gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL minmax_val.c
+ result on bailung (gcc 4.8.2):
+  orig    : fmin: -500000  fmax: 499999  time:   4.82s
+  sse2    : fmin: -500000  fmax: 499999  time:   4.83s
+
+gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c
+ result on thunder5 (gcc 4.8.2):
+  orig    : fmin: -500000  fmax: 499999  time:   3.10s
+  simd    : fmin: -500000  fmax: 499999  time:   3.10s # omp simd in gcc 4.9
+  avx     : fmin: -500000  fmax: 499999  time:   2.84s
+
+icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -openmp -DOMP_SIMD minmax_val.c
+ result on thunder5 (icc 14.0.2):
+  orig    : fmin: -500000  fmax: 499999  time:   2.83s
+  simd    : fmin: -500000  fmax: 499999  time:   2.83s
+  avx     : fmin: -500000  fmax: 499999  time:   2.92s
+
+xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_MINMAXVAL minmax_val.c
+ result on blizzard (xlc 12):
+  orig    : fmin: -500000  fmax: 499999  time:   7.26s
+  pwr6u6  : fmin: -500000  fmax: 499999  time:   5.92s
+*/
+#ifdef _ARCH_PWR6
+#pragma options nostrict
+#endif
+
+#ifdef OMP_SIMD
+#include <omp.h>
+#endif
+
+#include <stdlib.h>
+
+//#undef _GET_X86_COUNTER
+//#undef _GET_IBM_COUNTER
+//#undef _GET_MACH_COUNTER
+//#undef _ARCH_PWR6
+
+#if defined(_GET_IBM_COUNTER)
+#include <libhpc.h>
+#elif defined(_GET_X86_COUNTER)
+#include <x86intrin.h>
+#elif defined(_GET_MACH_COUNTER)
+#include <mach/mach_time.h>
+#endif
+
+#if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__)
+#if (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 4)
+#define GNUC_PUSH_POP
+#endif
+#endif
+
+#ifndef DISABLE_SIMD
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#elif defined(__ICC) && (__ICC >= 1100)
+#elif defined(__clang__)
+#else
+#define DISABLE_SIMD
+#endif
+#endif
+
+#ifdef DISABLE_SIMD
+#define DISABLE_SIMD_MINMAXVAL
+#endif
+
+#ifndef TEST_MINMAXVAL
+#define DISABLE_SIMD_MINMAXVAL
+#endif
+
+#ifdef DISABLE_SIMD_MINMAXVAL
+#ifdef ENABLE_AVX
+#define _ENABLE_AVX
+#endif
+#ifdef ENABLE_SSE2
+#define _ENABLE_SSE2
+#endif
+#endif
+
+#ifndef DISABLE_SIMD_MINMAXVAL
+#ifdef __AVX__
+#define _ENABLE_AVX
+#endif
+#ifdef __SSE2__
+#define _ENABLE_SSE2
+#endif
+#endif
+
+#include <float.h>
+#include <stdint.h>
+#include <inttypes.h>
+
+#if defined(_ENABLE_AVX)
+#include <immintrin.h>
+#elif defined(_ENABLE_SSE2)
+#include <emmintrin.h>
+#endif
+
+#if defined(_ENABLE_AVX)
+
+static void
+avx_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max)
+{
+  double fmin[4], fmax[4];
+  __m256d current_max, current_min, work;
+
+  // load max and min values into all four slots of the YMM registers
+  current_min = _mm256_set1_pd(*min);
+  current_max = _mm256_set1_pd(*max);
+
+  // Work input until "buf" reaches 32 byte alignment
+  while (((unsigned long) buf) % 32 != 0 && nframes > 0)
+    {
+
+      // Load the next double into the work buffer
+      work = _mm256_set1_pd(*buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf++;
+      nframes--;
+    }
+
+  while (nframes >= 16)
+    {
+
+      (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA);
+
+      work = _mm256_load_pd(buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf += 4;
+
+      work = _mm256_load_pd(buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf += 4;
+
+      (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA);
+
+      work = _mm256_load_pd(buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf += 4;
+
+      work = _mm256_load_pd(buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf += 4;
+      nframes -= 16;
+    }
+
+  // work through aligned buffers
+  while (nframes >= 4)
+    {
+      work = _mm256_load_pd(buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf += 4;
+      nframes -= 4;
+    }
+
+  // work through the remainung values
+  while (nframes > 0)
+    {
+      work = _mm256_set1_pd(*buf);
+      current_min = _mm256_min_pd(current_min, work);
+      current_max = _mm256_max_pd(current_max, work);
+      buf++;
+      nframes--;
+    }
+
+  // find min & max value through shuffle tricks
+
+  work = current_min;
+  work = _mm256_shuffle_pd(work, work, 5);
+  work = _mm256_min_pd(work, current_min);
+  current_min = work;
+  work = _mm256_permute2f128_pd(work, work, 1);
+  work = _mm256_min_pd(work, current_min);
+  _mm256_storeu_pd(fmin, work);
+
+  work = current_max;
+  work = current_max;
+  work = _mm256_shuffle_pd(work, work, 5);
+  work = _mm256_max_pd(work, current_max);
+  current_max = work;
+  work = _mm256_permute2f128_pd(work, work, 1);
+  work = _mm256_max_pd(work, current_max);
+  _mm256_storeu_pd(fmax, work);
+
+  *min = fmin[0];
+  *max = fmax[0];
+
+  return;
+}
+
+#elif defined(_ENABLE_SSE2)
+
+static void
+sse2_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max)
+{
+  __m128d current_max, current_min, work;
+
+  // load starting max and min values into all slots of the XMM registers
+  current_min = _mm_set1_pd(*min);
+  current_max = _mm_set1_pd(*max);
+
+  // work on input until buf reaches 16 byte alignment
+  while (((unsigned long) buf) % 16 != 0 && nframes > 0)
+    {
+
+      // load one double and replicate
+      work = _mm_set1_pd(*buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf++;
+      nframes--;
+    }
+
+  while (nframes >= 8)
+    {
+      // use 64 byte prefetch for double octetts
+      // __builtin_prefetch(buf+64,0,0); // for GCC 4.3.2 +
+
+      work = _mm_load_pd(buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf += 2;
+      work = _mm_load_pd(buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf += 2;
+      work = _mm_load_pd(buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf += 2;
+      work = _mm_load_pd(buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf += 2;
+      nframes -= 8;
+    }
+
+  // work through smaller chunks of aligned buffers without prefetching
+  while (nframes >= 2)
+    {
+      work = _mm_load_pd(buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf += 2;
+      nframes -= 2;
+    }
+
+  // work through the remaining value
+  while (nframes > 0)
+    {
+      // load the last double and replicate
+      work = _mm_set1_pd(*buf);
+      current_min = _mm_min_pd(current_min, work);
+      current_max = _mm_max_pd(current_max, work);
+      buf++;
+      nframes--;
+    }
+
+  // find final min and max value through shuffle tricks
+  work = current_min;
+  work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1));
+  work = _mm_min_pd(work, current_min);
+  _mm_store_sd(min, work);
+  work = current_max;
+  work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1));
+  work = _mm_max_pd(work, current_max);
+  _mm_store_sd(max, work);
+
+  return;
+}
+
+#endif  // SIMD
+
+#if defined(_ARCH_PWR6)
+static void
+pwr6_minmax_val_double_unrolled6(const double *restrict data, size_t datasize, double *fmin, double *fmax)
+{
+#define __UNROLL_DEPTH_1 6
+
+  // to allow pipelining we have to unroll
+
+  {
+    size_t residual = datasize % __UNROLL_DEPTH_1;
+    size_t ofs = datasize - residual;
+    double dmin[__UNROLL_DEPTH_1];
+    double dmax[__UNROLL_DEPTH_1];
+
+    for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j)
+      {
+        dmin[j] = data[0];
+        dmax[j] = data[0];
+      }
+
+    for (size_t i = 0; i < datasize - residual; i += __UNROLL_DEPTH_1)
+      {
+        for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j)
+          {
+            dmin[j] = __fsel(dmin[j] - data[i + j], data[i + j], dmin[j]);
+            dmax[j] = __fsel(data[i + j] - dmax[j], data[i + j], dmax[j]);
+          }
+      }
+
+    for (size_t j = 0; j < residual; ++j)
+      {
+        dmin[j] = __fsel(dmin[j] - data[ofs + j], data[ofs + j], dmin[j]);
+        dmax[j] = __fsel(data[ofs + j] - dmax[j], data[ofs + j], dmax[j]);
+      }
+
+    for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j)
+      {
+        *fmin = __fsel(*fmin - dmin[j], dmin[j], *fmin);
+        *fmax = __fsel(dmax[j] - *fmax, dmax[j], *fmax);
+      }
+  }
+#undef __UNROLL_DEPTH_1
+}
+#endif
+
+// clang-format off
+#if defined(TEST_MINMAXVAL) && defined(__GNUC__)
+static void minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline));
+static void minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline));
+static void minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline));
+static void minmax_val_float(const float *restrict data, long datasize, float *fmin, float *fmax) __attribute__((noinline));
+static void minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax) __attribute__((noinline));
+#endif
+// clang-format on
+
+#if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__
+#pragma GCC push_options
+#pragma GCC optimize("O3", "fast-math")
+#endif
+static void
+minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax)
+{
+  double dmin = *fmin, dmax = *fmax;
+
+#if defined(CRAY)
+#pragma _CRI ivdep
+#elif defined(SX)
+#pragma vdir nodep
+#elif defined(__uxp__)
+#pragma loop novrec
+#elif defined(__ICC)
+#pragma ivdep
+#endif
+  for (size_t i = 0; i < datasize; ++i)
+    {
+      dmin = (dmin < data[i]) ? dmin : data[i];
+      dmax = (dmax > data[i]) ? dmax : data[i];
+    }
+
+  *fmin = dmin;
+  *fmax = dmax;
+}
+
+static void
+minmax_val_float(const float *restrict data, long idatasize, float *fmin, float *fmax)
+{
+  size_t datasize = (size_t) idatasize;
+  float dmin = *fmin, dmax = *fmax;
+
+#if defined(CRAY)
+#pragma _CRI ivdep
+#elif defined(SX)
+#pragma vdir nodep
+#elif defined(__uxp__)
+#pragma loop novrec
+#elif defined(__ICC)
+#pragma ivdep
+#endif
+  for (size_t i = 0; i < datasize; ++i)
+    {
+      dmin = (dmin < data[i]) ? dmin : data[i];
+      dmax = (dmax > data[i]) ? dmax : data[i];
+    }
+
+  *fmin = dmin;
+  *fmax = dmax;
+}
+#if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__
+#pragma GCC pop_options
+#endif
+
+// TEST
+#if defined(OMP_SIMD)
+
+#if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__
+#pragma GCC push_options
+#pragma GCC optimize("O3", "fast-math")
+#endif
+static void
+minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax)
+{
+  double dmin = *fmin, dmax = *fmax;
+
+#if defined(_OPENMP)
+#pragma omp parallel for simd reduction(min : dmin) reduction(max : dmax)
+#endif
+  for (size_t i = 0; i < datasize; ++i)
+    {
+      dmin = (dmin < data[i]) ? dmin : data[i];
+      dmax = (dmax > data[i]) ? dmax : data[i];
+    }
+
+  *fmin = dmin;
+  *fmax = dmax;
+}
+
+static void
+minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax)
+{
+  double dmin = *fmin, dmax = *fmax;
+
+#ifdef _OPENMP
+#pragma omp simd reduction(min : dmin) reduction(max : dmax)
+#endif
+  for (size_t i = 0; i < datasize; ++i)
+    {
+      dmin = (dmin < data[i]) ? dmin : data[i];
+      dmax = (dmax > data[i]) ? dmax : data[i];
+    }
+
+  *fmin = dmin;
+  *fmax = dmax;
+}
+
+static void
+minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax)
+{
+  float dmin = *fmin, dmax = *fmax;
+
+#if defined(_OPENMP)
+#pragma omp simd reduction(min : dmin) reduction(max : dmax)
+#endif
+  for (size_t i = 0; i < datasize; ++i)
+    {
+      dmin = (dmin < data[i]) ? dmin : data[i];
+      dmax = (dmax > data[i]) ? dmax : data[i];
+    }
+
+  *fmin = dmin;
+  *fmax = dmax;
+}
+#if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__
+#pragma GCC pop_options
+#endif
+#endif
+
+static void
+minmax_val_double(const double *restrict data, long idatasize, double *fmin, double *fmax)
+{
+#if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER)
+  uint64_t start_minmax, end_minmax;
+#endif
+  size_t datasize = (size_t) idatasize;
+
+  if (idatasize >= 1)
+    ;
+  else
+    return;
+
+#if defined(_GET_X86_COUNTER)
+  start_minmax = _rdtsc();
+#endif
+#if defined(_GET_MACH_COUNTER)
+  start_minmax = mach_absolute_time();
+#endif
+
+#if defined(_ENABLE_AVX)
+
+  avx_minmax_val_double(data, datasize, fmin, fmax);
+
+#elif defined(_ENABLE_SSE2)
+
+  sse2_minmax_val_double(data, datasize, fmin, fmax);
+
+#else
+
+#if defined(_ARCH_PWR6)
+#define __UNROLL_DEPTH_1 6
+
+    // to allow pipelining we have to unroll
+
+#if defined(_GET_IBM_COUNTER)
+  hpmStart(1, "minmax fsel");
+#endif
+
+  pwr6_minmax_val_double_unrolled6(data, datasize, fmin, fmax);
+
+#if defined(_GET_IBM_COUNTER)
+  hpmStop(1);
+#endif
+
+#undef __UNROLL_DEPTH_1
+
+#else  // original loop
+
+#if defined(_GET_IBM_COUNTER)
+  hpmStart(1, "minmax base");
+#endif
+
+  minmax_val_double_orig(data, datasize, fmin, fmax);
+
+#if defined(_GET_IBM_COUNTER)
+  hpmStop(1);
+#endif
+
+#endif  // _ARCH_PWR6 && original loop
+#endif  // SIMD
+
+#if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER)
+#if defined(_GET_X86_COUNTER)
+  end_minmax = _rdtsc();
+#endif
+#if defined(_GET_MACH_COUNTER)
+  end_minmax = mach_absolute_time();
+#endif
+#if defined(_ENABLE_AVX)
+  printf("AVX minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax);
+  fprintf(stderr, "AVX min: %lf max: %lf\n", *fmin, *fmax);
+#elif defined(_ENABLE_SSE2)
+  printf("SSE2 minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax);
+  fprintf(stderr, "SSE2 min: %lf max: %lf\n", *fmin, *fmax);
+#else
+  printf("loop minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax);
+  fprintf(stderr, "loop min: %lf max: %lf\n", *fmin, *fmax);
+#endif
+#endif
+
+  return;
+}
+
+#if defined(TEST_MINMAXVAL)
+
+#include <stdio.h>
+#include <sys/time.h>
+
+static double
+dtime()
+{
+  double tseconds = 0.0;
+  struct timeval mytime;
+  gettimeofday(&mytime, NULL);
+  tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6);
+  return (tseconds);
+}
+
+#define NRUN 10000
+
+int
+main(void)
+{
+  long datasize = 1000000;
+  double t_begin, t_end;
+
+  printf("datasize %ld\n", datasize);
+#if defined(_OPENMP)
+  printf("_OPENMP=%d\n", _OPENMP);
+#endif
+
+#if defined(__ICC)
+  printf("icc\n");
+#elif defined(__clang__)
+  printf("clang\n");
+#elif defined(__GNUC__)
+  printf("gcc\n");
+#endif
+
+  {
+    float fmin, fmax;
+    float *data_sp = (float *) malloc(datasize * sizeof(float));
+
+    for (long i = 0; i < datasize / 2; ++i) data_sp[i] = (float) (i);
+    for (long i = datasize / 2; i < datasize; ++i) data_sp[i] = (float) (-datasize + i);
+
+    printf("float:\n");
+
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_sp[0];
+        minmax_val_float(data_sp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("minmax_val: fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+
+#if defined(OMP_SIMD)
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_sp[0];
+        minmax_val_float_simd(data_sp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("simd      : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+#endif
+
+    free(data_sp);
+  }
+
+  {
+    double fmin, fmax;
+    double *data_dp = (double *) malloc(datasize * sizeof(double));
+
+    // for (long i = datasize-1; i >= 0; --i) data[i] = (double) (-datasize/2 + i);
+    for (long i = 0; i < datasize / 2; ++i) data_dp[i] = (double) (i);
+    for (long i = datasize / 2; i < datasize; ++i) data_dp[i] = (double) (-datasize + i);
+
+    printf("double:\n");
+
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        minmax_val_double(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("minmax_val: fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        minmax_val_double_orig(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("orig      : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+
+#if defined(OMP_SIMD)
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        minmax_val_double_simd(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("simd      : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        minmax_val_double_omp(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("openmp %d  : fmin: %ld  fmax: %ld  time: %6.2fs\n", omp_get_max_threads(), (long) fmin, (long) fmax, t_end - t_begin);
+#endif
+
+#if defined(_ENABLE_AVX)
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        avx_minmax_val_double(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("avx       : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+#elif defined(_ENABLE_SSE2)
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        sse2_minmax_val_double(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("sse2      : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+#endif
+#if defined(_ARCH_PWR6)
+    t_begin = dtime();
+    for (int i = 0; i < NRUN; ++i)
+      {
+        fmin = fmax = data_dp[0];
+        pwr6_minmax_val_double_unrolled6(data_dp, datasize, &fmin, &fmax);
+      }
+    t_end = dtime();
+    printf("pwr6u6  : fmin: %ld  fmax: %ld  time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin);
+#endif
+    free(data_dp);
+  }
+
+  return 0;
+}
+#endif  // TEST_MINMAXVAL
+
+#undef DISABLE_SIMD_MINMAXVAL
+#undef _ENABLE_AVX
+#undef _ENABLE_SSE2
+#undef GNUC_PUSH_POP
+/*
+### new version with gribSwapByteOrder_uint16()
+icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c
+ result on hama2 (icc 16.0.2):
+   float:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 1.8731s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 2.0898s
+  double:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 3.68089s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 4.30798s
+     avx: val1: 1  val2: 1  val3: 2  valn: 66  time: 4.23864s
+
+gcc -g -Wall -O3 -march=native -Wa,-q -std=c99 -DTEST_ENCODE encode_array.c
+ result on hama2 (gcc 6.1.0):
+float:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 2.22871s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 2.30281s
+double:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 4.2669s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 4.81643s
+     avx: val1: 1  val2: 1  val3: 2  valn: 66  time: 3.98415s
+
+###
+icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c
+ result on hama2 (icc 16.0.0):
+   float:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 9.10691s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 8.63584s
+  double:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 13.5768s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 9.17742s
+     avx: val1: 1  val2: 1  val3: 2  valn: 66  time: 3.9488s
+
+gcc -g -Wall -O3 -std=c99 -DTEST_ENCODE encode_array.c
+ result on hama2 (gcc 5.2.0):
+   float:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 5.32775s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 7.87125s
+  double:
+    orig: val1: 1  val2: 1  val3: 2  valn: 66  time: 7.85873s
+unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time: 12.9979s
+
+###
+gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c
+ result on bailung (gcc 4.7):
+  orig    : val1: 1  val2: 1  val3: 2  valn: 66  time: 8.4166s
+  sse41   : val1: 1  val2: 1  val3: 2  valn: 66  time: 7.1522s
+
+gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c
+ result on thunder5 (gcc 4.7):
+  orig    : val1: 1  val2: 1  val3: 2  valn: 66  time: 6.21976s
+  avx     : val1: 1  val2: 1  val3: 2  valn: 66  time: 4.54485s
+
+icc -g -Wall -O3 -march=native -std=c99 -vec-report=1 -DTEST_ENCODE encode_array.c
+ result on thunder5 (icc 13.2):
+  orig    : val1: 1  val2: 1  val3: 2  valn: 66  time: 14.6279s
+  avx     : val1: 1  val2: 1  val3: 2  valn: 66  time:  4.9776s
+
+xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_ENCODE encode_array.c
+ result on blizzard (xlc 12):
+  orig    : val1: 1  val2: 1  val3: 2  valn: 66  time: 132.25s
+  unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time:  27.202s
+  orig    : val1: 1  val2: 1  val3: 2  valn: 66  time: 106.627s  // without -qhot
+  unrolled: val1: 1  val2: 1  val3: 2  valn: 66  time:  39.929s  // without -qhot
+*/
+#ifdef _ARCH_PWR6
+#pragma options nostrict
+#endif
+
+#ifdef TEST_ENCODE
+#include <stdio.h>
+#include <stdlib.h>
+#define GRIBPACK unsigned char
+
+#ifndef HOST_ENDIANNESS
+#define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0])
+#endif
+
+#define IS_BIGENDIAN() (HOST_ENDIANNESS == 0)
+#define Error(x, y)
+#endif
+
+//#undef _GET_X86_COUNTER
+//#undef _GET_MACH_COUNTER
+//#undef _GET_IBM_COUNTER
+//#undef _ARCH_PWR6
+
+#if defined _GET_IBM_COUNTER
+#include <libhpc.h>
+#elif defined _GET_X86_COUNTER
+#include <x86intrin.h>
+#elif defined _GET_MACH_COUNTER
+#include <mach/mach_time.h>
+#endif
+
+#include <stdint.h>
+#include <math.h>
+
+#ifndef DISABLE_SIMD
+#if defined(__GNUC__) && (__GNUC__ >= 4)
+#elif defined(__ICC) && (__ICC >= 1100)
+#elif defined(__clang__)
+#else
+#define DISABLE_SIMD
+#endif
+#endif
+
+#ifdef DISABLE_SIMD
+#define DISABLE_SIMD_ENCODE
+#endif
+
+//#define DISABLE_SIMD_ENCODE
+
+#ifdef DISABLE_SIMD_ENCODE
+#ifdef ENABLE_AVX
+#define _ENABLE_AVX
+#endif
+#ifdef ENABLE_SSE4_1
+#define _ENABLE_SSE4_1
+#endif
+#endif
+
+#ifndef DISABLE_SIMD_ENCODE
+#ifdef __AVX__
+#define _ENABLE_AVX
+#endif
+#ifdef __SSE4_1__
+#define _ENABLE_SSE4_1
+#endif
+#endif
+
+#if defined _ENABLE_AVX
+#include <immintrin.h>
+#elif defined _ENABLE_SSE4_1
+#include <smmintrin.h>
+#endif
+
+#if defined _ENABLE_AVX
+
+static void avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref,
+                                          double factor, size_t *gz) __attribute__((optimize(2)));
+static void
+avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref,
+                              double factor, size_t *gz)
+{
+  const double *dval = data;
+  __m128i *sgrib = (__m128i *) (lGrib + (*gz));
+
+  const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
+
+  const __m256d c0 = _mm256_set1_pd(zref);
+  const __m256d c1 = _mm256_set1_pd(factor);
+  const __m256d c2 = _mm256_set1_pd(0.5);
+
+  __m256d d0, d3, d2, d1;
+  __m128i i0, i1, i2, i3;
+  __m128i s0, s1;
+
+  size_t residual = datasize % 16;
+
+  size_t i;
+  for (i = 0; i < (datasize - residual); i += 16)
+    {
+      (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA);
+      //_____________________________________________________________________________
+
+      d0 = _mm256_loadu_pd(dval);
+      d0 = _mm256_sub_pd(d0, c0);
+      d0 = _mm256_mul_pd(d0, c1);
+      d0 = _mm256_add_pd(d0, c2);
+
+      i0 = _mm256_cvttpd_epi32(d0);
+
+      //_____________________________________________________________________________
+
+      d1 = _mm256_loadu_pd(dval + 4);
+      d1 = _mm256_sub_pd(d1, c0);
+      d1 = _mm256_mul_pd(d1, c1);
+      d1 = _mm256_add_pd(d1, c2);
+
+      i1 = _mm256_cvttpd_epi32(d1);
+
+      //_____________________________________________________________________________
+
+      s0 = _mm_packus_epi32(i0, i1);
+      s0 = _mm_shuffle_epi8(s0, swap);
+      (void) _mm_storeu_si128(sgrib, s0);
+
+      //_____________________________________________________________________________
+
+      (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA);
+
+      //_____________________________________________________________________________
+
+      d2 = _mm256_loadu_pd(dval + 8);
+      d2 = _mm256_sub_pd(d2, c0);
+      d2 = _mm256_mul_pd(d2, c1);
+      d2 = _mm256_add_pd(d2, c2);
+
+      i2 = _mm256_cvttpd_epi32(d2);
+
+      //_____________________________________________________________________________
+
+      d3 = _mm256_loadu_pd(dval + 12);
+      d3 = _mm256_sub_pd(d3, c0);
+      d3 = _mm256_mul_pd(d3, c1);
+      d3 = _mm256_add_pd(d3, c2);
+
+      i3 = _mm256_cvttpd_epi32(d3);
+
+      //_____________________________________________________________________________
+
+      s1 = _mm_packus_epi32(i2, i3);
+      s1 = _mm_shuffle_epi8(s1, swap);
+      (void) _mm_storeu_si128(sgrib + 1, s1);
+
+      //_____________________________________________________________________________
+
+      dval += 16;
+      sgrib += 2;
+    }
+
+  if (i != datasize)
+    {
+      uint16_t ui16;
+      for (size_t j = i; j < datasize; ++j)
+        {
+          ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5);
+          lGrib[*gz + 2 * j] = ui16 >> 8;
+          lGrib[*gz + 2 * j + 1] = ui16;
+        }
+    }
+
+  *gz += 2 * datasize;
+
+  return;
+}
+
+#define grib_encode_array_2byte_double avx_encode_array_2byte_double
+
+#elif defined _ENABLE_SSE4_1
+
+static void
+sse41_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref,
+                                double factor, size_t *gz)
+{
+  const double *dval = data;
+  __m128i *sgrib = (__m128i *) (lGrib + (*gz));
+
+  const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1);
+
+  const __m128d c0 = _mm_set1_pd(zref);
+  const __m128d c1 = _mm_set1_pd(factor);
+  const __m128d c2 = _mm_set1_pd(0.5);
+
+  __m128d d0, d4, d3, d2, d1;
+  __m128i i0, i1, i2, i3, i4;
+  __m128i s0, s1;
+
+  size_t residual = datasize % 16;
+
+  size_t i;
+  for (i = 0; i < (datasize - residual); i += 16)
+    {
+      (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA);
+      //_____________________________________________________________________________
+
+      d0 = _mm_loadu_pd(dval);
+      d0 = _mm_sub_pd(d0, c0);
+      d0 = _mm_mul_pd(d0, c1);
+      d0 = _mm_add_pd(d0, c2);
+
+      d4 = _mm_loadu_pd(dval + 2);
+      d4 = _mm_sub_pd(d4, c0);
+      d4 = _mm_mul_pd(d4, c1);
+      d4 = _mm_add_pd(d4, c2);
+
+      i0 = _mm_cvttpd_epi32(d0);
+      i4 = _mm_cvttpd_epi32(d4);
+      i0 = _mm_unpacklo_epi64(i0, i4);
+
+      //_____________________________________________________________________________
+
+      d1 = _mm_loadu_pd(dval + 4);
+      d1 = _mm_sub_pd(d1, c0);
+      d1 = _mm_mul_pd(d1, c1);
+      d1 = _mm_add_pd(d1, c2);
+
+      d4 = _mm_loadu_pd(dval + 6);
+      d4 = _mm_sub_pd(d4, c0);
+      d4 = _mm_mul_pd(d4, c1);
+      d4 = _mm_add_pd(d4, c2);
+
+      i1 = _mm_cvttpd_epi32(d1);
+      i4 = _mm_cvttpd_epi32(d4);
+      i1 = _mm_unpacklo_epi64(i1, i4);
+
+      //_____________________________________________________________________________
+
+      s0 = _mm_packus_epi32(i0, i1);
+      s0 = _mm_shuffle_epi8(s0, swap);
+      (void) _mm_storeu_si128(sgrib, s0);
+
+      //_____________________________________________________________________________
+
+      (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA);
+
+      //_____________________________________________________________________________
+
+      d2 = _mm_loadu_pd(dval + 8);
+      d2 = _mm_sub_pd(d2, c0);
+      d2 = _mm_mul_pd(d2, c1);
+      d2 = _mm_add_pd(d2, c2);
+
+      d4 = _mm_loadu_pd(dval + 10);
+      d4 = _mm_sub_pd(d4, c0);
+      d4 = _mm_mul_pd(d4, c1);
+      d4 = _mm_add_pd(d4, c2);
+
+      i2 = _mm_cvttpd_epi32(d2);
+      i4 = _mm_cvttpd_epi32(d4);
+      i2 = _mm_unpacklo_epi64(i2, i4);
+
+      //_____________________________________________________________________________
+
+      d3 = _mm_loadu_pd(dval + 12);
+      d3 = _mm_sub_pd(d3, c0);
+      d3 = _mm_mul_pd(d3, c1);
+      d3 = _mm_add_pd(d3, c2);
+
+      d4 = _mm_loadu_pd(dval + 14);
+      d4 = _mm_sub_pd(d4, c0);
+      d4 = _mm_mul_pd(d4, c1);
+      d4 = _mm_add_pd(d4, c2);
+
+      i3 = _mm_cvttpd_epi32(d3);
+      i4 = _mm_cvttpd_epi32(d4);
+      i3 = _mm_unpacklo_epi64(i3, i4);
+
+      //_____________________________________________________________________________
+
+      s1 = _mm_packus_epi32(i2, i3);
+      s1 = _mm_shuffle_epi8(s1, swap);
+      (void) _mm_storeu_si128(sgrib + 1, s1);
+
+      //_____________________________________________________________________________
+
+      dval += 16;
+      sgrib += 2;
+    }
+
+  if (i != datasize)
+    {
+      uint16_t ui16;
+      for (size_t j = i; j < datasize; ++j)
+        {
+          ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5);
+          lGrib[*gz + 2 * j] = ui16 >> 8;
+          lGrib[*gz + 2 * j + 1] = ui16;
+        }
+    }
+
+  *gz += 2 * datasize;
+
+  return;
+}
+
+#define grib_encode_array_2byte_double sse41_encode_array_2byte_double
+
+#else
+
+#define grib_encode_array_2byte_double encode_array_2byte_double
+
+#endif  // SIMD variants
+
+#ifdef TEST_ENCODE
+
+// clang-format off
+#define CAT(X,Y)      X##_##Y
+#define TEMPLATE(X,Y) CAT(X,Y)
+
+#ifdef T
+#undef T
+#endif
+#define T double
+
+#ifdef T
+#undef T
+#endif
+#define T float
+// clang-format on
+
+#include <sys/time.h>
+
+static double
+dtime()
+{
+  double tseconds = 0.0;
+  struct timeval mytime;
+  gettimeofday(&mytime, NULL);
+  tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6);
+  return (tseconds);
+}
+
+static void
+pout(char *name, int s, unsigned char *lgrib, long datasize, double tt)
+{
+  printf("%8s: val1: %d  val2: %d  val3: %d  valn: %d  time: %gs\n", name, (int) lgrib[s * 1 + 1], (int) lgrib[s * 2 + 1],
+         (int) lgrib[s * 3 + 1], (int) lgrib[2 * datasize - 1], tt);
+}
+
+int
+main(void)
+{
+  enum
+  {
+    datasize = 1000000,
+    NRUN = 10000,
+  };
+
+  double t_begin, t_end;
+
+  float *dataf = (float *) malloc(datasize * sizeof(float));
+  double *data = (double *) malloc(datasize * sizeof(double));
+  unsigned char *lgrib = (unsigned char *) malloc(2 * datasize * sizeof(unsigned char));
+
+  for (long i = 0; i < datasize; ++i) dataf[i] = (float) (-datasize / 2 + i);
+  for (long i = 0; i < datasize; ++i) data[i] = (double) (-datasize / 2 + i);
+
+  int PackStart = 0;
+  int nbpv = 16;
+  double zref = data[0];
+  size_t z;
+  double factor = 0.00390625;
+  int s = 256;
+
+  if (0)
+    {
+      encode_array_float(0, 0, 0, NULL, NULL, 0, 0, NULL);
+      encode_array_double(0, 0, 0, NULL, NULL, 0, 0, NULL);
+    }
+
+#if defined(__ICC)
+  printf("icc\n");
+#elif defined(__clang__)
+  printf("clang\n");
+#elif defined(__GNUC__)
+  printf("gcc\n");
+#endif
+
+  printf("float:\n");
+
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      encode_array_2byte_float(datasize, lgrib, dataf, (float) zref, (float) factor, &z);
+    }
+  t_end = dtime();
+  pout("orig", s, lgrib, datasize, t_end - t_begin);
+
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      encode_array_unrolled_float(nbpv, PackStart, datasize, lgrib, dataf, (float) zref, (float) factor, &z);
+    }
+  t_end = dtime();
+  pout("unrolled", s, lgrib, datasize, t_end - t_begin);
+
+  printf("double:\n");
+
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z);
+    }
+  t_end = dtime();
+  pout("orig", s, lgrib, datasize, t_end - t_begin);
+
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      encode_array_unrolled_double(nbpv, PackStart, datasize, lgrib, data, zref, factor, &z);
+    }
+  t_end = dtime();
+  pout("unrolled", s, lgrib, datasize, t_end - t_begin);
+
+#if defined _ENABLE_AVX
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      avx_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z);
+    }
+  t_end = dtime();
+  pout("avx", s, lgrib, datasize, t_end - t_begin);
+#elif defined _ENABLE_SSE4_1
+  t_begin = dtime();
+  for (int i = 0; i < NRUN; ++i)
+    {
+      z = 0;
+      sse41_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z);
+    }
+  t_end = dtime();
+  pout("sse41", s, lgrib, datasize, t_end - t_begin);
+#endif
+
+  return 0;
+}
+#endif  // TEST_ENCODE
+
+#undef DISABLE_SIMD_ENCODE
+#undef _ENABLE_AVX
+#undef _ENABLE_SSE4_1
+
+void
+confp3(double pval, int *kexp, int *kmant, int kbits, int kround)
+{
+  /*
+
+    Purpose:
+    --------
+
+    Convert floating point number from machine
+    representation to GRIB representation.
+
+    Input Parameters:
+    -----------------
+
+       pval    - Floating point number to be converted.
+       kbits   - Number of bits in computer word.
+       kround  - Conversion type.
+                 0 , Closest number in GRIB format less than
+                     original number.
+                 1 , Closest number in GRIB format to the
+                     original number (equal to, greater than or
+                     less than original number).
+
+    Output Parameters:
+    ------------------
+
+       kexp    - 8 Bit signed exponent.
+       kmant   - 24 Bit mantissa.
+
+    Method:
+    -------
+
+    Floating point number represented as 8 bit signed
+    exponent and 24 bit mantissa in integer values.
+
+    Externals.
+    ----------
+
+    decfp2    - Decode from IBM floating point format.
+
+    Reference:
+    ----------
+
+    WMO Manual on Codes re GRIB representation.
+
+    Comments:
+    ---------
+
+    Routine aborts if an invalid conversion type parameter
+    is used or if a 24 bit mantissa is not produced.
+
+    Author:
+    -------
+
+    John Hennessy   ECMWF   18.06.91
+
+    Modifications:
+    --------------
+
+    Uwe Schulzweida   MPIfM   01/04/2001
+
+    Convert to C from EMOS library version 130
+
+    Uwe Schulzweida   MPIfM   02/08/2002
+
+     - speed up by factor 1.6 on NEC SX6
+        - replace 1.0 / pow(16.0, (double)(iexp - 70)) by rpow16m70tab[iexp]
+  */
+
+  // extern int CGRIBEX_Debug;
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 1 . Initialise                                          */
+  /* ----------------------------------------------------------------- */
+
+  // Check conversion type parameter.
+
+  int iround = kround;
+  if (iround != 0 && iround != 1)
+    {
+      Error("Invalid conversion type = %d", iround);
+
+      // If not aborting, arbitrarily set rounding to 'up'.
+      iround = 1;
+    }
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 2 . Convert value of zero.                              */
+  /* ----------------------------------------------------------------- */
+
+  if (fabs(pval) <= 0)
+    {
+      *kexp = 0;
+      *kmant = 0;
+      goto LABEL900;
+    }
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 3 . Convert other values.                               */
+  /* ----------------------------------------------------------------- */
+  {
+    double zeps = (kbits != 32) ? 1.0e-12 : 1.0e-8;
+    double zref = pval;
+
+    // Sign of value.
+    int isign = (zref >= 0.0) ? 0 : 128;
+    zref = fabs(zref);
+
+    // Exponent.
+    int iexp = (int) (log(zref) / log(16.0) + 65.0 + zeps);
+
+    // only ANSI C99 has log2
+    // iexp = (int) (log2(zref) * 0.25 + 65.0 + zeps);
+
+    if (iexp < 0) iexp = 0;
+    if (iexp > 127) iexp = 127;
+
+    // double rpowref = zref / pow(16.0, (double)(iexp - 70));
+    double rpowref = ldexp(zref, 4 * -(iexp - 70));
+
+    // Mantissa.
+    if (iround == 0)
+      {
+        /*  Closest number in GRIB format less than original number. */
+        /*  Truncate for positive numbers. */
+        /*  Round up for negative numbers. */
+        *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5);
+      }
+    else
+      {
+        /*  Closest number in GRIB format to the original number   */
+        /*  (equal to, greater than or less than original number). */
+        *kmant = (int) lround(rpowref);
+      }
+
+    /*  Check that mantissa value does not exceed 24 bits. */
+    /*  If it does, adjust the exponent upwards and recalculate the mantissa. */
+    /*  16777215 = 2**24 - 1 */
+    if (*kmant > 16777215)
+      {
+
+      LABEL350:
+
+        ++iexp;
+
+        // Check for exponent overflow during adjustment
+        if (iexp > 127)
+          {
+            Message("Exponent overflow");
+            Message("Original number = %30.20f", pval);
+            Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant);
+
+            Error("Exponent overflow");
+
+            // If not aborting, arbitrarily set value to zero
+            Message("Value arbitrarily set to zero.");
+            *kexp = 0;
+            *kmant = 0;
+            goto LABEL900;
+          }
+
+        rpowref = ldexp(zref, 4 * -(iexp - 70));
+
+        if (iround == 0)
+          {
+            /*  Closest number in GRIB format less than original number. */
+            /*  Truncate for positive numbers. */
+            /*  Round up for negative numbers. */
+            *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5);
+          }
+        else
+          {
+            /*  Closest number in GRIB format to the original number */
+            /*  (equal to, greater or less than original number). */
+            *kmant = (int) lround(rpowref);
+          }
+
+        // Repeat calculation (with modified exponent) if still have mantissa overflow.
+        if (*kmant > 16777215) goto LABEL350;
+      }
+
+    // Add sign bit to exponent.
+    *kexp = iexp + isign;
+  }
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 9. Return                                               */
+  /* ----------------------------------------------------------------- */
+
+LABEL900:
+  /*
+  if ( CGRIBEX_Debug )
+    {
+      double zval;
+
+      Message("Conversion type parameter = %4d", kround);
+      Message("Original number = %30.20f", pval);
+
+      zval = decfp2(*kexp, *kmant);
+
+      Message("Converted to      %30.20f", zval);
+      Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant);
+    }
+  */
+  return;
+} /* confp3 */
+#include <math.h>
+
+double
+decfp2(int kexp, int kmant)
+{
+  /*
+
+    Purpose:
+    --------
+
+    Convert GRIB representation of a floating point
+    number to machine representation.
+
+    Input Parameters:
+    -----------------
+
+    kexp    - 8 Bit signed exponent.
+    kmant   - 24 Bit mantissa.
+
+    Output Parameters:
+    ------------------
+
+    Return value   - Floating point number represented
+                     by kexp and kmant.
+
+    Method:
+    -------
+
+    Floating point number represented as 8 bit exponent
+    and 24 bit mantissa in integer values converted to
+    machine floating point format.
+
+    Externals:
+    ----------
+
+    None.
+
+    Reference:
+    ----------
+
+    WMO Manual on Codes re GRIB representation.
+
+    Comments:
+    ---------
+
+    Rewritten from DECFP, to conform to programming standards.
+    Sign bit on 0 value now ignored, if present.
+    If using 32 bit reals, check power of 16 is not so small as to
+    cause overflows (underflows!); this causes warning to be given
+    on Fujitsus.
+
+    Author:
+    -------
+
+    John Hennessy   ECMWF   18.06.91
+
+    Modifications:
+    --------------
+
+    Uwe Schulzweida   MPIfM   01/04/2001
+
+     - Convert to C from EMOS library version 130
+
+    Uwe Schulzweida   MPIfM   02/08/2002
+
+     - speed up by factor 2 on NEC SX6
+        - replace pow(2.0, -24.0) by constant POW_2_M24
+        - replace pow(16.0, (double)(iexp - 64)) by pow16m64tab[iexp]
+  */
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 1 . Convert value of 0.0. Ignore sign bit.              */
+  /* ----------------------------------------------------------------- */
+
+  if ((kexp == 128) || (kexp == 0) || (kexp == 255)) return 0.0;
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 2 . Convert other values.                               */
+  /* ----------------------------------------------------------------- */
+
+  /*  Sign of value. */
+
+  int iexp = kexp;
+  int isign = (iexp < 128) * 2 - 1;
+
+  iexp -= iexp < 128 ? 0 : 128;
+
+  /*  Decode value. */
+
+  /* pval = isign * pow(2.0, -24.0) * kmant * pow(16.0, (double)(iexp - 64)); */
+
+  iexp -= 64;
+
+  double pval = ldexp(1.0, 4 * iexp) * isign * POW_2_M24 * kmant;
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 9. Return to calling routine.                           */
+  /* ----------------------------------------------------------------- */
+
+  return pval;
+} /* decfp2 */
+#include <stdarg.h>
+#include <stdint.h>
+
+static void
+gribDecodeRefDate(const int *isec1, int *year, int *month, int *day)
+{
+  int ryear = ISEC1_Year;
+
+  int century = ISEC1_Century;
+  if (century < 0) century = -century;
+  century -= 1;
+
+  if (century == -255 && ryear == 127)
+    {
+      ryear = 0;
+    }
+  else
+    {
+      // if ( century != 0 )
+      {
+        if (ryear == 100)
+          {
+            ryear = 0;
+            century += 1;
+          }
+
+        if (ryear != 255)
+          {
+            ryear = century * 100 + ryear;
+            if (ISEC1_Century < 0) ryear = -ryear;
+          }
+        else
+          {
+            ryear = 1;
+          }
+      }
+    }
+
+  *year = ryear;
+  *month = ISEC1_Month;
+  *day = ISEC1_Day;
+}
+
+int
+gribRefDate(const int *isec1)
+{
+  int ryear, rmonth, rday;
+  gribDecodeRefDate(isec1, &ryear, &rmonth, &rday);
+  return (int) cdiEncodeDate(ryear, rmonth, rday);
+}
+
+static void
+gribDecodeRefTime(const int *isec1, int *hour, int *minute, int *second)
+{
+  *hour = ISEC1_Hour;
+  *minute = ISEC1_Minute;
+  *second = 0;
+}
+
+int
+gribRefTime(const int *isec1)
+{
+  int rhour, rminute, rsecond;
+  gribDecodeRefTime(isec1, &rhour, &rminute, &rsecond);
+  return cdiEncodeTime(rhour, rminute, rsecond);
+}
+
+bool
+gribTimeIsFC(const int *isec1)
+{
+  bool isFC = false;
+
+  const int time_period = (ISEC1_TimeRange == 10) ? (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2 : ISEC1_TimePeriod1;
+
+  if (time_period > 0 && ISEC1_Day > 0)
+    {
+      isFC = (ISEC1_TimeRange == 0 || ISEC1_TimeRange == 10);
+    }
+
+  return isFC;
+}
+
+static int
+getTimeUnitFactor(int timeUnit)
+{
+  static bool lprint = true;
+  // clang-format off
+  switch (timeUnit)
+    {
+    case ISEC1_TABLE4_MINUTE:    return    60; break;
+    case ISEC1_TABLE4_QUARTER:   return   900; break;
+    case ISEC1_TABLE4_30MINUTES: return  1800; break;
+    case ISEC1_TABLE4_HOUR:      return  3600; break;
+    case ISEC1_TABLE4_3HOURS:    return 10800; break;
+    case ISEC1_TABLE4_6HOURS:    return 21600; break;
+    case ISEC1_TABLE4_12HOURS:   return 43200; break;
+    case ISEC1_TABLE4_DAY:       return 86400; break;
+    default:
+      if (lprint)
+        {
+          gprintf(__func__, "Time unit %d unsupported", timeUnit);
+          lprint = false;
+        }
+      break;
+    }
+  // clang-format on
+
+  return 0;
+}
+
+void
+gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime)
+{
+  *startDate = 0;
+  *startTime = 0;
+
+  CdiDateTime rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1));
+
+  int64_t time_period = 0, time_period_x = 0;
+  if (ISEC1_TimeRange == 10)
+    time_period = (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2;
+  else if (ISEC1_TimeRange >= 2 && ISEC1_TimeRange <= 5)
+    {
+      time_period_x = ISEC1_TimePeriod1;
+      time_period = ISEC1_TimePeriod2;
+    }
+  else if (ISEC1_TimeRange == 0)
+    time_period = ISEC1_TimePeriod1;
+
+  if (time_period > 0 && rDateTime.date.day > 0)
+    {
+      JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime);
+
+      const int timeUnitFactor = getTimeUnitFactor(ISEC1_TimeUnit);
+
+      if (time_period_x > 0)
+        {
+          JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * time_period_x);
+          CdiDateTime sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2);
+          sDateTime.time.second = 0;
+          *startDate = (int) cdiDate_get(sDateTime.date);
+          *startTime = cdiTime_get(sDateTime.time);
+        }
+
+      julianDate = julianDate_add_seconds(julianDate, timeUnitFactor * time_period);
+      rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate);
+    }
+
+  *date = (int) cdiDate_get(rDateTime.date);
+  *time = cdiTime_get(rDateTime.time);
+}
+
+void
+gribDateTime(int *isec1, int *date, int *time)
+{
+  int sdate, stime;
+  gribDateTimeX(isec1, date, time, &sdate, &stime);
+}
+
+void
+gprintf(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+
+  if (grprsm == NULL) Error("GRIBEX initialization missing!");
+
+  va_start(args, fmt);
+
+  fprintf(grprsm, "%-18s : ", caller);
+  vfprintf(grprsm, fmt, args);
+  fputs("\n", grprsm);
+
+  va_end(args);
+}
+
+// clang-format off
+void
+gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3,
+	 double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib,
+	 int kleng, int *kword, const char *hoper, int *kret)
+{
+  int yfunc = *hoper;
+
+  if ( yfunc == 'C' )
+    {
+      grib_encode_double(isec0, isec1, isec2, fsec2, isec3,
+			 fsec3, isec4, fsec4, klenp, kgrib,
+			 kleng, kword, yfunc, kret);
+    }
+  else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' )
+    {
+      grib_decode_double(isec0, isec1, isec2, fsec2, isec3,
+			 fsec3, isec4, fsec4, klenp, kgrib,
+			 kleng, kword, yfunc, kret);
+    }
+  else if ( yfunc == 'V' )
+    {
+      fprintf(stderr, "  cgribex: Version is %s\n", cgribexLibraryVersion());
+    }
+  else
+    {
+      Error("oper %c unsupported!", yfunc);
+      *kret=-9;
+    }
+}
+
+
+void
+gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3,
+	 float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib,
+	 int kleng, int *kword, const char *hoper, int *kret)
+{
+  int yfunc = *hoper;
+
+  if ( yfunc == 'C' )
+    {
+      grib_encode_float(isec0, isec1, isec2, fsec2, isec3,
+			fsec3, isec4, fsec4, klenp, kgrib,
+			kleng, kword, yfunc, kret);
+    }
+  else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' )
+    {
+      grib_decode_float(isec0, isec1, isec2, fsec2, isec3,
+			fsec3, isec4, fsec4, klenp, kgrib,
+			kleng, kword, yfunc, kret);
+    }
+  else if ( yfunc == 'V' )
+    {
+      fprintf(stderr, " cgribex: Version is %s\n", cgribexLibraryVersion());
+    }
+  else
+    {
+      Error("oper %c unsupported!", yfunc);
+      *kret=-9;
+    }
+}
+// clang-format on
+
+int CGRIBEX_Fix_ZSE = 0; /* 1: Fix ZeroShiftError of simple packed spherical harmonics */
+int CGRIBEX_Const = 0;   /* 1: Don't pack constant fields on regular grids */
+int CGRIBEX_Debug = 0;   /* 1: Debugging */
+
+void
+gribSetDebug(int debug)
+{
+  CGRIBEX_Debug = debug;
+
+  if (CGRIBEX_Debug) Message("debug level %d", debug);
+}
+
+void
+gribFixZSE(int flag)
+{
+  CGRIBEX_Fix_ZSE = flag;
+
+  if (CGRIBEX_Debug) Message("Fix ZeroShiftError set to %d", flag);
+}
+
+void
+gribSetConst(int flag)
+{
+  CGRIBEX_Const = flag;
+
+  if (CGRIBEX_Debug) Message("Const set to %d", flag);
+}
+
+void
+gribSetRound(int round)
+{
+  UNUSED(round);
+}
+
+void
+gribSetRefDP(double refval)
+{
+  UNUSED(refval);
+}
+
+void
+gribSetRefSP(float refval)
+{
+  gribSetRefDP((double) refval);
+}
+
+void
+gribSetValueCheck(int vcheck)
+{
+  UNUSED(vcheck);
+}
+#include <string.h>
+#include <math.h>
+
+void
+gribPrintSec0(int *isec0)
+{
+  /*
+
+    Print the information in the Indicator
+    Section (Section 0) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec0 - Array of decoded integers from Section 0
+
+
+    Converted from EMOS routine GRPRS0.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+
+  grsdef();
+
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " Section 0 - Indicator Section.       \n");
+  fprintf(grprsm, " -------------------------------------\n");
+  fprintf(grprsm, " Length of GRIB message (octets).     %9d\n", ISEC0_GRIB_Len);
+  fprintf(grprsm, " GRIB Edition Number.                 %9d\n", ISEC0_GRIB_Version);
+}
+
+void
+gribPrintSec1(int *isec0, int *isec1)
+{
+  /*
+
+    Print the information in the Product Definition
+    Section (Section 1) of decoded GRIB data.
+
+    Input Parameters
+       isec0 - Array of decoded integers from Section 0
+
+       isec1 - Array of decoded integers from Section 1
+
+    Comments:
+
+       When decoding data from Experimental Edition or Edition 0,
+       routine GRIBEX adds the additional fields available in
+       Edition 1.
+
+
+    Converted from EMOS routine GRPRS1.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+
+  int iprev, icurr, ioffset;
+  int ibit, ierr, iout, iyear;
+  int jiloop;
+  float value;
+
+  char hversion[9];
+  /*
+  char hfirst[121], hsecond[121], hthird[121], hfourth[121];
+  */
+
+  grsdef();
+
+  /*
+    -----------------------------------------------------------------
+    Section 0 . Print required information.
+    -----------------------------------------------------------------
+  */
+
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " Section 1 - Product Definition Section.\n");
+  fprintf(grprsm, " ---------------------------------------\n");
+
+  fprintf(grprsm, " Code Table 2 Version Number.         %9d\n", isec1[0]);
+  fprintf(grprsm, " Originating centre identifier.       %9d\n", isec1[1]);
+  fprintf(grprsm, " Model identification.                %9d\n", isec1[2]);
+  fprintf(grprsm, " Grid definition.                     %9d\n", isec1[3]);
+
+  ibit = 8;
+  prtbin(isec1[4], ibit, &iout, &ierr);
+  fprintf(grprsm, " Flag (Code Table 1)                   %8.8d\n", iout);
+  fprintf(grprsm, " Parameter identifier (Code Table 2). %9d\n", isec1[5]);
+
+  /*
+      IERR = CHKTAB2(ISEC1,HFIRST,HSECOND,HTHIRD,HFOURTH)
+      IF( IERR .EQ. 0 ) THEN
+       DO JLOOP = 121, 1, -1
+          IF( HSECOND(JLOOP:JLOOP).NE.' ' ) THEN
+            IOFFSET = JLOOP
+            GOTO 110
+          ENDIF
+        ENDDO
+        GOTO 120
+ 110    CONTINUE
+        WRITE(*,'(2H ",A,1H")') HSECOND(1:IOFFSET)
+ 120    CONTINUE
+      ENDIF
+  */
+
+  if (isec1[5] != 127)
+    {
+      fprintf(grprsm, " Type of level (Code Table 3).        %9d\n", isec1[6]);
+      fprintf(grprsm, " Value 1 of level (Code Table 3).     %9d\n", isec1[7]);
+      fprintf(grprsm, " Value 2 of level (Code Table 3).     %9d\n", isec1[8]);
+    }
+  else
+    {
+      fprintf(grprsm, " Satellite identifier.                %9d\n", isec1[6]);
+      fprintf(grprsm, " Spectral band.                       %9d\n", isec1[7]);
+    }
+
+  iyear = isec1[9];
+  if (iyear != 255)
+    {
+      int date, time;
+      /* iyear  = ((isec1[20]-1)*100 + isec1[9]); */
+      gribDateTime(isec1, &date, &time);
+      iyear = date / 10000;
+      fprintf(grprsm, " Year of reference time of data.      %9d  (%4d)\n", isec1[9], iyear);
+    }
+  else
+    {
+      fprintf(grprsm, " Year of reference time of data MISSING  (=255)\n");
+    }
+
+  fprintf(grprsm, " Month of reference time of data.     %9d\n", isec1[10]);
+  fprintf(grprsm, " Day of reference time of data.       %9d\n", isec1[11]);
+  fprintf(grprsm, " Hour of reference time of data.      %9d\n", isec1[12]);
+  fprintf(grprsm, " Minute of reference time of data.    %9d\n", isec1[13]);
+  fprintf(grprsm, " Time unit (Code Table 4).            %9d\n", isec1[14]);
+  fprintf(grprsm, " Time range one.                      %9d\n", isec1[15]);
+  fprintf(grprsm, " Time range two.                      %9d\n", isec1[16]);
+  fprintf(grprsm, " Time range indicator (Code Table 5)  %9d\n", isec1[17]);
+  fprintf(grprsm, " Number averaged.                     %9d\n", isec1[18]);
+  fprintf(grprsm, " Number missing from average.         %9d\n", isec1[19]);
+  /*
+     All ECMWF data in GRIB Editions before Edition 1 is decoded
+     as 20th century data. Other centres are decoded as missing.
+  */
+  if (isec0[1] < 1 && isec1[1] != 98)
+    fprintf(grprsm, " Century of reference time of data.   Not given\n");
+  else
+    fprintf(grprsm, " Century of reference time of data.   %9d\n", isec1[20]);
+
+  /*   Print sub-centre  */
+  fprintf(grprsm, " Sub-centre identifier.               %9d\n", ISEC1_SubCenterID);
+
+  /*   Decimal scale factor  */
+  fprintf(grprsm, " Units decimal scaling factor.        %9d\n", isec1[22]);
+
+  /*
+    -----------------------------------------------------------------
+    Section 1 . Print local DWD information.
+    -----------------------------------------------------------------
+  */
+  if ((ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) && (isec1[36] == 253 || isec1[36] == 254))
+    {
+      fprintf(grprsm, " DWD local usage identifier.          %9d\n", isec1[36]);
+      if (isec1[36] == 253) fprintf(grprsm, " (Database labelling and ensemble forecast)\n");
+      if (isec1[36] == 254) fprintf(grprsm, " (Database labelling)\n");
+
+      fprintf(grprsm, " Year of database entry                     %3d  (%4d)\n", isec1[43], 1900 + isec1[43]);
+      fprintf(grprsm, " Month of database entry                    %3d\n", isec1[44]);
+      fprintf(grprsm, " Day of database entry                      %3d\n", isec1[45]);
+      fprintf(grprsm, " Hour of database entry                     %3d\n", isec1[46]);
+      fprintf(grprsm, " Minute of database entry                   %3d\n", isec1[47]);
+      fprintf(grprsm, " DWD experiment number                %9d\n", isec1[48]);
+      fprintf(grprsm, " DWD run type                         %9d\n", isec1[49]);
+      if (isec1[36] == 253)
+        {
+          fprintf(grprsm, " User id                              %9d\n", isec1[50]);
+          fprintf(grprsm, " Experiment identifier                %9d\n", isec1[51]);
+          fprintf(grprsm, " Ensemble identification type         %9d\n", isec1[52]);
+          fprintf(grprsm, " Number of ensemble members           %9d\n", isec1[53]);
+          fprintf(grprsm, " Actual number of ensemble member     %9d\n", isec1[54]);
+          fprintf(grprsm, " Model version                            %2d.%2.2d\n", isec1[55], isec1[56]);
+        }
+    }
+
+  /*
+    -----------------------------------------------------------------
+    Section 2 . Print local ECMWF information.
+    -----------------------------------------------------------------
+  */
+  /*
+    Regular MARS labelling, or reformatted Washington EPS products.
+  */
+  if ((ISEC1_CenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag == 1)
+      || (ISEC1_CenterID == 7 && ISEC1_SubCenterID == 98))
+    {
+      /*   Parameters common to all definitions.  */
+
+      fprintf(grprsm, " ECMWF local usage identifier.        %9d\n", isec1[36]);
+      if (isec1[36] == 1) fprintf(grprsm, " (Mars labelling or ensemble forecast)\n");
+      if (isec1[36] == 2) fprintf(grprsm, " (Cluster means and standard deviations)\n");
+      if (isec1[36] == 3) fprintf(grprsm, " (Satellite image data)\n");
+      if (isec1[36] == 4) fprintf(grprsm, " (Ocean model data)\n");
+      if (isec1[36] == 5) fprintf(grprsm, " (Forecast probability data)\n");
+      if (isec1[36] == 6) fprintf(grprsm, " (Surface temperature data)\n");
+      if (isec1[36] == 7) fprintf(grprsm, " (Sensitivity data)\n");
+      if (isec1[36] == 8) fprintf(grprsm, " (ECMWF re-analysis data)\n");
+      if (isec1[36] == 9) fprintf(grprsm, " (Singular vectors and ensemble perturbations)\n");
+      if (isec1[36] == 10) fprintf(grprsm, " (EPS tubes)\n");
+      if (isec1[36] == 11) fprintf(grprsm, " (Supplementary data used by analysis)\n");
+      if (isec1[36] == 13) fprintf(grprsm, " (Wave 2D spectra direction and frequency)\n");
+
+      fprintf(grprsm, " Class.                               %9d\n", isec1[37]);
+      fprintf(grprsm, " Type.                                %9d\n", isec1[38]);
+      fprintf(grprsm, " Stream.                              %9d\n", isec1[39]);
+      sprintf(hversion, "%4s", (char *) &isec1[40]);
+      hversion[4] = 0;
+      fprintf(grprsm, " Version number or Experiment identifier.  %4s\n", hversion);
+      /*
+        ECMWF Local definition 1.
+        (MARS labelling or ensemble forecast data)
+      */
+      if (isec1[36] == 1)
+        {
+          fprintf(grprsm, " Forecast number.                     %9d\n", isec1[41]);
+          if (isec1[39] != 1090) fprintf(grprsm, " Total number of forecasts.           %9d\n", isec1[42]);
+
+          return;
+        }
+      /*
+        ECMWF Local definition 2.
+        (Cluster means and standard deviations)
+      */
+      if (isec1[36] == 2)
+        {
+          fprintf(grprsm, " Cluster number.                      %9d\n", isec1[41]);
+          fprintf(grprsm, " Total number of clusters.            %9d\n", isec1[42]);
+          fprintf(grprsm, " Clustering method.                   %9d\n", isec1[43]);
+          fprintf(grprsm, " Start time step when clustering.     %9d\n", isec1[44]);
+          fprintf(grprsm, " End time step when clustering.       %9d\n", isec1[45]);
+          fprintf(grprsm, " Northern latitude of domain.         %9d\n", isec1[46]);
+          fprintf(grprsm, " Western longitude of domain.         %9d\n", isec1[47]);
+          fprintf(grprsm, " Southern latitude of domain.         %9d\n", isec1[48]);
+          fprintf(grprsm, " Eastern longitude of domain.         %9d\n", isec1[49]);
+          fprintf(grprsm, " Operational forecast in cluster      %9d\n", isec1[50]);
+          fprintf(grprsm, " Control forecast in cluster          %9d\n", isec1[51]);
+          fprintf(grprsm, " Number of forecasts in cluster.      %9d\n", isec1[52]);
+
+          for (int jloop = 0; jloop < isec1[52]; jloop++)
+            fprintf(grprsm, " Forecast number                      %9d\n", isec1[jloop + 53]);
+
+          return;
+        }
+      /*
+        ECMWF Local definition 3.
+        (Satellite image data)
+      */
+      if (isec1[36] == 3)
+        {
+          fprintf(grprsm, " Satellite spectral band.             %9d\n", isec1[41]);
+          fprintf(grprsm, " Function code.                       %9d\n", isec1[42]);
+          return;
+        }
+      /*
+        ECMWF Local definition 4.
+        (Ocean model data)
+      */
+      if (isec1[36] == 4)
+        {
+          fprintf(grprsm, " Satellite spectral band.             %9d\n", isec1[41]);
+          if (isec1[39] != 1090) fprintf(grprsm, " Function code.                       %9d\n", isec1[42]);
+          fprintf(grprsm, " Coordinate structure definition.\n");
+          fprintf(grprsm, " Fundamental spatial reference system.%9d\n", isec1[43]);
+          fprintf(grprsm, " Fundamental time reference.          %9d\n", isec1[44]);
+          fprintf(grprsm, " Space unit flag.                     %9d\n", isec1[45]);
+          fprintf(grprsm, " Vertical coordinate definition.      %9d\n", isec1[46]);
+          fprintf(grprsm, " Horizontal coordinate definition.    %9d\n", isec1[47]);
+          fprintf(grprsm, " Time unit flag.                      %9d\n", isec1[48]);
+          fprintf(grprsm, " Time coordinate definition.          %9d\n", isec1[49]);
+          fprintf(grprsm, " Position definition.     \n");
+          fprintf(grprsm, " Mixed coordinate field flag.         %9d\n", isec1[50]);
+          fprintf(grprsm, " Coordinate 1 flag.                   %9d\n", isec1[51]);
+          fprintf(grprsm, " Averaging flag.                      %9d\n", isec1[52]);
+          fprintf(grprsm, " Position of level 1.                 %9d\n", isec1[53]);
+          fprintf(grprsm, " Position of level 2.                 %9d\n", isec1[54]);
+          fprintf(grprsm, " Coordinate 2 flag.                   %9d\n", isec1[55]);
+          fprintf(grprsm, " Averaging flag.                      %9d\n", isec1[56]);
+          fprintf(grprsm, " Position of level 1.                 %9d\n", isec1[57]);
+          fprintf(grprsm, " Position of level 2.                 %9d\n", isec1[58]);
+          fprintf(grprsm, " Grid Definition.\n");
+          fprintf(grprsm, " Coordinate 3 flag (x-axis)           %9d\n", isec1[59]);
+          fprintf(grprsm, " Coordinate 4 flag (y-axis)           %9d\n", isec1[60]);
+          fprintf(grprsm, " Coordinate 4 of first grid point.    %9d\n", isec1[61]);
+          fprintf(grprsm, " Coordinate 3 of first grid point.    %9d\n", isec1[62]);
+          fprintf(grprsm, " Coordinate 4 of last grid point.     %9d\n", isec1[63]);
+          fprintf(grprsm, " Coordinate 3 of last grid point.     %9d\n", isec1[64]);
+          fprintf(grprsm, " i - increment.                       %9d\n", isec1[65]);
+          fprintf(grprsm, " j - increment.                       %9d\n", isec1[66]);
+          fprintf(grprsm, " Flag for irregular grid coordinates. %9d\n", isec1[67]);
+          fprintf(grprsm, " Flag for normal or staggered grids.  %9d\n", isec1[68]);
+          fprintf(grprsm, " Further information.\n");
+          fprintf(grprsm, " Further information flag.            %9d\n", isec1[69]);
+          fprintf(grprsm, " Auxiliary information.\n");
+          fprintf(grprsm, " No. entries in horizontal coordinate %9d\n", isec1[70]);
+          fprintf(grprsm, " No. entries in mixed coordinate defn.%9d\n", isec1[71]);
+          fprintf(grprsm, " No. entries in grid coordinate list. %9d\n", isec1[72]);
+          fprintf(grprsm, " No. entries in auxiliary array.      %9d\n", isec1[73]);
+          /*
+            Horizontal coordinate supplement.
+          */
+          fprintf(grprsm, " Horizontal coordinate supplement.\n");
+          if (isec1[70] == 0)
+            {
+              fprintf(grprsm, "(None).\n");
+            }
+          else
+            {
+              fprintf(grprsm, "Number of items = %d\n", isec1[70]);
+              for (int jloop = 0; jloop < isec1[70]; jloop++) fprintf(grprsm, "         %12d\n", isec1[74 + jloop]);
+            }
+          /*
+            Mixed coordinate definition.
+          */
+          fprintf(grprsm, " Mixed coordinate definition.\n");
+          if (isec1[71] == 0)
+            {
+              fprintf(grprsm, "(None).\n");
+            }
+          else
+            {
+              fprintf(grprsm, "Number of items = %d\n", isec1[71]);
+              ioffset = 74 + isec1[70];
+              for (int jloop = 0; jloop < isec1[71]; jloop++) fprintf(grprsm, "         %12d\n", isec1[ioffset + jloop]);
+            }
+          /*
+            Grid coordinate list.
+          */
+          fprintf(grprsm, " Grid coordinate list. \n");
+          if (isec1[72] == 0)
+            {
+              fprintf(grprsm, "(None).\n");
+            }
+          else
+            {
+              fprintf(grprsm, "Number of items = %d\n", isec1[72]);
+              ioffset = 74 + isec1[70] + isec1[71];
+              for (int jloop = 0; jloop < isec1[72]; jloop++) fprintf(grprsm, "         %12d\n", isec1[ioffset + jloop]);
+            }
+          /*
+            Auxiliary array.
+          */
+          fprintf(grprsm, " Auxiliary array.      \n");
+          if (isec1[73] == 0)
+            {
+              fprintf(grprsm, "(None).\n");
+            }
+          else
+            {
+              fprintf(grprsm, "Number of items = %d\n", isec1[73]);
+              ioffset = 74 + isec1[70] + isec1[71] + isec1[72];
+              for (int jloop = 0; jloop < isec1[73]; jloop++) fprintf(grprsm, "         %12d\n", isec1[ioffset + jloop]);
+            }
+          /*
+            Post-auxiliary array.
+          */
+          fprintf(grprsm, " Post-auxiliary array. \n");
+          ioffset = 74 + isec1[70] + isec1[71] + isec1[72] + isec1[73];
+          if (isec1[ioffset] == 0)
+            {
+              fprintf(grprsm, "(None).\n");
+            }
+          else
+            {
+              fprintf(grprsm, "Number of items = %d\n", isec1[ioffset]);
+              for (int jloop = 1; jloop < isec1[ioffset]; jloop++) fprintf(grprsm, "         %12d\n", isec1[ioffset + jloop]);
+            }
+
+          return;
+        }
+      /*
+        ECMWF Local definition 5.
+        (Forecast probability data)
+      */
+      if (isec1[36] == 5)
+        {
+          fprintf(grprsm, " Forecast probability number          %9d\n", isec1[41]);
+          fprintf(grprsm, " Total number of forecast probabilities %7d\n", isec1[42]);
+          fprintf(grprsm, " Threshold units decimal scale factor %9d\n", isec1[43]);
+          fprintf(grprsm, " Threshold indicator(1=lower,2=upper,3=both) %2d\n", isec1[44]);
+          if (isec1[44] != 2) fprintf(grprsm, " Lower threshold value                %9d\n", isec1[45]);
+          if (isec1[44] != 1) fprintf(grprsm, " Upper threshold value                %9d\n", isec1[46]);
+          return;
+        }
+      /*
+        ECMWF Local definition 6.
+        (Surface temperature data)
+      */
+      if (isec1[36] == 6)
+        {
+          iyear = isec1[43];
+          if (iyear > 100)
+            {
+              if (iyear < 19000000) iyear = iyear + 19000000;
+              fprintf(grprsm, " Date of SST field used               %9d\n", iyear);
+            }
+          else
+            fprintf(grprsm, "Date of SST field used               Not given\n");
+        }
+      if (isec1[44] == 0) fprintf(grprsm, " Type of SST field (= climatology)    %9d\n", isec1[44]);
+      if (isec1[44] == 1) fprintf(grprsm, " Type of SST field (= 1/1 degree)     %9d\n", isec1[44]);
+      if (isec1[44] == 2) fprintf(grprsm, " Type of SST field (= 2/2 degree)     %9d\n", isec1[44]);
+
+      fprintf(grprsm, " Number of ICE fields used:           %9d\n", isec1[45]);
+
+      for (int jloop = 1; jloop <= isec1[45]; jloop++)
+        {
+          iyear = isec1[44 + (jloop * 2)];
+          if (iyear > 100)
+            {
+              if (iyear < 19000000) iyear = iyear + 19000000;
+              fprintf(grprsm, " Date of ICE field%3d                 %9d\n", jloop, iyear);
+              fprintf(grprsm, " Satellite number (ICE field%3d)      %9d\n", jloop, isec1[45 + (jloop * 2)]);
+            }
+          else
+            fprintf(grprsm, "Date of SST field used               Not given\n");
+        }
+      /*
+        ECMWF Local definition 7.
+        (Sensitivity data)
+      */
+      if (isec1[36] == 7)
+        {
+          if (isec1[38] == 51) fprintf(grprsm, " Forecast number                      %9d\n", isec1[41]);
+          if (isec1[38] != 51) fprintf(grprsm, " Iteration number                     %9d\n", isec1[41]);
+          if (isec1[38] != 52) fprintf(grprsm, " Total number of diagnostics          %9d\n", isec1[42]);
+          if (isec1[38] == 52) fprintf(grprsm, " No.interations in diag. minimisation %9d\n", isec1[42]);
+          fprintf(grprsm, " Domain(0=Global,1=Europe,2=N.Hem.,3=S.Hem.) %2d\n", isec1[43]);
+          fprintf(grprsm, " Diagnostic number                    %9d\n", isec1[44]);
+        }
+      /*
+        ECMWF Local definition 8.
+        (ECMWF re-analysis data)
+      */
+      if (isec1[36] == 8)
+        {
+          if ((isec1[39] == 1043) || (isec1[39] == 1070) || (isec1[39] == 1071))
+            {
+              fprintf(grprsm, " Interval between reference times     %9d\n", isec1[41]);
+              for (int jloop = 43; jloop <= 54; jloop++)
+                {
+                  jiloop = jloop + 8;
+                  fprintf(grprsm, " ERA section 1 octet %2d.              %9d\n", jiloop, isec1[jloop - 1]);
+                }
+            }
+          else
+            {
+              for (int jloop = 42; jloop <= 54; jloop++)
+                {
+                  jiloop = jloop + 8;
+                  fprintf(grprsm, " ERA section 1 octet %2d.              %9d\n", jiloop, isec1[jloop - 1]);
+                }
+            }
+          return;
+        }
+
+      if (isec1[38] > 4 && isec1[38] < 9)
+        {
+          fprintf(grprsm, " Simulation number.                   %9d\n", isec1[41]);
+          fprintf(grprsm, " Total number of simulations.         %9d\n", isec1[42]);
+        }
+      /*
+        ECMWF Local definition 9.
+        (Singular vectors and ensemble perturbations)
+      */
+      if (isec1[36] == 9)
+        {
+          if (isec1[38] == 60) fprintf(grprsm, " Perturbed ensemble forecast number   %9d\n", isec1[41]);
+          if (isec1[38] == 61) fprintf(grprsm, " Initial state perturbation number    %9d\n", isec1[41]);
+          if (isec1[38] == 62) fprintf(grprsm, " Singular vector number               %9d\n", isec1[41]);
+          if (isec1[38] == 62)
+            {
+              fprintf(grprsm, " Number of iterations                 %9d\n", isec1[42]);
+              fprintf(grprsm, " Number of singular vectors computed  %9d\n", isec1[43]);
+              fprintf(grprsm, " Norm used at initial time            %9d\n", isec1[44]);
+              fprintf(grprsm, " Norm used at final time              %9d\n", isec1[45]);
+              fprintf(grprsm, " Multiplication factor                %9d\n", isec1[46]);
+              fprintf(grprsm, " Latitude of north-west corner        %9d\n", isec1[47]);
+              fprintf(grprsm, " Longitude of north-west corner       %9d\n", isec1[48]);
+              fprintf(grprsm, " Latitude of south-east corner        %9d\n", isec1[49]);
+              fprintf(grprsm, " Longitude of south-east corner       %9d\n", isec1[50]);
+              fprintf(grprsm, " Accuracy                             %9d\n", isec1[51]);
+              fprintf(grprsm, " Number of singular vectors evolved   %9d\n", isec1[52]);
+              fprintf(grprsm, " Ritz number one                      %9d\n", isec1[53]);
+              fprintf(grprsm, " Ritz number two                      %9d\n", isec1[54]);
+            }
+        }
+      /*
+        ECMWF Local definition 10.
+        (EPS tubes)
+      */
+      if (isec1[36] == 10)
+        {
+          fprintf(grprsm, " Tube number                          %9d\n", isec1[41]);
+          fprintf(grprsm, " Total number of tubes                %9d\n", isec1[42]);
+          fprintf(grprsm, " Central cluster definition           %9d\n", isec1[43]);
+          fprintf(grprsm, " Parameter                            %9d\n", isec1[44]);
+          fprintf(grprsm, " Type of level                        %9d\n", isec1[45]);
+          fprintf(grprsm, " Northern latitude of domain of tubing%9d\n", isec1[46]);
+          fprintf(grprsm, " Western longitude of domain of tubing%9d\n", isec1[47]);
+          fprintf(grprsm, " Southern latitude of domain of tubing%9d\n", isec1[48]);
+          fprintf(grprsm, " Eastern longitude of domain of tubing%9d\n", isec1[49]);
+          fprintf(grprsm, " Tube number of operational forecast  %9d\n", isec1[50]);
+          fprintf(grprsm, " Tube number of control forecast      %9d\n", isec1[51]);
+          fprintf(grprsm, " Height/pressure of level             %9d\n", isec1[52]);
+          fprintf(grprsm, " Reference step                       %9d\n", isec1[53]);
+          fprintf(grprsm, " Radius of central cluster            %9d\n", isec1[54]);
+          fprintf(grprsm, " Ensemble standard deviation          %9d\n", isec1[55]);
+          fprintf(grprsm, " Dist.of tube extreme to ensemble mean%9d\n", isec1[56]);
+          fprintf(grprsm, " Number of forecasts in the tube      %9d\n", isec1[57]);
+
+          fprintf(grprsm, " List of ensemble forecast numbers:\n");
+          for (int jloop = 1; jloop <= isec1[57]; jloop++) fprintf(grprsm, "    %9d\n", isec1[57 + jloop]);
+        }
+      /*
+        ECMWF Local definition 11.
+        (Supplementary data used by the analysis)
+      */
+      if (isec1[36] == 11)
+        {
+          fprintf(grprsm, " Details of analysis which used the supplementary data:\n");
+          fprintf(grprsm, "   Class                              %9d\n", isec1[41]);
+          fprintf(grprsm, "   Type                               %9d\n", isec1[42]);
+          fprintf(grprsm, "   Stream                             %9d\n", isec1[43]);
+          /*
+          sprintf(hversion, "%8d", isec1[44]);
+          fprintf(grprsm, "   Version number/experiment identifier:   %4s\n", &hversion[4]);
+          */
+          iyear = isec1[45];
+          if (iyear > 50)
+            iyear = iyear + 1900;
+          else
+            iyear = iyear + 2000;
+
+          fprintf(grprsm, "   Year                               %9d\n", iyear);
+          fprintf(grprsm, "   Month                              %9d\n", isec1[46]);
+          fprintf(grprsm, "   Day                                %9d\n", isec1[47]);
+          fprintf(grprsm, "   Hour                               %9d\n", isec1[48]);
+          fprintf(grprsm, "   Minute                             %9d\n", isec1[49]);
+          fprintf(grprsm, "   Century                            %9d\n", isec1[50]);
+          fprintf(grprsm, "   Originating centre                 %9d\n", isec1[51]);
+          fprintf(grprsm, "   Sub-centre                         %9d\n", isec1[52]);
+        }
+      /*
+        ECMWF Local definition 12.
+      */
+      if (isec1[36] == 12)
+        {
+          fprintf(grprsm, " (Mean, average, etc)\n");
+          fprintf(grprsm, " Start date of the period              %8d\n", isec1[41]);
+          fprintf(grprsm, " Start time of the period                  %4.4d\n", isec1[42]);
+          fprintf(grprsm, " Finish date of the period             %8d\n", isec1[43]);
+          fprintf(grprsm, " Finish time of the period                 %4.4d\n", isec1[44]);
+          fprintf(grprsm, " Verifying date of the period          %8d\n", isec1[45]);
+          fprintf(grprsm, " Verifying time of the period              %4.4d\n", isec1[46]);
+          fprintf(grprsm, " Code showing method                   %8d\n", isec1[47]);
+          fprintf(grprsm, " Number of different time intervals used  %5d\n", isec1[48]);
+          fprintf(grprsm, " List of different time intervals used:\n");
+          iprev = isec1[49];
+          unsigned icount = 0;
+          for (int jloop = 1; jloop <= isec1[48]; jloop++)
+            {
+              icurr = isec1[48 + jloop];
+              if (icurr != iprev)
+                {
+                  if (icount == 1) fprintf(grprsm, "  - interval %5.4d used       once\n", iprev);
+                  if (icount == 2) fprintf(grprsm, "  - interval %5.4d used       twice\n", iprev);
+                  if (icount > 2) fprintf(grprsm, "  - interval %5.4d used %5u times\n", iprev, icount);
+                  iprev = icurr;
+                  icount = 1;
+                }
+              else
+                icount = icount + 1;
+            }
+          if (icount == 1) fprintf(grprsm, "  - interval %5.4d used       once\n", iprev);
+          if (icount == 2) fprintf(grprsm, "  - interval %5.4d used       twice\n", iprev);
+          if (icount > 2) fprintf(grprsm, "  - interval %5.4d used %5u times\n", iprev, icount);
+        }
+      /*
+        ECMWF Local definition 13.
+        (Wave 2D spectra direction and frequency)
+      */
+      if (isec1[36] == 13)
+        {
+          fprintf(grprsm, " Direction number                     %9d\n", isec1[43]);
+          fprintf(grprsm, " Frequency number                     %9d\n", isec1[44]);
+          fprintf(grprsm, " Total number of directions           %9d\n", isec1[45]);
+          fprintf(grprsm, " Total number of frequencies          %9d\n", isec1[46]);
+          fprintf(grprsm, " Scale factor applied to directions   %9d\n", isec1[47]);
+          fprintf(grprsm, " Scale factor applied to frequencies  %9d\n", isec1[48]);
+          fprintf(grprsm, " List of directions:\n");
+          for (int jloop = 1; jloop <= isec1[45]; jloop++)
+            {
+              value = (float) (isec1[48 + jloop]) / (float) (isec1[47]);
+              if (isec1[43] == jloop)
+                fprintf(grprsm, " %2.2d:%15.7f   <-- this field value\n", jloop, value);
+              else
+                fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value);
+            }
+          fprintf(grprsm, " List of frequencies:\n");
+          for (int jloop = 1; jloop <= isec1[46]; jloop++)
+            {
+              value = (float) (isec1[48 + isec1[45] + jloop]) / (float) (isec1[48]);
+              if (isec1[44] == jloop)
+                fprintf(grprsm, " %2.2d:%15.7f   <-- this field value\n", jloop, value);
+              else
+                fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value);
+
+              if (isec1[49 + isec1[45] + isec1[46]] != 0)
+                {
+                  fprintf(grprsm, " System number (65535 = missing)      %9d\n", isec1[49 + isec1[45] + isec1[46]]);
+                  fprintf(grprsm, " Method number (65535 = missing)      %9d\n", isec1[50 + isec1[45] + isec1[46]]);
+                }
+            }
+          /*
+            ECMWF Local definition 14.
+            (Brightness temperature)
+          */
+          if (isec1[36] == 14)
+            {
+              fprintf(grprsm, " Channel number                       %9d\n", isec1[43]);
+              fprintf(grprsm, " Scale factor applied to frequencies  %9d\n", isec1[44]);
+              fprintf(grprsm, " Total number of frequencies          %9d\n", isec1[45]);
+              fprintf(grprsm, " List of frequencies:\n");
+              for (int jloop = 1; jloop <= isec1[45]; jloop++)
+                {
+                  value = (float) (isec1[45 + jloop]) / (float) (isec1[44]);
+                  if (isec1[43] == jloop)
+                    fprintf(grprsm, " %3d:%15.9f   <-- this channel\n", jloop, value);
+                  else
+                    fprintf(grprsm, " %3d:%15.9f\n", jloop, value);
+                }
+            }
+          /*
+            ECMWF Local definition 15.
+            (Ocean ensemble seasonal forecast)
+          */
+          if (isec1[36] == 15)
+            {
+              fprintf(grprsm, " Ensemble member number               %9d\n", isec1[41]);
+              fprintf(grprsm, " System number                        %9d\n", isec1[42]);
+              fprintf(grprsm, " Method number                        %9d\n", isec1[43]);
+            }
+          /*
+            ECMWF Local definition 16.
+            (Seasonal forecast monthly mean atmosphere data)
+          */
+          if (isec1[36] == 16)
+            {
+              fprintf(grprsm, " Ensemble member number               %9d\n", isec1[41]);
+              fprintf(grprsm, " System number                        %9d\n", isec1[43]);
+              fprintf(grprsm, " Method number                        %9d\n", isec1[44]);
+              fprintf(grprsm, " Verifying month                      %9d\n", isec1[45]);
+              fprintf(grprsm, " Averaging period                     %9d\n", isec1[46]);
+            }
+          /*
+            ECMWF Local definition 17.
+            (Sst or sea-ice used by analysis)
+          */
+          if (isec1[36] == 17)
+            {
+              iyear = isec1[43];
+              if (iyear > 100)
+                {
+                  if (iyear < 19000000) iyear = iyear + 19000000;
+                  fprintf(grprsm, " Date of sst/ice field used           %9d\n", iyear);
+                }
+              else
+                fprintf(grprsm, " Date of sst/ice field used           Not given\n");
+
+              if (isec1[44] == 0) fprintf(grprsm, " Type of sst/ice field (= climatology)%9d\n", isec1[44]);
+              if (isec1[44] == 1) fprintf(grprsm, " Type of sst/ice field (= 1/1 degree) %9d\n", isec1[44]);
+              if (isec1[44] == 2) fprintf(grprsm, " Type of sst/ice field (= 2/2 degree) %9d\n", isec1[44]);
+
+              fprintf(grprsm, " Number of ICE fields used:           %9d\n", isec1[45]);
+
+              for (int jloop = 1; jloop < isec1[45]; jloop++)
+                {
+                  iyear = isec1[44 + (jloop * 2)];
+                  if (iyear > 100)
+                    {
+                      if (iyear < 19000000) iyear = iyear + 19000000;
+                      fprintf(grprsm, " Date of ICE field%3d                 %9d\n", jloop, iyear);
+                      fprintf(grprsm, " Satellite number (ICE field%3d)      %9d\n", jloop, isec1[45 + (jloop * 2)]);
+                    }
+                  else
+                    fprintf(grprsm, "Date of sst/ice field used           Not given\n");
+                }
+            }
+        }
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 3 . Print Washington ensemble product information.
+    -----------------------------------------------------------------
+  */
+  /*
+    Washington EPS products (but not reformatted Washington EPS
+    products.
+  */
+  if ((isec1[1] == 7 && isec1[23] == 1) && (!(ISEC1_SubCenterID == 98)))
+    {
+      /*   CALL KWPRS1 (iSEC0,iSEC1)*/
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 4 . Print local MPIM information.
+    -----------------------------------------------------------------
+  */
+  if (isec1[1] == 252 && isec1[36] == 1)
+    {
+      fprintf(grprsm, " MPIM local usage identifier.         %9d\n", isec1[36]);
+      fprintf(grprsm, " Type of ensemble forecast            %9d\n", isec1[37]);
+      fprintf(grprsm, " Individual ensemble member           %9d\n", isec1[38]);
+      fprintf(grprsm, " Number of forecasts in ensemble      %9d\n", isec1[39]);
+    }
+}
+
+static void
+printQuasi(int *isec2)
+{
+  /*
+
+    Print the qusai-regular information in the Grid Description
+    Section (Section 2) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec2 - Array of decoded integers from Section 2.
+
+    Comments:
+
+       Only data representation types catered for are Gaussian
+       grid, latitude/longitude grid, Spherical Harmonics,
+       Polar stereographic and Space view perspective.
+
+    Converted from EMOS routine PTQUASI.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+
+  char yout[64];
+
+  /*
+    -----------------------------------------------------------------
+    Section 1. Print quasi-grid data.
+    -----------------------------------------------------------------
+  */
+  // See if scanning is north->south or south->north
+  fprintf(grprsm, "  Number of points along a parallel varies.\n");
+
+  int ntos = (fmod((double) isec2[10], 128.) < 64);
+
+  if (ntos)
+    fprintf(grprsm, "  Number of points.   Parallel. (North to South)\n");
+  else
+    fprintf(grprsm, "  Number of points.   Parallel. (South to North)\n");
+
+  // Display number of points for each latitude
+  int latcnt = isec2[2];
+  int nextlat = 0;
+  memset(yout, ' ', (size_t) 11);
+
+  for (int j = 0; j < latcnt; ++j)
+    {
+      nextlat = nextlat + 1;
+      sprintf(yout, "%4d", nextlat);
+
+      // Finished?
+      if (nextlat > latcnt) break;
+      if (nextlat == latcnt)
+        {
+          fprintf(grprsm, " %5d                %-12s\n", isec2[nextlat + 21], yout);
+          break;
+        }
+      // Look for neighbouring latitudes with same number of points
+      unsigned nrepeat = 0;
+
+    LABEL110:
+      // If neighbouring latitudes have same number of points increase the repeat count.
+      if (isec2[nextlat + 21 + 1] == isec2[nextlat + 21])
+        {
+          nrepeat = nrepeat + 1;
+          nextlat = nextlat + 1;
+          if (nextlat < latcnt) goto LABEL110;
+        }
+      // Display neighbouring latitudes with same number of points as 'nn to mm'.
+      if (nrepeat >= 1) sprintf(yout + 4, "to %5d", nextlat);
+      fprintf(grprsm, " %5d                %-12s\n", isec2[nextlat + 21], yout);
+      memset(yout, ' ', (size_t) 11);
+    }
+}
+
+void
+gribPrintSec2DP(int *isec0, int *isec2, double *fsec2)
+{
+  /*
+
+    Print the information in the Grid Description
+    Section (Section 2) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec0  - Array of decoded integers from Section 0
+
+       isec2  - Array of decoded integers from Section 2
+
+       fsec2  - Array of decoded floats from Section 2
+
+    Comments:
+
+       Only data representation types catered for are Gaussian
+       grid, latitude/longitude grid, Spherical Harmonics,
+       Polar stereographic and Space view perspective.
+
+
+    Converted from EMOS routine GRPRS2.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+
+  int ibit, iedit, ierr, iout, iresol;
+
+  grsdef();
+  /*
+    -----------------------------------------------------------------
+    Section 1 . Print GRIB Edition number.
+    -----------------------------------------------------------------
+  */
+  iedit = isec0[1];
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " Section 2 - Grid Description Section.\n");
+  fprintf(grprsm, " -------------------------------------\n");
+  /*
+    -----------------------------------------------------------------
+    Section 2 . Print spherical harmonic data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80)
+    {
+      fprintf(grprsm, " Data represent type = spectral     (Table 6) %9d\n", isec2[0]);
+      fprintf(grprsm, " J - Pentagonal resolution parameter.         %9d\n", isec2[1]);
+      fprintf(grprsm, " K - Pentagonal resolution parameter.         %9d\n", isec2[2]);
+      fprintf(grprsm, " M - Pentagonal resolution parameter.         %9d\n", isec2[3]);
+      fprintf(grprsm, " Representation type (Table 9)                %9d\n", isec2[4]);
+      fprintf(grprsm, " Representation mode (Table 10).              %9d\n", isec2[5]);
+      for (int i = 7; i <= 11; ++i) fprintf(grprsm, " Not used.                                    %9d\n", isec2[i - 1]);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 3 . Print Gaussian grid data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 4 || isec2[0] == 14 || isec2[0] == 24 || isec2[0] == 34)
+    {
+      fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n");
+      fprintf(grprsm, " Data represent type = gaussian     (Table 6) %9d\n", isec2[0]);
+      /*
+        Quasi-regular grids introduced in Edition 1.
+      */
+      if (isec2[16] == 0 || iedit < 1)
+        fprintf(grprsm, " Number of points along a parallel.           %9d\n", isec2[1]);
+      else
+        printQuasi(isec2);
+
+      fprintf(grprsm, " Number of points along a meridian.           %9d\n", isec2[2]);
+      fprintf(grprsm, " Latitude of first grid point.                %9d\n", isec2[3]);
+      fprintf(grprsm, " Longitude of first grid point.               %9d\n", isec2[4]);
+
+      ibit = 8;
+      iresol = isec2[5] + isec2[17] + isec2[18];
+      prtbin(iresol, ibit, &iout, &ierr);
+
+      fprintf(grprsm, " Resolution and components flag.               %8.8d\n", iout);
+      fprintf(grprsm, " Latitude of last grid point.                 %9d\n", isec2[6]);
+      fprintf(grprsm, " Longitude of last grid point.                %9d\n", isec2[7]);
+      /*
+        Print increment if given.
+      */
+      if (isec2[5] == 128)
+        fprintf(grprsm, " i direction (East-West) increment.           %9d\n", isec2[8]);
+      else
+        fprintf(grprsm, " i direction (East-West) increment            Not given\n");
+
+      fprintf(grprsm, " Number of parallels between pole and equator.%9d\n", isec2[9]);
+
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 4 . Print Latitude / longitude grid data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 0 || isec2[0] == 10 || isec2[0] == 20 || isec2[0] == 30)
+    {
+      fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n");
+      fprintf(grprsm, " Data represent type = lat/long     (Table 6) %9d\n", isec2[0]);
+      /*
+        Quasi-regular lat/long grids also possible.
+      */
+      if (isec2[16] == 0)
+        fprintf(grprsm, " Number of points along a parallel.           %9d\n", isec2[1]);
+      else
+        printQuasi(isec2);
+
+      fprintf(grprsm, " Number of points along a meridian.           %9d\n", isec2[2]);
+      fprintf(grprsm, " Latitude of first grid point.                %9d\n", isec2[3]);
+      fprintf(grprsm, " Longitude of first grid point.               %9d\n", isec2[4]);
+
+      ibit = 8;
+      iresol = isec2[5] + isec2[17] + isec2[18];
+      prtbin(iresol, ibit, &iout, &ierr);
+
+      fprintf(grprsm, " Resolution and components flag.               %8.8d\n", iout);
+      fprintf(grprsm, " Latitude of last grid point.                 %9d\n", isec2[6]);
+      fprintf(grprsm, " Longitude of last grid point.                %9d\n", isec2[7]);
+      /*
+        Print increment if given.
+      */
+      if (isec2[8] < 0)
+        fprintf(grprsm, " i direction (East-West) increment            Not given\n");
+      else
+        fprintf(grprsm, " i direction (East-West) increment.           %9d\n", isec2[8]);
+
+      if (isec2[9] < 0)
+        fprintf(grprsm, " j direction (North-South) increment          Not given\n");
+      else
+        fprintf(grprsm, " j direction (North-South) increment.         %9d\n", isec2[9]);
+
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 5 . Print polar stereographic data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 5)
+    {
+      fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n");
+      fprintf(grprsm, " Data represent type = polar stereo (Table 6) %9d\n", isec2[0]);
+      fprintf(grprsm, " Number of points along X axis.               %9d\n", isec2[1]);
+      fprintf(grprsm, " Number of points along Y axis.               %9d\n", isec2[2]);
+      fprintf(grprsm, " Latitude of first grid point.                %9d\n", isec2[3]);
+      fprintf(grprsm, " Longitude of first grid point.               %9d\n", isec2[4]);
+      ibit = 8;
+      iresol = isec2[17] + isec2[18];
+      prtbin(iresol, ibit, &iout, &ierr);
+      fprintf(grprsm, " Resolution and components flag.               %8.8d\n", iout);
+      fprintf(grprsm, " Orientation of the grid.                     %9d\n", isec2[6]);
+      fprintf(grprsm, " X direction increment.                       %9d\n", isec2[8]);
+      fprintf(grprsm, " Y direction increment.                       %9d\n", isec2[9]);
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      fprintf(grprsm, " Projection centre flag.                      %9d\n", isec2[12]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 6 . Print Lambert conformal data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 3)
+    {
+      fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n");
+      fprintf(grprsm, " Data represent type = Lambert      (Table 6) %9d\n", isec2[0]);
+      fprintf(grprsm, " Number of points along X axis.               %9d\n", isec2[1]);
+      fprintf(grprsm, " Number of points along Y axis.               %9d\n", isec2[2]);
+      fprintf(grprsm, " Latitude of first grid point.                %9d\n", isec2[3]);
+      fprintf(grprsm, " Longitude of first grid point.               %9d\n", isec2[4]);
+      ibit = 8;
+      iresol = isec2[17] + isec2[18] + isec2[5];
+      prtbin(iresol, ibit, &iout, &ierr);
+      fprintf(grprsm, " Resolution and components flag.               %8.8d\n", iout);
+      fprintf(grprsm, " Orientation of the grid.                     %9d\n", isec2[6]);
+      fprintf(grprsm, " X direction increment.                       %9d\n", isec2[8]);
+      fprintf(grprsm, " Y direction increment.                       %9d\n", isec2[9]);
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      fprintf(grprsm, " Projection centre flag.                      %9d\n", isec2[12]);
+      fprintf(grprsm, " Latitude intersection 1 - Latin 1 -.         %9d\n", isec2[13]);
+      fprintf(grprsm, " Latitude intersection 2 - Latin 2 -.         %9d\n", isec2[14]);
+      fprintf(grprsm, " Latitude of Southern Pole.                   %9d\n", isec2[19]);
+      fprintf(grprsm, " Longitude of Southern Pole.                  %9d\n", isec2[20]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 7 . Print space view perspective or orthographic data.
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 90)
+    {
+      fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n");
+      fprintf(grprsm, " Data represent type = space/ortho  (Table 6) %9d\n", isec2[0]);
+      fprintf(grprsm, " Number of points along X axis.               %9d\n", isec2[1]);
+      fprintf(grprsm, " Number of points along Y axis.               %9d\n", isec2[2]);
+      fprintf(grprsm, " Latitude of sub-satellite point.             %9d\n", isec2[3]);
+      fprintf(grprsm, " Longitude of sub-satellite point.            %9d\n", isec2[4]);
+      // iresol = isec2[17] + isec2[18];
+      fprintf(grprsm, " Diameter of the earth in x direction.        %9d\n", isec2[6]);
+      fprintf(grprsm, " Y coordinate of sub-satellite point.         %9d\n", isec2[9]);
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      fprintf(grprsm, " Orientation of the grid.                     %9d\n", isec2[6]);
+      fprintf(grprsm, " Altitude of the camera.                      %9d\n", isec2[13]);
+      fprintf(grprsm, " Y coordinate of origin of sector image.      %9d\n", isec2[14]);
+      fprintf(grprsm, " X coordinate of origin of sector image.      %9d\n", isec2[15]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 7.5 . Print ocean data
+    -----------------------------------------------------------------
+  */
+  /*
+  if ( isec2[0] == 192 && ISEC1_CenterID == 98 )
+    {
+      fprintf(grprsm, " Data represent type = ECMWF ocean  (Table 6) %9d\n", isec2[0]);
+      if ( isec2[1] ==  32767 )
+        fprintf(grprsm, " Number of points along the first axis.       Not used\n");
+      else
+        fprintf(grprsm, " Number of points along the first axis.       %9d\n", isec2[1]);
+
+      if ( isec2[2] ==  32767 )
+        fprintf(grprsm, " Number of points along the second axis.      Not used\n");
+      else
+        fprintf(grprsm, " Number of points along the second axis.      %9d\n", isec2[2]);
+
+      ibit = 8;
+      prtbin(isec2[10], ibit, &iout, &ierr);
+      fprintf(grprsm, " Scanning mode flags (Code Table 8)            %8.8d\n", iout);
+      goto LABEL800;
+    }
+    */
+  /*
+    -----------------------------------------------------------------
+    Section 7.6 . Print triangular data
+    -----------------------------------------------------------------
+  */
+  if (isec2[0] == 192 /* && ISEC1_CenterID == 78 */)
+    {
+      fprintf(grprsm, " Data represent type = triangular   (Table 6) %9d\n", isec2[0]);
+      fprintf(grprsm, " Number of factor 2 in factorisation of Ni.   %9d\n", isec2[1]);
+      fprintf(grprsm, " Number of factor 3 in factorisation of Ni.   %9d\n", isec2[2]);
+      fprintf(grprsm, " Number of diamonds (Nd).                     %9d\n", isec2[3]);
+      fprintf(grprsm, " Number of triangular subdivisions of the\n");
+      fprintf(grprsm, "           icosahedron (Ni).                  %9d\n", isec2[4]);
+      fprintf(grprsm, " Flag for orientation of diamonds (Table A).  %9d\n", isec2[5]);
+      fprintf(grprsm, " Latitude of pole point.                      %9d\n", isec2[6]);
+      fprintf(grprsm, " Longitude of pole point.                     %9d\n", isec2[7]);
+      fprintf(grprsm, " Longitude of the first diamond.              %9d\n", isec2[8]);
+      fprintf(grprsm, " Flag for storage sequence (Table B).         %9d\n", isec2[9]);
+      fprintf(grprsm, " Number of vertical coordinate parameters.    %9d\n", isec2[11]);
+      goto LABEL800;
+    }
+  /*
+    -----------------------------------------------------------------
+    Drop through to here => representation type not catered for.
+    -----------------------------------------------------------------
+  */
+  fprintf(grprsm, "GRPRS2 :Data representation type not catered for -%d\n", isec2[0]);
+
+  goto LABEL900;
+  /*
+    -----------------------------------------------------------------
+    Section 8 . Print vertical coordinate parameters,
+                rotated grid information,
+                stretched grid information, if any.
+    -----------------------------------------------------------------
+  */
+LABEL800:;
+  /*
+    Vertical coordinate parameters ...
+  */
+  if (isec2[11] != 0)
+    {
+      fprintf(grprsm, " \n");
+      fprintf(grprsm, " Vertical Coordinate Parameters.\n");
+      fprintf(grprsm, " -------------------------------\n");
+      for (int i = 10; i < isec2[11] + 10; ++i) fprintf(grprsm, "    %20.12f\n", fsec2[i]);
+    }
+  /*
+    Rotated and stretched grids introduced in Edition 1.
+  */
+  if (iedit < 1) goto LABEL900;
+  /*
+    Rotated grid information ...
+  */
+  if (isec2[0] == 10 || isec2[0] == 30 || isec2[0] == 14 || isec2[0] == 34 || isec2[0] == 60 || isec2[0] == 80 || isec2[0] == 30)
+    {
+      fprintf(grprsm, " \n");
+      fprintf(grprsm, " Latitude of southern pole of rotation.       %9d\n", isec2[12]);
+      fprintf(grprsm, " Longitude of southern pole of rotation.      %9d\n", isec2[13]);
+      fprintf(grprsm, " Angle of rotation.                     %20.10f\n", fsec2[0]);
+    }
+  /*
+    Stretched grid information ...
+  */
+  if (isec2[0] == 20 || isec2[0] == 30 || isec2[0] == 24 || isec2[0] == 34 || isec2[0] == 70 || isec2[0] == 80)
+    {
+      fprintf(grprsm, " \n");
+      fprintf(grprsm, " Latitude of pole of stretching.              %9d\n", isec2[14]);
+      fprintf(grprsm, " Longitude of pole of stretching.             %9d\n", isec2[15]);
+      fprintf(grprsm, " Stretching factor.                     %20.10f\n", fsec2[1]);
+    }
+
+LABEL900:;
+
+  return;
+}
+
+void
+gribPrintSec2SP(int *isec0, int *isec2, float *fsec2sp)
+{
+  int inum = 10 + isec2[11];
+
+  double *fsec2 = (double *) Malloc((size_t) inum * sizeof(double));
+  if (fsec2 == NULL) SysError("No Memory!");
+
+  for (int j = 0; j < inum; ++j) fsec2[j] = fsec2sp[j];
+
+  gribPrintSec2DP(isec0, isec2, fsec2);
+
+  Free(fsec2);
+}
+
+void
+gribPrintSec3DP(int *isec0, int *isec3, double *fsec3)
+{
+  /*
+
+    Print the information in the Bit-Map Section
+    (Section 3) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec0  - Array of decoded integers from Section 0
+
+       isec3  - Array of decoded integers from Section 3
+
+       fsec3  - Array of decoded floats from Section 3
+
+
+    Converted from EMOS routine GRPRS3.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+
+  UNUSED(isec0);
+
+  grsdef();
+
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " Section 3 - Bit-map Section.\n");
+  fprintf(grprsm, " -------------------------------------\n");
+
+  if (isec3[0] != 0)
+    fprintf(grprsm, " Predetermined bit-map number.                %9d\n", isec3[0]);
+  else
+    fprintf(grprsm, " No predetermined bit-map.\n");
+
+  fprintf(grprsm, " Missing data value for integer data.    %14d\n", isec3[1]);
+
+  fprintf(grprsm, " Missing data value for real data. %20.6g\n", fsec3[1]);
+}
+
+void
+gribPrintSec3SP(int *isec0, int *isec3, float *fsec3sp)
+{
+  double fsec3[2];
+
+  fsec3[0] = fsec3sp[0];
+  fsec3[1] = fsec3sp[1];
+
+  gribPrintSec3DP(isec0, isec3, fsec3);
+}
+
+void
+gribPrintSec4DP(int *isec0, int *isec4, double *fsec4)
+{
+  /*
+
+    Print the information in the Binary Data Section
+    (Section 4) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec0  - Array of decoded integers from Section 0
+
+       isec4  - Array of decoded integers from Section 4
+
+       fsec4  - Array of decoded floats from Section 4
+
+
+    Converted from EMOS routine GRPRS4.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+  int inum;
+
+  UNUSED(isec0);
+
+  grsdef();
+
+  /*
+    -----------------------------------------------------------------
+    Section 1 . Print integer information from isec4.
+    -----------------------------------------------------------------
+  */
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " Section 4 - Binary Data  Section.\n");
+  fprintf(grprsm, " -------------------------------------\n");
+
+  fprintf(grprsm, " Number of data values coded/decoded.         %9d\n", isec4[0]);
+  fprintf(grprsm, " Number of bits per data value.               %9d\n", isec4[1]);
+  fprintf(grprsm, " Type of data       (0=grid pt, 128=spectral).%9d\n", isec4[2]);
+  fprintf(grprsm, " Type of packing    (0=simple, 64=complex).   %9d\n", isec4[3]);
+  fprintf(grprsm, " Type of data       (0=float, 32=integer).    %9d\n", isec4[4]);
+  fprintf(grprsm, " Additional flags   (0=none, 16=present).     %9d\n", isec4[5]);
+  fprintf(grprsm, " Reserved.                                    %9d\n", isec4[6]);
+  fprintf(grprsm, " Number of values   (0=single, 64=matrix).    %9d\n", isec4[7]);
+  fprintf(grprsm, " Secondary bit-maps (0=none, 32=present).     %9d\n", isec4[8]);
+  fprintf(grprsm, " Values width       (0=constant, 16=variable).%9d\n", isec4[9]);
+  /*
+    If complex packing ..
+  */
+  if (isec4[3] == 64)
+    {
+      if (isec4[2] == 128)
+        {
+          fprintf(grprsm, " Byte offset of start of packed data (N).     %9d\n", isec4[15]);
+          fprintf(grprsm, " Power (P * 1000).                            %9d\n", isec4[16]);
+          fprintf(grprsm, " Pentagonal resolution parameter J for subset.%9d\n", isec4[17]);
+          fprintf(grprsm, " Pentagonal resolution parameter K for subset.%9d\n", isec4[18]);
+          fprintf(grprsm, " Pentagonal resolution parameter M for subset.%9d\n", isec4[19]);
+        }
+      else
+        {
+          fprintf(grprsm, " Bits number of 2nd order values    (none=>0).%9d\n", isec4[10]);
+          fprintf(grprsm, " General extend. 2-order packing (0=no,8=yes).%9d\n", isec4[11]);
+          fprintf(grprsm, " Boustrophedonic ordering        (0=no,4=yes).%9d\n", isec4[12]);
+          fprintf(grprsm, " Spatial differencing order          (0=none).%9d\n", isec4[13] + isec4[14]);
+        }
+    }
+  /*
+    Number of non-missing values
+  */
+  if (isec4[20] != 0) fprintf(grprsm, " Number of non-missing values                 %9d\n", isec4[20]);
+  /*
+    Information on matrix of values , if present.
+  */
+  if (isec4[7] == 64)
+    {
+      fprintf(grprsm, " First dimension (rows) of each matrix.       %9d\n", isec4[49]);
+      fprintf(grprsm, " Second dimension (columns) of each matrix.   %9d\n", isec4[50]);
+      fprintf(grprsm, " First dimension coordinate values definition.%9d\n", isec4[51]);
+      fprintf(grprsm, " (Code Table 12)\n");
+      fprintf(grprsm, " NC1 - Number of coefficients for 1st dimension.%7d\n", isec4[52]);
+      fprintf(grprsm, " Second dimension coordinate values definition.%8d\n", isec4[53]);
+      fprintf(grprsm, " (Code Table 12)\n");
+      fprintf(grprsm, " NC2 - Number of coefficients for 2nd dimension.%7d\n", isec4[54]);
+      fprintf(grprsm, " 1st dimension physical signifance (Table 13). %8d\n", isec4[55]);
+      fprintf(grprsm, " 2nd dimension physical signifance (Table 13).%8d\n", isec4[56]);
+    }
+  /*
+    -----------------------------------------------------------------
+    Section 2. Print values from fsec4.
+    -----------------------------------------------------------------
+  */
+
+  inum = isec4[0];
+  if (inum < 0) inum = -inum;
+  if (inum > 20) inum = 20;
+  /*
+    Print first inum values.
+  */
+  fprintf(grprsm, " \n");
+  fprintf(grprsm, " First %4d data values.\n", inum);
+
+  if (isec4[4] == 0)
+    {
+      /*
+        Print real values ...
+      */
+      for (int j = 0; j < inum; ++j)
+        {
+          if (fabs(fsec4[j]) > 0)
+            {
+              if (fabs(fsec4[j]) >= 0.1 && fabs(fsec4[j]) <= 1.e8)
+                fprintf(grprsm, " %#16.8G    \n", fsec4[j]);
+              else
+                fprintf(grprsm, " %#20.8E\n", fsec4[j]);
+            }
+          else
+            fprintf(grprsm, " %#16.0f    \n", fabs(fsec4[j]));
+        }
+    }
+  else
+    {
+      /*
+        Print integer values ...
+      */
+      fprintf(grprsm, " Print of integer values not supported\n");
+      /*
+        CALL SETPAR(IBIT,IDUM,IDUM)
+        DO 212 J=1,INUM
+           INSPT = 0
+           CALL INXBIT(IVALUE,1,INSPT,FSEC4(J),1,IBIT,IBIT,'C',IRET)
+           WRITE (*,9033) IVALUE
+ 9033 FORMAT(' ',I15)
+  212   CONTINUE
+      ENDIF
+      */
+    }
+}
+
+void
+gribPrintSec4SP(int *isec0, int *isec4, float *fsec4sp)
+{
+  double fsec4[20];
+
+  int inum = isec4[0];
+  if (inum < 0) inum = -inum;
+  if (inum > 20) inum = 20;
+
+  for (int j = 0; j < inum; ++j) fsec4[j] = fsec4sp[j];
+
+  gribPrintSec4DP(isec0, isec4, fsec4);
+}
+
+void
+gribPrintSec4Wave(int *isec4)
+{
+  /*
+
+    Print the wave coordinate information in the Binary Data
+    Section (Section 4) of decoded GRIB data.
+
+    Input Parameters:
+
+       isec4 - Array of decoded integers from Section 4
+
+    Comments:
+
+       Wave coordinate information held in isec4 are 32-bit floats,
+       hence the PTEMP and NTEMP used for printing are 4-byte variables.
+
+
+    Converted from EMOS routine GRPRS4W.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+  int ntemp[100];
+  float *ptemp;
+
+  grsdef();
+
+  /*
+    -----------------------------------------------------------------
+    Section 1 . Print integer information from isec4.
+    -----------------------------------------------------------------
+  */
+  fprintf(grprsm, " Coefficients defining first dimension coordinates:\n");
+  for (int jloop = 0; jloop < isec4[52]; jloop++)
+    {
+      ntemp[jloop] = isec4[59 + jloop];
+      ptemp = (float *) &ntemp[jloop];
+      fprintf(grprsm, "%20.10f\n", *ptemp);
+    }
+  fprintf(grprsm, " Coefficients defining second dimension coordinates:\n");
+  for (int jloop = 0; jloop < isec4[54]; jloop++)
+    {
+      ntemp[jloop] = isec4[59 + isec4[52] + jloop];
+      ptemp = (float *) &ntemp[jloop];
+      fprintf(grprsm, "%20.10f\n", *ptemp);
+    }
+}
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <string.h>
+#include <ctype.h>
+
+int
+gribOpen(const char *filename, const char *mode)
+{
+  int fileID = fileOpen(filename, mode);
+
+#if defined(__sun)
+  if (fileID != FILE_UNDEFID && tolower(*mode) == 'r')
+    {
+      fileSetBufferType(fileID, FILE_BUFTYPE_MMAP);
+    }
+#endif
+
+  return fileID;
+}
+
+void
+gribClose(int fileID)
+{
+  fileClose(fileID);
+}
+
+off_t
+gribGetPos(int fileID)
+{
+  return fileGetPos(fileID);
+}
+
+int
+gribCheckSeek(int fileID, long *offset, int *version)
+{
+  int ierr = gribFileSeek(fileID, offset);
+
+  *version = -1;
+  if (!ierr)
+    {
+      char buffer[4];
+      if (fileRead(fileID, buffer, 4) == 4) *version = buffer[3];
+    }
+
+  return ierr;
+}
+
+int
+gribFileSeek(int fileID, long *offset)
+{
+  /* position file pointer after GRIB */
+  const long GRIB = 0x47524942;
+  long code = 0;
+  int ch;
+  int retry = 4096 * 4096;
+
+  *offset = 0;
+
+  void *fileptr = filePtr(fileID);
+
+  while (retry--)
+    {
+      ch = filePtrGetc(fileptr);
+      if (ch == EOF) return -1;
+
+      code = ((code << 8) + ch) & 0xFFFFFFFF;
+      if (code == GRIB)
+        {
+          if (CGRIBEX_Debug) Message("record offset = %ld", *offset);
+          return 0;
+        }
+
+      (*offset)++;
+    }
+
+  if (CGRIBEX_Debug) Message("record offset = %ld", *offset);
+
+  return 1;
+}
+
+static inline unsigned
+read3ByteMSBFirst(void *fileptr)
+{
+  unsigned b1 = (unsigned) (filePtrGetc(fileptr));
+  unsigned b2 = (unsigned) (filePtrGetc(fileptr));
+  unsigned b3 = (unsigned) (filePtrGetc(fileptr));
+  return GET_UINT3(b1, b2, b3);
+}
+
+size_t
+gribReadSize(int fileID)
+{
+  size_t rgribsize = 0;
+  void *fileptr = filePtr(fileID);
+  off_t pos = fileGetPos(fileID);
+
+  unsigned gribsize = read3ByteMSBFirst(fileptr);
+
+  int gribversion = filePtrGetc(fileptr);
+
+  if (gribsize == 24 && gribversion != 1 && gribversion != 2) gribversion = 0;
+
+  if (CGRIBEX_Debug) Message("gribversion = %d", gribversion);
+
+  if (gribversion == 0)
+    {
+      unsigned gdssize = 0, bmssize = 0;
+      unsigned issize = 4, essize = 4;
+
+      unsigned pdssize = gribsize;
+      fileSetPos(fileID, (off_t) 3, SEEK_CUR);
+      if (CGRIBEX_Debug) Message("pdssize     = %u", pdssize);
+      int flag = filePtrGetc(fileptr);
+      if (CGRIBEX_Debug) Message("flag        = %d", flag);
+
+      fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR);
+
+      if (flag & 128)
+        {
+          gdssize = read3ByteMSBFirst(fileptr);
+          fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR);
+          if (CGRIBEX_Debug) Message("gdssize     = %u", gdssize);
+        }
+
+      if (flag & 64)
+        {
+          bmssize = read3ByteMSBFirst(fileptr);
+          fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR);
+          if (CGRIBEX_Debug) Message("bmssize     = %u", bmssize);
+        }
+
+      unsigned bdssize = read3ByteMSBFirst(fileptr);
+      if (CGRIBEX_Debug) Message("bdssize     = %u", bdssize);
+
+      gribsize = issize + pdssize + gdssize + bmssize + bdssize + essize;
+      rgribsize = (size_t) gribsize;
+    }
+  else if (gribversion == 1)
+    {
+      if (gribsize > JP23SET)  // Large GRIB record
+        {
+          unsigned pdssize = read3ByteMSBFirst(fileptr);
+          if (CGRIBEX_Debug) Message("pdssize     = %u", pdssize);
+
+          int flag = 0;
+          for (int i = 0; i < 5; ++i) flag = filePtrGetc(fileptr);
+          if (CGRIBEX_Debug) Message("flag        = %d", flag);
+
+          fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR);
+
+          unsigned gdssize = 0;
+          if (flag & 128)
+            {
+              gdssize = read3ByteMSBFirst(fileptr);
+              fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR);
+              if (CGRIBEX_Debug) Message("gdssize     = %u", gdssize);
+            }
+
+          unsigned bmssize = 0;
+          if (flag & 64)
+            {
+              bmssize = read3ByteMSBFirst(fileptr);
+              fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR);
+              if (CGRIBEX_Debug) Message("bmssize     = %u", bmssize);
+            }
+
+          unsigned bdssize = read3ByteMSBFirst(fileptr);
+          if (CGRIBEX_Debug) Message("bdssize     = %u", bdssize);
+          if (bdssize <= 120)
+            {
+              enum
+              {
+                issize = 4
+              };
+              gribsize &= JP23SET;
+              gribsize *= 120;
+              bdssize = correct_bdslen(bdssize, gribsize, issize + pdssize + gdssize + bmssize);
+              if (CGRIBEX_Debug) Message("bdssize     = %u", bdssize);
+
+              gribsize = issize + pdssize + gdssize + bmssize + bdssize + 4;
+            }
+        }
+      rgribsize = (size_t) gribsize;
+    }
+  else if (gribversion == 2)
+    {
+      /* we set gribsize the following way because it doesn't matter then
+         whether int is 4 or 8 bytes long - we don't have to care if the size
+         really fits: if it does not, the record can not be read at all */
+      rgribsize = 0;
+      enum
+      {
+        g2size_bytes = 8
+      };
+      unsigned char g2size[g2size_bytes];
+      filePtrRead(fileptr, g2size, g2size_bytes);
+      for (int i = 0; i < g2size_bytes; ++i) rgribsize = (rgribsize << 8) | g2size[i];
+    }
+  else
+    {
+      rgribsize = 0;
+      Warning("GRIB version %d unsupported!", gribversion);
+    }
+
+  if (filePtrEOF(fileptr)) rgribsize = 0;
+
+  if (CGRIBEX_Debug) Message("gribsize = %zu", rgribsize);
+
+  fileSetPos(fileID, pos, SEEK_SET);
+
+  return rgribsize;
+}
+
+size_t
+gribGetSize(int fileID)
+{
+  long offset;
+  int ierr = gribFileSeek(fileID, &offset);  // position file pointer after GRIB
+  if (ierr > 0)
+    {
+      Warning("GRIB record not found!");
+      return 0;
+    }
+
+  if (ierr == -1)
+    return 0;
+  else if (ierr == 1)
+    return 0;
+
+  size_t recSize = gribReadSize(fileID);
+
+  if (CGRIBEX_Debug) Message("recsize = %zu", recSize);
+
+  fileSetPos(fileID, (off_t) -4, SEEK_CUR);
+
+  return recSize;
+}
+
+int
+gribRead(int fileID, void *buffer, size_t *buffersize)
+{
+  long offset;
+  int ierr = gribFileSeek(fileID, &offset);  // position file pointer after GRIB
+  if (ierr > 0)
+    {
+      Warning("GRIB record not found!");
+      return -2;
+    }
+
+  if (ierr == -1)
+    {
+      *buffersize = 0;
+      return -1;
+    }
+  else if (ierr == 1)
+    {
+      *buffersize = 0;
+      return -2;
+    }
+
+  size_t recSize = gribReadSize(fileID);
+  size_t readSize = recSize;
+
+  if (readSize > *buffersize)
+    {
+      readSize = *buffersize;
+      ierr = -3;  // Tell the caller that the buffer was insufficient.
+    }
+
+  *buffersize = recSize;  // Inform the caller about the record size.
+
+  // Write the stuff to the buffer that has already been read in gribFileSeek().
+  memcpy(buffer, "GRIB", 4);
+
+  readSize -= 4;
+  // Read the rest of the record into the buffer.
+  size_t nread = fileRead(fileID, (char *) buffer + 4, readSize);
+
+  if (nread != readSize) ierr = 1;
+
+  return ierr;
+}
+
+int
+gribWrite(int fileID, void *buffer, size_t buffersize)
+{
+  int nwrite = (int) (fileWrite(fileID, buffer, buffersize));
+  if (nwrite != (int) buffersize)
+    {
+      perror(__func__);
+      nwrite = -1;
+    }
+
+  return nwrite;
+}
+#include <string.h>
+#include <ctype.h>
+
+FILE *grprsm = NULL;
+int CGRIBEX_grib_calendar = -1;
+
+void
+gribSetCalendar(int calendar)
+{
+  CGRIBEX_grib_calendar = calendar;
+}
+
+void
+grsdef(void)
+{
+  /*
+C---->
+C**** GRSDEF - Initial (default) setting of common area variables
+C              for GRIBEX package.
+C
+C     Purpose.
+C     --------
+C
+C     Sets initial values for common area variables for all
+C     routines of GRIBEX package, if not already done.
+C
+C**   Interface.
+C     ----------
+C
+C     CALL GRSDEF
+C
+C     Input Parameters.
+C     -----------------
+C
+C     None.
+C
+C     Output Parameters.
+C     ------------------
+C
+C     None.
+C
+C     Method.
+C     -------
+C
+C     Self-explanatory.
+C
+C     Externals.
+C     ----------
+C
+C     None.
+C
+C     Reference.
+C     ----------
+C
+C     See subroutine GRIBEX.
+C
+C     Comments.
+C     ---------
+C
+C     None
+C
+C     Author.
+C     -------
+C
+C     J. Clochard, Meteo France, for ECMWF - March 1998.
+C
+C     Modifications.
+C     --------------
+C
+C     J. Clochard, Meteo France, for ECMWF - June 1999.
+C     Add variable NSUBCE.
+C     Use a static variable to determine if initialisation has already
+C     been done. NUSER removed .
+C     Reverse defaults for NEXT2O and NLOC2O, for consistency with
+C     version 13.023 of software .
+C
+  */
+  /*
+C     ----------------------------------------------------------------
+C*    Section 0 . Definition of variables.
+C     ----------------------------------------------------------------
+  */
+  char *envString;
+  char *env_stream;
+  static bool lfirst = true;
+  extern int CGRIBEX_Const;
+
+  if (!lfirst) return;
+
+  /*
+    ----------------------------------------------------------------
+    Section 1 . Set values, conditionally.
+    ----------------------------------------------------------------
+  */
+  /*
+    Common area variables have not been set. Set them.
+  */
+  /*
+    Set GRIB calendar.
+  */
+  if (CGRIBEX_grib_calendar == -1)
+    {
+      CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC;
+
+      envString = getenv("GRIB_CALENDAR");
+      if (envString)
+        {
+          if (strncmp(envString, "standard", 8) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_STANDARD;
+          else if (strncmp(envString, "proleptic", 9) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC;
+          else if (strncmp(envString, "360days", 7) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_360DAYS;
+          else if (strncmp(envString, "365days", 7) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_365DAYS;
+          else if (strncmp(envString, "366days", 7) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_366DAYS;
+          else if (strncmp(envString, "none", 4) == 0)
+            CGRIBEX_grib_calendar = CALENDAR_NONE;
+        }
+    }
+  /*
+    Set GRIBEX compatibility mode.
+  */
+  envString = getenv("GRIB_GRIBEX_MODE_ON");
+  if (envString != NULL)
+    {
+      if (atoi(envString) == 1) CGRIBEX_Const = 0;
+    }
+
+  /*
+    See if output stream needs changing
+  */
+  grprsm = stdout;
+  env_stream = getenv("GRPRS_STREAM");
+  if (env_stream)
+    {
+      if (isdigit((int) env_stream[0]))
+        {
+          int unit;
+          unit = atoi(env_stream);
+          if (unit < 1 || unit > 99)
+            Warning("Invalid number for GRPRS_STREAM: %d", unit);
+          else if (unit == 2)
+            grprsm = stderr;
+          else if (unit == 6)
+            grprsm = stdout;
+          else
+            {
+              char filename[] = "unit.00";
+              sprintf(filename, "%2.2d", unit);
+              grprsm = fopen(filename, "w");
+              if (!grprsm) SysError("GRPRS_STREAM = %d", unit);
+            }
+        }
+      else
+        {
+          if (env_stream[0])
+            {
+              grprsm = fopen(env_stream, "w");
+              if (!grprsm) SysError("GRPRS_STREAM = %s", env_stream);
+            }
+        }
+    }
+  /*
+    Mark common area values set by user.
+  */
+  lfirst = false;
+}
+
+// clang-format off
+
+/* pack 8-bit bytes from 64-bit words to a packed buffer */
+/* same as : for (int i = 0; i < bc; ++i) cp[i] = (unsigned char) up[i]; */
+
+long packInt64(uint64_t *up, unsigned char *cp, long bc, long tc)
+{
+#if defined (CRAY)
+  (void) _pack(up, cp, bc, tc);
+#else
+  unsigned char *cp0;
+  uint64_t upi, *up0, *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7;
+  long ipack = sizeof(int64_t);
+  
+  // Bytes until first word boundary in destination buffer
+
+  long head = ( (long) cp ) & (ipack-1);
+  if ( head != 0 ) head = ipack - head;
+
+  long inner = bc - head;
+
+  // Trailing bytes which do not make a full word
+
+  long trail = inner & (ipack-1);
+
+  // Number of bytes/words to be processed in fast loop
+
+  inner -= trail;
+  inner /= ipack;
+
+  ip0 = up + head;
+  ip1 = ip0 + 1;
+  ip2 = ip0 + 2;
+  ip3 = ip0 + 3;
+  ip4 = ip0 + 4;
+  ip5 = ip0 + 5;
+  ip6 = ip0 + 6;
+  ip7 = ip0 + 7;
+
+  up0 = (uint64_t *)(void *)(cp + head);
+
+  /* Here we should process any bytes until the first word boundary 
+   * of our destination buffer 
+   * That code is missing so far  because our output buffer is 
+   * word aligned by FORTRAN 
+   */
+
+  long j = 0;
+
+  if ( IS_BIGENDIAN() )
+    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+      for (long i = 0; i < inner; ++i)
+	{
+	  upi =             (   ip0[j]          << 56 ) 
+	                 |  ( ( ip1[j] & 0xFF ) << 48 )
+	                 |  ( ( ip2[j] & 0xFF ) << 40 )
+	                 |  ( ( ip3[j] & 0xFF ) << 32 )
+	                 |  ( ( ip4[j] & 0xFF ) << 24 ) ;
+	  up0[i] = upi   |  ( ( ip5[j] & 0xFF ) << 16 )
+	                 |  ( ( ip6[j] & 0xFF ) <<  8 )
+	                 |    ( ip7[j] & 0xFF ) ;
+	  j += ipack;
+	}
+    }
+  else
+    {
+      for (long i = 0; i < inner; ++i)
+	{
+	  upi =             (   ip7[j]          << 56 ) 
+	                 |  ( ( ip6[j] & 0xFF ) << 48 )
+                         |  ( ( ip5[j] & 0xFF ) << 40 )
+                         |  ( ( ip4[j] & 0xFF ) << 32 )
+                         |  ( ( ip3[j] & 0xFF ) << 24 ) ;
+	  up0[i] = upi   |  ( ( ip2[j] & 0xFF ) << 16 )
+                         |  ( ( ip1[j] & 0xFF ) <<  8 )
+                         |    ( ip0[j] & 0xFF ) ;
+	  j += ipack;
+	}
+    }
+
+  cp0 = (unsigned char *) ( up0 + inner );
+  if ( trail > 0 )
+    {
+      up0[inner] = 0;
+      for (long i = 0; i < trail ; ++i)
+	{
+	  *cp0 = (unsigned char) ip0[ipack*inner+i];
+	  cp0++;
+	}
+    }
+
+  if ( tc != -1 )
+    {
+      bc++;
+      *cp0 = (unsigned char) tc;
+    }
+#endif
+  return (bc);
+}
+
+/* unpack 8-bit bytes from a packed buffer with 64-bit words */
+/* same as : for (int i = 0; i < bc; ++i) up[i] = (int64_t) cp[i]; */
+
+long unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc)
+{
+  const unsigned char *cp0;
+  uint64_t *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7;
+  long offset;
+  long ipack = sizeof(int64_t);
+
+  UNUSED(tc);
+
+  // Bytes until first word boundary in source buffer
+
+  long head = ( (long) cp ) & (ipack-1);
+  if ( head != 0 ) head = ipack - head;
+  if ( head > bc ) head = bc;
+
+  long inner = bc - head;
+
+  // Trailing bytes which do not make a full word
+ 
+  long trail = inner & (ipack-1);
+ 
+  // Number of bytes/words to be processed in fast loop
+
+  inner -= trail;
+  inner /= ipack;
+
+  ip0 = up + head;
+  ip1 = ip0 + 1;
+  ip2 = ip0 + 2;
+  ip3 = ip0 + 3;
+  ip4 = ip0 + 4;
+  ip5 = ip0 + 5;
+  ip6 = ip0 + 6;
+  ip7 = ip0 + 7;
+
+  const uint64_t *up0 = (const uint64_t *)(const void *)(cp + head);
+
+  /* Process any bytes until the first word boundary 
+   * of our source buffer 
+   */
+  for (long i = 0; i < head; ++i) up[i] = (uint64_t) cp[i];
+
+  long j = 0;
+
+  if ( IS_BIGENDIAN() )
+    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+      for (long i = 0; i < inner; ++i)
+	{
+	  ip0[j] = (up0[i] >> 56) & 0xFF;
+	  ip1[j] = (up0[i] >> 48) & 0xFF;
+	  ip2[j] = (up0[i] >> 40) & 0xFF;
+	  ip3[j] = (up0[i] >> 32) & 0xFF;
+	  ip4[j] = (up0[i] >> 24) & 0xFF;
+	  ip5[j] = (up0[i] >> 16) & 0xFF;
+	  ip6[j] = (up0[i] >>  8) & 0xFF;
+	  ip7[j] = (up0[i])       & 0xFF;
+
+	  j += ipack;
+	}
+    }
+  else
+    {
+      for (long i = 0; i < inner; ++i)
+	{
+	  ip7[j] = (up0[i] >> 56) & 0xFF;
+	  ip6[j] = (up0[i] >> 48) & 0xFF;
+	  ip5[j] = (up0[i] >> 40) & 0xFF;
+	  ip4[j] = (up0[i] >> 32) & 0xFF;
+	  ip3[j] = (up0[i] >> 24) & 0xFF;
+	  ip2[j] = (up0[i] >> 16) & 0xFF;
+	  ip1[j] = (up0[i] >>  8) & 0xFF;
+	  ip0[j] = (up0[i])       & 0xFF;
+
+	  j += ipack;
+	}
+    }
+
+  if ( trail > 0 )
+    {
+      offset = head + ipack*inner;
+      cp0 = cp + offset;
+      for (long i = 0; i < trail; ++i) up[i+offset] = (uint64_t) cp0[i];
+    }
+  /*
+  if ( tc != -1 ) {
+    bc++;
+    *cp0 = (unsigned char) tc;
+  }
+  */
+  return bc;
+}
+
+/* pack 8-bit bytes from 32-bit words to a packed buffer */
+/* same as : for (int i = 0; i < bc; ++i) cp[i] = (char) up[i]; */
+
+long packInt32(uint32_t  *up, unsigned char *cp, long bc, long tc)
+{
+  unsigned char *cp0;
+  uint32_t *up0, *ip0, *ip1, *ip2, *ip3;
+  long ipack = sizeof(int32_t);
+  
+  // Bytes until first word boundary in destination buffer
+
+  long head = ( (long) cp ) & (ipack-1);
+  if ( head != 0 ) head = ipack - head;
+
+  long inner = bc - head;
+
+  // Trailing bytes which do not make a full word
+
+  long trail = inner & (ipack-1);
+
+  // Number of bytes/words to be processed in fast loop
+
+  inner -= trail;
+  inner /= ipack;
+
+  ip0 = up + head;
+  ip1 = ip0 + 1;
+  ip2 = ip0 + 2;
+  ip3 = ip0 + 3;
+
+  up0 = (uint32_t *)(void *)(cp + head);
+
+  /* Here we should process any bytes until the first word boundary 
+   * of our destination buffer 
+   * That code is missing so far  because our output buffer is 
+   * word aligned by FORTRAN 
+   */
+
+  long j = 0;
+
+  if ( IS_BIGENDIAN() )
+    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+      for (long i = 0; i < inner; ++i)
+	{
+	  up0[i] =          (   ip0[j]          << 24 ) 
+	                 |  ( ( ip1[j] & 0xFF ) << 16 )
+	                 |  ( ( ip2[j] & 0xFF ) <<  8 )
+	                 |    ( ip3[j] & 0xFF ) ;
+	  j += ipack;
+	}
+    }
+  else
+    {
+      for (long i = 0; i < inner; ++i)
+	{
+	  up0[i] =          (   ip3[j]          << 24 ) 
+	                 |  ( ( ip2[j] & 0xFF ) << 16 )
+                         |  ( ( ip1[j] & 0xFF ) <<  8 )
+                         |    ( ip0[j] & 0xFF ) ;
+	  j += ipack;
+	}
+    }
+
+  cp0 = (unsigned char *) ( up0 + inner );
+  if ( trail > 0 )
+    {
+      up0[inner] = 0;
+      for (long i = 0; i < trail; ++i)
+	{
+	  *cp0 = (unsigned char) ip0[ipack*inner+i];
+	  cp0++;
+	}
+    }
+
+  if ( tc != -1 )
+    {
+      bc++;
+      *cp0 = (unsigned char) tc;
+    }
+
+  return (bc);
+}
+
+/* unpack 8-bit bytes from a packed buffer with 32-bit words */
+/* same as : for (int i = 0; i < bc; ++i) up[i] = (int32_t) cp[i]; */
+
+long unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc)
+{
+  const unsigned char *cp0;
+  uint32_t *ip0, *ip1, *ip2, *ip3;
+  long offset;
+  long ipack = sizeof(int32_t);
+
+  UNUSED(tc);
+
+  // Bytes until first word boundary in source buffer
+
+  long head = ( (long) cp ) & (ipack-1);
+  if ( head != 0 ) head = ipack - head;
+  if ( head > bc ) head = bc;
+
+  long inner = bc - head;
+
+  // Trailing bytes which do not make a full word
+ 
+  long trail = inner & (ipack-1);
+ 
+  // Number of bytes/words to be processed in fast loop
+
+  inner -= trail;
+  inner /= ipack;
+
+  ip0 = up + head;
+  ip1 = ip0 + 1;
+  ip2 = ip0 + 2;
+  ip3 = ip0 + 3;
+
+  const uint32_t *up0 = (const uint32_t *)(const void *)(cp + head);
+
+  /* Process any bytes until the first word boundary 
+   * of our source buffer 
+   */
+  for (long i = 0; i < head; ++i) up[i] = (uint32_t) cp[i];
+
+  long j = 0;
+
+  if ( IS_BIGENDIAN() )
+    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+      for (long i = 0; i < inner; ++i)
+	{
+	  ip0[j] = (up0[i] >> 24) & 0xFF;
+	  ip1[j] = (up0[i] >> 16) & 0xFF;
+	  ip2[j] = (up0[i] >>  8) & 0xFF;
+	  ip3[j] = (up0[i])       & 0xFF;
+
+	  j += ipack;
+	}
+    }
+  else
+    {
+      for (long i = 0; i < inner; ++i)
+	{
+	  ip3[j] = (up0[i] >> 24) & 0xFF;
+	  ip2[j] = (up0[i] >> 16) & 0xFF;
+	  ip1[j] = (up0[i] >>  8) & 0xFF;
+	  ip0[j] = (up0[i])       & 0xFF;
+
+	  j += ipack;
+	}
+    }
+
+  if ( trail > 0 )
+    {
+      offset = head + ipack*inner;
+      cp0 = cp + offset;
+      for (long i = 0; i < trail; ++i) up[i+offset] = (uint32_t) cp0[i];
+    }
+  /*
+  if ( tc != -1 ) {
+    bc++;
+    *cp0 = (unsigned char) tc;
+  }
+  */
+
+  return (bc);
+}
+
+// clang-format on
+#include <stdio.h>
+
+void
+prtbin(int kin, int knbit, int *kout, int *kerr)
+{
+  /*
+
+    Produces a decimal number with ones and zeroes
+    corresponding to the ones and zeroes of the input
+    binary number.
+    eg input number 1011 binary, output number 1011 decimal.
+
+
+    Input Parameters:
+
+       kin   - Integer variable containing binary number.
+
+       knbit - Number of bits in binary number.
+
+    Output Parameters:
+
+       kout  - Integer variable containing decimal value
+               with ones and zeroes corresponding to those of
+               the input binary number.
+
+       kerr  - 0, If no error.
+               1, Number of bits in binary number exceeds
+                  maximum allowed or is less than 1.
+
+
+    Converted from EMOS routine PRTBIN.
+
+       Uwe Schulzweida   MPIfM   01/04/2001
+
+  */
+  int idec;
+  int ik;
+  int itemp;
+
+  /*
+    Check length of binary number to ensure decimal number
+    generated will fit in the computer word - in this case will
+    it fit in a Cray 48 bit integer?
+  */
+  if (knbit < 1 || knbit > 14)
+    {
+      *kerr = 1;
+      printf(" prtbin : Error in binary number length - %3d bits.\n", knbit);
+      return;
+    }
+  else
+    *kerr = 0;
+  /*
+    -----------------------------------------------------------------
+    Section 1. Generate required number.
+    -----------------------------------------------------------------
+  */
+  *kout = 0;
+  ik = kin;
+  idec = 1;
+
+  for (int j = 0; j < knbit; ++j)
+    {
+      itemp = ik - ((ik / 2) * 2);
+      *kout = (*kout) + itemp * idec;
+      ik = ik / 2;
+      idec = idec * 10;
+    }
+
+  return;
+}
+
+void
+ref2ibm(double *pref, int kbits)
+{
+  /*
+
+    Purpose:
+    --------
+
+    Code and check reference value in IBM format
+
+    Input Parameters:
+    -----------------
+
+    pref       - Reference value
+    kbits      - Number of bits per computer word.
+
+    Output Parameters:
+    ------------------
+
+    pref       - Reference value
+
+    Method:
+    -------
+
+    Codes in IBM format, then decides to ensure that reference
+    value used for packing is not different from that stored
+    because of packing differences.
+
+    Externals.
+    ----------
+
+    confp3    - Encode into IBM floating point format.
+    decfp2    - Decode from IBM floating point format.
+
+    Reference:
+    ----------
+
+    None.
+
+    Comments:
+    --------
+
+    None.
+
+    Author:
+    -------
+
+    J.D.Chambers     ECMWF      17:05:94
+
+    Modifications:
+    --------------
+
+    Uwe Schulzweida   MPIfM   01/04/2001
+
+    Convert to C from EMOS library version 130
+
+  */
+
+  int itrnd;
+  int kexp, kmant;
+  double ztemp, zdumm;
+  extern int CGRIBEX_Debug;
+
+  /* ----------------------------------------------------------------- */
+  /*   Section 1. Convert to and from IBM format.                      */
+  /* ----------------------------------------------------------------- */
+
+  /*  Convert floating point reference value to IBM representation. */
+
+  itrnd = 1;
+  zdumm = ztemp = *pref;
+  confp3(zdumm, &kexp, &kmant, kbits, itrnd);
+
+  if (kexp == 0 && kmant == 0) return;
+
+  /*  Set reference value to that actually stored in the GRIB code. */
+
+  *pref = decfp2(kexp, kmant);
+
+  /*  If the nearest number which can be represented in */
+  /*  GRIB format is greater than the reference value,  */
+  /*  find the nearest number in GRIB format lower      */
+  /*  than the reference value.                         */
+
+  if (ztemp < *pref)
+    {
+      /*  Convert floating point to GRIB representation */
+      /*  using truncation to ensure that the converted */
+      /*  number is smaller than the original one.      */
+
+      itrnd = 0;
+      zdumm = ztemp;
+      confp3(zdumm, &kexp, &kmant, kbits, itrnd);
+
+      /*  Set reference value to that stored in the GRIB code. */
+
+      *pref = decfp2(kexp, kmant);
+
+      if (ztemp < *pref)
+        {
+          if (CGRIBEX_Debug)
+            {
+              Message("Reference value error.");
+              Message("Notify Met.Applications Section.");
+              Message("ZTEMP = ", ztemp);
+              Message("PREF = ", pref);
+            }
+          *pref = ztemp;
+        }
+    }
+
+  return;
+} /* ref2ibm */
+#include <math.h>
+#include <string.h>
+
+unsigned
+correct_bdslen(unsigned bdslen, long recsize, long gribpos)
+{
+  /*
+    If a very large product, the section 4 length field holds
+    the number of bytes in the product after section 4 upto
+    the end of the padding bytes.
+    This is a fixup to get round the restriction on product lengths
+    due to the count being only 24 bits. It is only possible because
+    the (default) rounding for GRIB products is 120 bytes.
+  */
+  if (recsize > JP23SET && bdslen <= 120) bdslen = (unsigned) (recsize - gribpos - bdslen);
+  return bdslen;
+}
+
+int
+grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp,
+              unsigned char **bdsp, long *gribrecsize)
+{
+  *gribrecsize = 0;
+  *pdsp = NULL;
+  *gdsp = NULL;
+  *bmsp = NULL;
+  *bdsp = NULL;
+
+  unsigned char *section = gribbuffer;
+  unsigned char *is = gribbuffer;
+  if (!GRIB_START(section))
+    {
+      fprintf(stderr, "Wrong GRIB indicator section: found >%c%c%c%c<\n", section[0], section[1], section[2], section[3]);
+      return -1;
+    }
+
+  unsigned recsize = GET_UINT3(section[4], section[5], section[6]);
+
+  int gribversion = GRIB_EDITION(section);
+  if (gribversion != 0 && gribversion != 1)
+    {
+      fprintf(stderr, "Error while decoding GRIB1 sections: GRIB edition %d records not supported!\n", gribversion);
+      return -1;
+    }
+
+  unsigned grib1offset = (gribversion == 1) ? 4 : 0;
+
+  unsigned char *pds = is + 4 + grib1offset;
+  unsigned char *bufpointer = pds + PDS_Len;
+  unsigned gribsize = 4 + grib1offset + PDS_Len;
+
+  unsigned char *gds = NULL;
+  if (PDS_HAS_GDS)
+    {
+      gds = bufpointer;
+      bufpointer += GDS_Len;
+      gribsize += GDS_Len;
+    }
+
+  unsigned char *bms = NULL;
+  if (PDS_HAS_BMS)
+    {
+      bms = bufpointer;
+      bufpointer += BMS_Len;
+      gribsize += BMS_Len;
+    }
+
+  unsigned char *bds = bufpointer;
+  unsigned bdslen = BDS_Len;
+  if (recsize > JP23SET && bdslen <= 120)
+    {
+      recsize &= JP23SET;
+      recsize *= 120;
+      bdslen = correct_bdslen(bdslen, recsize, gribsize);
+    }
+  bufpointer += bdslen;
+  gribsize += bdslen;
+  gribsize += 4;
+
+  *pdsp = pds;
+  *gdsp = gds;
+  *bmsp = bms;
+  *bdsp = bds;
+
+  *gribrecsize = gribsize;
+  if (gribbufsize < gribsize)
+    {
+      fprintf(stderr, "Inconsistent length of GRIB message (grib_buffer_size=%ld < grib_record_size=%u)!\n", gribbufsize, gribsize);
+      return 1;
+    }
+
+  if (!GRIB_FIN(bufpointer))  // end section - "7777" in ASCII
+    {
+      fprintf(stderr, "Missing GRIB end section: found >%c%c%c%c<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]);
+      return -2;
+    }
+
+  return 0;
+}
+
+int
+grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp, unsigned char **lusp, unsigned char **gdsp,
+              unsigned char **pdsp, unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp)
+{
+  UNUSED(gribbufsize);
+
+  *idsp = NULL;
+  *lusp = NULL;
+  *gdsp = NULL;
+  *pdsp = NULL;
+  *drsp = NULL;
+  *bmsp = NULL;
+  *bdsp = NULL;
+
+  unsigned char *section = gribbuffer;
+  unsigned sec_len = 16;
+
+  if (!GRIB_START(section))
+    {
+      fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]);
+      return -1;
+    }
+
+  int gribversion = GRIB_EDITION(section);
+  if (gribversion != 2)
+    {
+      fprintf(stderr, "wrong GRIB version %d\n", gribversion);
+      return -1;
+    }
+
+  unsigned gribsize = 0;
+  for (int i = 0; i < 8; ++i) gribsize = (gribsize << 8) | section[8 + i];
+
+  unsigned grib_len = sec_len;
+  section += sec_len;
+
+  /* section 1 */
+  sec_len = GRIB2_SECLEN(section);
+  int sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "ids %d %ld\n", sec_num, sec_len);
+
+  if (sec_num != 1)
+    {
+      fprintf(stderr, "Unexpected section1 number %d\n", sec_num);
+      return -1;
+    }
+
+  *idsp = section;
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* section 2 and 3 */
+  sec_len = GRIB2_SECLEN(section);
+  sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "lus %d %ld\n", sec_num, sec_len);
+
+  if (sec_num == 2)
+    {
+      *lusp = section;
+
+      grib_len += sec_len;
+      section += sec_len;
+
+      /* section 3 */
+      sec_len = GRIB2_SECLEN(section);
+      // sec_num = GRIB2_SECNUM(section);
+      // fprintf(stderr, "gds %d %ld\n", sec_num, sec_len);
+
+      *gdsp = section;
+    }
+  else if (sec_num == 3)
+    {
+      *gdsp = section;
+    }
+  else
+    {
+      fprintf(stderr, "Unexpected section3 number %d\n", sec_num);
+      return -1;
+    }
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* section 4 */
+  sec_len = GRIB2_SECLEN(section);
+  sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "pds %d %ld\n", sec_num, sec_len);
+
+  if (sec_num != 4)
+    {
+      fprintf(stderr, "Unexpected section4 number %d\n", sec_num);
+      return -1;
+    }
+
+  *pdsp = section;
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* section 5 */
+  sec_len = GRIB2_SECLEN(section);
+  sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "drs %d %ld\n", sec_num, sec_len);
+
+  if (sec_num != 5)
+    {
+      fprintf(stderr, "Unexpected section5 number %d\n", sec_num);
+      return -1;
+    }
+
+  *drsp = section;
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* section 6 */
+  sec_len = GRIB2_SECLEN(section);
+  sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "bms %d %ld\n", sec_num, sec_len);
+
+  if (sec_num != 6)
+    {
+      fprintf(stderr, "Unexpected section6 number %d\n", sec_num);
+      return -1;
+    }
+
+  *bmsp = section;
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* section 7 */
+  sec_len = GRIB2_SECLEN(section);
+  sec_num = GRIB2_SECNUM(section);
+  // fprintf(stderr, "bds %d %ld\n", sec_num, sec_len);
+
+  if (sec_num != 7)
+    {
+      fprintf(stderr, "Unexpected section7 number %d\n", sec_num);
+      return -1;
+    }
+
+  *bdsp = section;
+
+  grib_len += sec_len;
+  section += sec_len;
+
+  /* skip multi GRIB sections */
+  int msec = 1;
+  while (!GRIB_FIN(section))
+    {
+      sec_len = GRIB2_SECLEN(section);
+      sec_num = GRIB2_SECNUM(section);
+
+      if (sec_num < 1 || sec_num > 7) break;
+
+      if (sec_num == 7) fprintf(stderr, "Skipped unsupported multi GRIB section %d!\n", ++msec);
+
+      if ((grib_len + sec_len) > gribsize) break;
+
+      grib_len += sec_len;
+      section += sec_len;
+    }
+
+  /* end section - "7777" in ASCII */
+  if (!GRIB_FIN(section))
+    {
+      fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", section[0], section[1], section[2], section[3]);
+      return -2;
+    }
+
+  return 0;
+}
+
+int
+grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum)
+{
+  long gribsize = 0;
+  off_t bpos = 0;
+
+  unsigned char *section = gribbuffer;
+  unsigned char *is = gribbuffer;
+  if (!GRIB_START(section))
+    {
+      fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]);
+      return -1;
+    }
+
+  int gribversion = GRIB_EDITION(section);
+  if (recsize == 24 && gribversion == 0) gribversion = 0;
+
+  unsigned grib1offset = (gribversion == 1) ? 4 : 0;
+
+  unsigned char *pds = is + 4 + grib1offset;
+  unsigned char *bufpointer = pds + PDS_Len;
+  gribsize += 4 + grib1offset + PDS_Len;
+
+  unsigned char *gds = NULL;
+  if (PDS_HAS_GDS)
+    {
+      gds = bufpointer;
+      bufpointer += GDS_Len;
+      gribsize += GDS_Len;
+    }
+
+  unsigned char *bms = NULL;
+  if (PDS_HAS_BMS)
+    {
+      bms = bufpointer;
+      bufpointer += BMS_Len;
+      bpos = recpos + gribsize + 6;
+      gribsize += BMS_Len;
+    }
+
+  unsigned char *bds = bufpointer;
+
+  off_t dpos = recpos + gribsize + 11;
+
+  unsigned bdslen = BDS_Len;
+  bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer);
+  bufpointer += bdslen;
+  gribsize += bdslen;
+  gribsize += 4;
+
+  if (gribsize > recsize)
+    {
+      fprintf(stderr, "GRIB buffer size %ld too small! Min size = %ld\n", recsize, gribsize);
+      return 1;
+    }
+
+  /* end section - "7777" in ascii */
+  if (!GRIB_FIN(bufpointer))
+    {
+      fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]);
+    }
+
+  int bs = BDS_BinScale;
+  if (bs > 32767) bs = 32768 - bs;
+  float bsf = ldexpf(1.0f, bs);
+
+  bignum[0] = dpos;
+  bignum[1] = bms ? bpos : -999;
+  intnum[0] = BDS_NumBits;
+
+  /*  fltnum[0] = 1.0; */
+  fltnum[0] = powf(10.0f, (float) PDS_DecimalScale);
+  fltnum[1] = bsf;
+  fltnum[2] = (float) BDS_RefValue;
+  /*
+  printf("intnum %d %d %d\n", intnum[0], intnum[1], intnum[2]);
+  printf("fltnum %g %g %g\n", fltnum[0], fltnum[1], fltnum[2]);
+  */
+  return 0;
+}
+
+static int
+get_level(unsigned char *pds)
+{
+  int level = 0;
+
+  if (PDS_LevelType == 100)
+    level = (int) (PDS_Level) *100;
+  else if (PDS_LevelType == 99 || PDS_LevelType == 109)
+    level = (int) (PDS_Level);
+  else
+    level = PDS_Level1;
+
+  return level;
+}
+
+static double
+get_cr(unsigned char *w1, unsigned char *w2)
+{
+  unsigned s1 = GET_UINT3(w1[0], w1[1], w1[2]);
+  unsigned s2 = GET_UINT3(w2[0], w2[1], w2[2]);
+  return ((double) s1) / s2;
+}
+
+static void
+grib1PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static bool header = true;
+  unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  if (header)
+    {
+      fprintf(stdout, "  Rec : Off Position   Size : V PDS  GDS    BMS    BDS : Code Level :  LType GType: CR LL\n");
+      //               ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = false;
+    }
+
+  is = gribbuffer;
+
+  unsigned gribsize = GET_UINT3(is[4], is[5], is[6]);
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d :%4ld %8ld %6ld : GRIB message error\n", nrec, offset, recpos, recsize);
+      return;
+    }
+
+  int GridType = (gds == NULL) ? -1 : (int) GDS_GridType;
+
+  int level = get_level(pds);
+
+  unsigned bdslen = BDS_Len;
+
+  bool llarge = (gribsize > JP23SET && bdslen <= 120);
+
+  bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer);
+
+  double cr = (((BDS_Flag >> 4) & 1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1;
+
+  fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d%4d%5d %6d %6d : %3d %6d : %5d %5d %6.4g  %c", nrec, offset, recpos, recsize,
+          GRIB_EDITION(is), PDS_Len, GDS_Len, BMS_Len, bdslen, PDS_Parameter, level, PDS_LevelType, GridType, cr,
+          llarge ? 'T' : 'F');
+
+  if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!");
+  fprintf(stdout, "\n");
+}
+
+static void
+grib2PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static bool header = true;
+  unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  unsigned char *ids = NULL, *lus = NULL, *drs = NULL;
+  long ids_len = 0, lus_len = 0, gds_len = 0, pds_len = 0, drs_len = 0, bms_len = 0, bds_len = 0;
+  double cr = 1;
+
+  if (header)
+    {
+      fprintf(stdout,
+              "  Rec : Off Position   Size : V IDS LUS GDS PDS  DRS    BMS    BDS : Parameter   Level :  LType GType: CR\n");
+      //       ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = false;
+    }
+
+  is = gribbuffer;
+
+  int nerr = grib2Sections(gribbuffer, recsize, &ids, &lus, &gds, &pds, &drs, &bms, &bds);
+  if (nerr)
+    {
+      fprintf(stdout, "%5d :%4ld %8ld %6ld : error\n", nrec, offset, recpos, recsize);
+      return;
+    }
+
+  if (ids) ids_len = GRIB2_SECLEN(ids);
+  if (lus) lus_len = GRIB2_SECLEN(lus);
+  if (gds) gds_len = GRIB2_SECLEN(gds);
+  if (pds) pds_len = GRIB2_SECLEN(pds);
+  if (drs) drs_len = GRIB2_SECLEN(drs);
+  if (bms) bms_len = GRIB2_SECLEN(bms);
+  if (bds) bds_len = GRIB2_SECLEN(bds);
+
+  // double cr = (((BDS_Flag >> 4)&1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1;
+
+  int dis = GET_UINT1(is[6]);
+  int gridtype = (int) (GET_UINT2(gds[12], gds[13]));
+  int paramcat = GET_UINT1(pds[9]);
+  int paramnum = GET_UINT1(pds[10]);
+  int level1type = GET_UINT1(pds[22]);
+  /* level1sf   = GET_UINT1(pds[23]); */
+  int level1 = (int) (GET_UINT4(pds[24], pds[25], pds[26], pds[27]));
+  /* level2type = GET_UINT1(pds[28]); */
+  /* level2sf   = GET_UINT1(pds[29]); */
+  /* level2     = GET_UINT4(pds[30],pds[31],pds[32],pds[33]); */
+  /*
+  printf("level %d %d %d %d %d %d %d\n", level1type, level1sf, level1, level1*level1sf, level2sf, level2, level2*level2sf);
+  */
+  char paramstr[16];
+  sprintf(paramstr, "%d.%d.%d", paramnum, paramcat, dis);
+  fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d %3ld %3ld %3ld %3ld %4ld %6ld %6ld : %-9s %7d : %5d %5d %6.4g\n", nrec, offset, recpos,
+          recsize, GRIB_EDITION(is), ids_len, lus_len, gds_len, pds_len, drs_len, bms_len, bds_len, paramstr, level1, level1type,
+          gridtype, cr);
+}
+
+void
+gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  int gribversion = gribVersion(gribbuffer, (size_t) recsize);
+
+  if (gribversion == 0 || gribversion == 1)
+    grib1PrintALL(nrec, offset, recpos, recsize, gribbuffer);
+  else if (gribversion == 2)
+    grib2PrintALL(nrec, offset, recpos, recsize, gribbuffer);
+  else
+    {
+      fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, offset, recpos, recsize, gribversion);
+    }
+}
+
+static void
+grib1PrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static int header = 1;
+  unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  int century, subcenter, decimalscale;
+  int fc_num = 0;
+  int year = 0, date;
+
+  UNUSED(recpos);
+
+  if (header)
+    {
+      fprintf(stdout, "  Rec : PDS Tab Cen Sub Ver Grid Code LTyp Level1 Level2    Date  Time P1 P2 TU TR NAVE Scale FCnum CT\n");
+      //               ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = 0;
+    }
+
+  is = gribbuffer;
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  switch (GRIB_EDITION(is))
+    {
+    case 0:
+      year = GET_UINT1(pds[12]);
+      century = 1;
+      subcenter = 0;
+      decimalscale = 0;
+      break;
+    case 1:
+      year = PDS_Year;
+      century = PDS_Century;
+      subcenter = PDS_Subcenter;
+      decimalscale = PDS_DecimalScale;
+      break;
+    default: fprintf(stderr, "Grib version %d not supported!", GRIB_EDITION(is)); exit(EXIT_FAILURE);
+    }
+
+  if (PDS_Len > 28)
+    if (PDS_CenterID == 98 || PDS_Subcenter == 98 || (PDS_CenterID == 7 && PDS_Subcenter == 98))
+      if (pds[40] == 1) fc_num = GET_UINT1(pds[49]);
+
+  if (year < 0)
+    {
+      date = (-year) * 10000 + (int) PDS_Month * 100 + (int) PDS_Day;
+      century = -century;
+    }
+  else
+    {
+      date = year * 10000 + (int) PDS_Month * 100 + (int) PDS_Day;
+    }
+
+  fprintf(stdout, "%5d :%4d%4d%4d%4d%4d %4d %4d%4d%7d%7d %8d%6d%3d%3d%3d%3d%5d%6d%5d%4d", nrec, PDS_Len, PDS_CodeTable,
+          PDS_CenterID, subcenter, PDS_ModelID, PDS_GridDefinition, PDS_Parameter, PDS_LevelType, PDS_Level1, PDS_Level2, date,
+          PDS_Time, PDS_TimePeriod1, PDS_TimePeriod2, PDS_TimeUnit, PDS_TimeRange, PDS_AvgNum, decimalscale, fc_num, century);
+
+  if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!");
+  fprintf(stdout, "\n");
+}
+
+void
+gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  int gribversion = gribVersion(gribbuffer, (size_t) recsize);
+
+  if (gribversion == 0 || gribversion == 1) grib1PrintPDS(nrec, recpos, recsize, gribbuffer);
+  /*
+  else if ( gribversion == 2 )
+    grib2PrintPDS(nrec, recpos, recsize, gribbuffer);
+  */
+  else
+    {
+      fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion);
+    }
+}
+
+static void
+grib1PrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static int header = 1;
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  UNUSED(recpos);
+
+  if (header)
+    {
+      fprintf(stdout, "  Rec : GDS  NV PVPL Typ : xsize ysize   Lat1   Lon1   Lat2   Lon2    dx    dy\n");
+      //               ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = 0;
+    }
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  fprintf(stdout, "%5d :", nrec);
+
+  if (gds)
+    fprintf(stdout, "%4d%4d%4d %4d :%6d%6d%7d%7d%7d%7d%6d%6d", GDS_Len, GDS_NV, GDS_PVPL, GDS_GridType, GDS_NumLon, GDS_NumLat,
+            GDS_FirstLat, GDS_FirstLon, GDS_LastLat, GDS_LastLon, GDS_LonIncr, GDS_LatIncr);
+  else
+    fprintf(stdout, " Grid Description Section not defined");
+
+  if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!");
+  fprintf(stdout, "\n");
+}
+
+void
+gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  int gribversion = gribVersion(gribbuffer, (size_t) recsize);
+
+  if (gribversion == 0 || gribversion == 1) grib1PrintGDS(nrec, recpos, recsize, gribbuffer);
+  /*
+  else if ( gribversion == 2 )
+    grib2PrintGDS(nrec, recpos, recsize, gribbuffer);
+  */
+  else
+    {
+      fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion);
+    }
+}
+
+static void
+grib1PrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static int header = 1;
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  UNUSED(recpos);
+
+  if (header)
+    {
+      fprintf(stdout, "  Rec : Code Level     BMS    Size\n");
+      //               ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = 0;
+    }
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  int level = get_level(pds);
+
+  fprintf(stdout, "%5d :", nrec);
+
+  if (bms)
+    fprintf(stdout, "%4d%7d %7d %7d", PDS_Parameter, level, BMS_Len, BMS_BitmapSize);
+  else
+    fprintf(stdout, "%4d%7d Bit Map Section not defined", PDS_Parameter, level);
+
+  if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!");
+  fprintf(stdout, "\n");
+}
+
+void
+gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  int gribversion = gribVersion(gribbuffer, (size_t) recsize);
+
+  if (gribversion == 0 || gribversion == 1) grib1PrintBMS(nrec, recpos, recsize, gribbuffer);
+  /*
+  else if ( gribversion == 2 )
+    grib2PrintBMS(nrec, recpos, recsize, gribbuffer);
+  */
+  else
+    {
+      fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion);
+    }
+}
+
+static void
+grib1PrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  static int header = 1;
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  double scale;
+
+  UNUSED(recpos);
+
+  if (header)
+    {
+      fprintf(stdout, "  Rec : Code Level     BDS Flag     Scale   RefValue Bits  CR\n");
+      //               ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+
+      header = 0;
+    }
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  int level = get_level(pds);
+
+  double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1;
+
+  double refval = BDS_RefValue;
+
+  if (BDS_BinScale < 0)
+    scale = 1.0 / pow(2.0, (double) -BDS_BinScale);
+  else
+    scale = pow(2.0, (double) BDS_BinScale);
+
+  if (PDS_DecimalScale != 0)
+    {
+      double decscale = pow(10.0, (double) -PDS_DecimalScale);
+      refval *= decscale;
+      scale *= decscale;
+    }
+
+  fprintf(stdout, "%5d :", nrec);
+
+  if (bds)
+    fprintf(stdout, "%4d%7d %7d %4d %8.5g %11.5g%4d %6.4g", PDS_Parameter, level, BDS_Len, BDS_Flag, scale, refval, BDS_NumBits,
+            cr);
+  else
+    fprintf(stdout, " Binary Data Section not defined");
+
+  if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!");
+  fprintf(stdout, "\n");
+}
+
+void
+gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  int gribversion = gribVersion(gribbuffer, (size_t) recsize);
+
+  if (gribversion == 0 || gribversion == 1) grib1PrintBDS(nrec, recpos, recsize, gribbuffer);
+  /*
+  else if ( gribversion == 2 )
+    grib2PrintBDS(nrec, recpos, recsize, gribbuffer);
+  */
+  else
+    {
+      fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion);
+    }
+}
+
+void
+gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer)
+{
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  UNUSED(recpos);
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec);
+      return;
+    }
+
+  int level = get_level(pds);
+
+  double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1;
+
+  if (IS_EQUAL(cr, 1) && BDS_NumBits == 24)
+    fprintf(stdout, "GRIB record %5d : code = %4d   level = %7d\n", nrec, PDS_Parameter, level);
+}
+
+static void
+repair1(unsigned char *gbuf, long gbufsize)
+{
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  /* int recLen; */
+  size_t bds_nbits;
+  int bds_flag, lspherc, lcomplex /*, lcompress */;
+  enum
+  {
+    bds_head = 11
+  };
+  size_t bds_ext = 0, bds_ubits;
+
+  long gribrecsize;
+  int nerr = grib1Sections(gbuf, gbufsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "GRIB message error\n");
+      return;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "GRIB data corrupted!\n");
+      return;
+    }
+
+  unsigned bds_len = BDS_Len;
+  bds_nbits = BDS_NumBits;
+  bds_flag = BDS_Flag;
+  bds_ubits = (size_t) bds_flag & 15;
+  lspherc = bds_flag >> 7;
+  lcomplex = (bds_flag >> 6) & 1;
+  /* lcompress = (bds_flag >> 4)&1; */
+
+  if (lspherc)
+    {
+      if (lcomplex)
+        {
+          size_t jup, ioff;
+          jup = (size_t) bds[15];
+          ioff = (jup + 1) * (jup + 2);
+          bds_ext = 4 + 3 + 4 * ioff;
+        }
+      else
+        {
+          bds_ext = 4;
+        }
+    }
+
+  size_t datstart = bds_head + bds_ext;
+
+  unsigned char *source = bds + datstart;
+
+  size_t sourceLen = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8;
+
+  if (bds_nbits == 24)
+    {
+      unsigned char *pbuf = (unsigned char *) Malloc(sourceLen);
+      ;
+      size_t nelem = sourceLen / 3;
+      for (size_t i = 0; i < nelem; ++i)
+        {
+          pbuf[3 * i] = source[i];
+          pbuf[3 * i + 1] = source[nelem + i];
+          pbuf[3 * i + 2] = source[2 * nelem + i];
+        }
+      memcpy(source, pbuf, sourceLen);
+      Free(pbuf);
+    }
+}
+
+void
+gribRepair1(int nrec, long recsize, unsigned char *gribbuffer)
+{
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "%5d : GRIB message error\n", nrec);
+      return;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec);
+      return;
+    }
+
+  int level = get_level(pds);
+
+  double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1;
+
+  if (IS_EQUAL(cr, 1) && BDS_NumBits == 24)
+    {
+      fprintf(stdout, "Repair GRIB record %5d : code = %4d   level = %7d\n", nrec, PDS_Parameter, level);
+      repair1(gribbuffer, recsize);
+    }
+}
+#include <stdio.h>
+#include <string.h>
+
+#if defined(HAVE_CONFIG_H)
+#endif
+
+#if defined(HAVE_LIBSZ)
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+#include <szlib.h>
+#ifdef __cplusplus
+}
+#endif
+
+// clang-format off
+
+#define OPTIONS_MASK        (SZ_RAW_OPTION_MASK | SZ_MSB_OPTION_MASK | SZ_NN_OPTION_MASK)
+
+#define PIXELS_PER_BLOCK    (8)
+#define PIXELS_PER_SCANLINE (PIXELS_PER_BLOCK*128)
+
+#define MIN_COMPRESS        (0.95)
+#define MIN_SIZE            (256)
+#endif
+
+#define  Z_SZIP  128
+
+#if  defined (HAVE_LIBSZ) || defined (HAVE_LIBAEC)
+#define SetLen3(var, offset, value) ((var[offset+0] = 0xFF & (value >> 16)), \
+				     (var[offset+1] = 0xFF & (value >>  8)), \
+				     (var[offset+2] = 0xFF & (value      )))
+#define SetLen4(var, offset, value) ((var[offset+0] = 0xFF & (value >> 24)), \
+				     (var[offset+1] = 0xFF & (value >> 16)), \
+				     (var[offset+2] = 0xFF & (value >>  8)), \
+				     (var[offset+3] = 0xFF & (value      )))
+#endif
+
+// clang-format on
+
+int
+gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize)
+{
+  int compress = 0;
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+
+  int gribversion = gribVersion(gribbuffer, recsize);
+
+  if (gribversion == 2) return compress;
+
+  long gribrecsize;
+  int nerr = grib1Sections(gribbuffer, (long) recsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "GRIB message error\n");
+      return compress;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "GRIB data corrupted!\n");
+      return compress;
+    }
+
+  /* bds_len   = BDS_Len; */
+  /* bds_nbits = BDS_NumBits; */
+  int bds_flag = BDS_Flag;
+  /* lspherc   =  bds_flag >> 7; */
+  /* lcomplex  = (bds_flag >> 6)&1; */
+  int lcompress = (bds_flag >> 4) & 1;
+
+  size_t gribsize = 0;
+  if (lcompress)
+    {
+      compress = BDS_Z;
+      if (compress == Z_SZIP) gribsize = (size_t) GET_UINT3(bds[14], bds[15], bds[16]);
+    }
+
+  *urecsize = gribsize;
+
+  return compress;
+}
+
+int
+gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize)
+{
+#if !defined(HAVE_LIBSZ)
+  static int libszwarn = 1;
+#endif
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  bool llarge = false;
+
+  unsigned gribLen = GET_UINT3(dbuf[4], dbuf[5], dbuf[6]);
+
+  int rec_len = (int) gribLen;
+
+  long gribrecsize;
+  int nerr = grib1Sections(dbuf, dbufsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "GRIB message error\n");
+      return (int) gribrecsize;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "GRIB data corrupted!\n");
+      return (int) gribrecsize;
+    }
+
+  int bds_zoffset = 12;
+
+  unsigned bds_len = BDS_Len;
+  if (gribLen > JP23SET && bds_len <= 120)
+    {
+      gribLen &= JP23SET;
+      gribLen *= 120;
+      bds_len = correct_bdslen(bds_len, gribLen, bds - dbuf);
+      llarge = true;
+      bds_zoffset += 2;
+    }
+
+  if (gribLen > JP24SET || llarge) return (int) gribLen;
+
+#if defined(HAVE_LIBSZ)
+  {
+    int bds_zstart = 14;
+    unsigned gribLenOld = 0;
+    int bds_head = 11;
+    int bds_ext = 0;
+    unsigned char *pbuf = NULL;
+
+    int bds_nbits = BDS_NumBits;
+    int bds_flag = BDS_Flag;
+    int bds_ubits = bds_flag & 15;
+    int lspherc = bds_flag >> 7;
+    int lcomplex = (bds_flag >> 6) & 1;
+    /* lcompress = (bds_flag >> 4)&1; */
+
+    if (bds_nbits != 8 && bds_nbits != 16 && bds_nbits != 24 && bds_nbits != 32)
+      {
+        static bool linfo = true;
+        if (linfo && bds_nbits != 0)
+          {
+            linfo = false;
+            fprintf(stderr, "GRIB szip supports only 8, 16, 24 and 32 bit data!\n");
+          }
+        return rec_len;
+      }
+
+    int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits;
+
+    SZ_com_t sz_param; /* szip parameter block */
+    sz_param.options_mask = OPTIONS_MASK;
+    sz_param.bits_per_pixel = bits_per_sample;
+    sz_param.pixels_per_block = PIXELS_PER_BLOCK;
+    sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE;
+
+    if (lspherc)
+      {
+        bds_ext = 4;
+        if (lcomplex)
+          {
+            int jup = bds[15];
+            int ioff = (jup + 1) * (jup + 2);
+            bds_ext += 3 + 4 * ioff;
+          }
+      }
+
+    size_t datstart = bds_head + bds_ext;
+
+    size_t datsize = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8;
+
+    if (datsize < MIN_SIZE) return rec_len;
+    /*
+    fprintf(stderr, "%d %d %d %d\n", bds_len, datstart, bds_len - datstart, datsize);
+    */
+    size_t sourceLen = datsize;
+    size_t destLen = sbufsize;
+
+    unsigned char *source = bds + datstart;
+    unsigned char *dest = sbuf;
+
+    if (bds_nbits == 24)
+      {
+        long nelem = sourceLen / 3;
+        pbuf = (unsigned char *) Malloc(sourceLen);
+        for (long i = 0; i < nelem; ++i)
+          {
+            pbuf[i] = source[3 * i];
+            pbuf[nelem + i] = source[3 * i + 1];
+            pbuf[2 * nelem + i] = source[3 * i + 2];
+          }
+        source = pbuf;
+      }
+
+    int status = SZ_BufftoBuffCompress(dest, &destLen, source, sourceLen, &sz_param);
+    if (status != SZ_OK)
+      {
+        if (status == SZ_NO_ENCODER_ERROR)
+          Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_PARAM_ERROR)
+          Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_MEM_ERROR)
+          Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_OUTBUFF_FULL)
+          /*Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2)*/;
+        else
+          Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2);
+      }
+
+    if (pbuf) Free(pbuf);
+    /*
+    fprintf(stderr, "sourceLen, destLen %d %d\n", sourceLen, destLen);
+    */
+    if (destLen < MIN_COMPRESS * sourceLen)
+      {
+        source = bds + datstart + bds_zoffset;
+        memcpy(source, dest, destLen);
+
+        /* ----++++ number of unused bits at end of section) */
+
+        BDS_Flag -= bds_ubits;
+
+        gribLenOld = gribLen;
+
+        if (bds_ext)
+          for (long i = bds_ext - 1; i >= 0; --i) bds[bds_zoffset + bds_head + i] = bds[bds_head + i];
+
+        /*
+        fprintf(stderr, "destLen, datsize, datstart %d %d %d\n", destLen, datsize, datstart);
+        */
+        /*	memcpy(bds + datstart + bds_zoffset, source, destLen); */
+        /*
+          fprintf(stderr, "z>>> %d %d %d %d <<<\n", (int) bds[0+datstart+bds_zoffset],
+            (int)bds[1+datstart+bds_zoffset], (int)bds[2+datstart+bds_zoffset], (int)bds[3+datstart+bds_zoffset]);
+        */
+        if (llarge)
+          {
+            if (gribLenOld % 120)
+              {
+                fprintf(stderr, "Internal problem, record length not multiple of 120!");
+                while (gribLenOld % 120) gribLenOld++;
+              }
+            // gribLenOld = gribLenOld / (-120);
+            // gribLenOld = JP23SET - gribLenOld + 1;
+
+            SetLen3(bds, bds_zstart, gribLenOld);
+            SetLen4(bds, bds_zstart + 3, sourceLen);
+            SetLen4(bds, bds_zstart + 7, destLen);
+          }
+        else
+          {
+            SetLen3(bds, bds_zstart, gribLenOld);
+            SetLen3(bds, bds_zstart + 3, sourceLen);
+            SetLen3(bds, bds_zstart + 6, destLen);
+          }
+
+        int bdsLen = datstart + bds_zoffset + destLen;
+
+        bds[11] = 0;
+        bds[12] = 0;
+
+        BDS_Z = Z_SZIP;
+
+        BDS_Flag += 16;
+        if ((bdsLen % 2) == 1)
+          {
+            BDS_Flag += 8;
+            bds[bdsLen++] = 0;
+          }
+
+        SetLen3(bds, 0, bdsLen);
+
+        gribLen = (bds - dbuf) + bdsLen;
+
+        dbuf[gribLen++] = '7';
+        dbuf[gribLen++] = '7';
+        dbuf[gribLen++] = '7';
+        dbuf[gribLen++] = '7';
+
+        if (llarge)
+          {
+            long bdslen = gribLen - 4;
+
+            /*
+              If a very large product, the section 4 length field holds
+              the number of bytes in the product after section 4 upto
+              the end of the padding bytes.
+              This is a fixup to get round the restriction on product lengths
+              due to the count being only 24 bits. It is only possible because
+              the (default) rounding for GRIB products is 120 bytes.
+            */
+            while (gribLen % 120) dbuf[gribLen++] = 0;
+
+            long itemp = gribLen / (-120);
+            itemp = JP23SET - itemp + 1;
+
+            SetLen3(dbuf, 4, itemp);
+
+            bdslen = gribLen - bdslen;
+
+            SetLen3(bds, 0, bdslen);
+          }
+        else
+          {
+            SetLen3(dbuf, 4, gribLen);
+          }
+      }
+    else
+      {
+      }
+    /*
+    fprintf(stderr, "%3d %3d griblen in %6d  out %6d  CR %g   slen %6d dlen %6d  CR %g\n",
+            PDS_Parameter, PDS_Level1, gribLenOld, gribLen,
+            ((double)gribLenOld)/gribLen, sourceLen, destLen,
+            ((double)sourceLen)/destLen);
+    */
+  }
+
+#else
+
+  UNUSED(sbuf);
+  UNUSED(sbufsize);
+
+  if (libszwarn)
+    {
+      Warning("Compression disabled, szlib not available!");
+      libszwarn = 0;
+    }
+#endif
+
+  if (llarge)
+    while (gribLen % 120) dbuf[gribLen++] = 0;
+  else
+    while (gribLen & 7) dbuf[gribLen++] = 0;
+
+  rec_len = (int) gribLen;
+
+  return rec_len;
+}
+
+int
+gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize)
+{
+#if !defined(HAVE_LIBSZ)
+  static int libszwarn = 1;
+#endif
+  unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+  size_t gribLen = 0;
+  size_t destLen, sourceLen;
+  enum
+  {
+    bds_head = 11
+  };
+  int bds_ext = 0;
+
+  UNUSED(dbufsize);
+
+  long gribrecsize;
+  int nerr = grib1Sections(sbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "GRIB message error\n");
+      return 0;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "GRIB data corrupted!\n");
+      return 0;
+    }
+
+  // unsigned bds_len = BDS_Len;
+  bool llarge = false;
+
+  int bds_zoffset = 12;
+  if (llarge) bds_zoffset += 2;
+
+  int bds_nbits = BDS_NumBits;
+  int bds_flag = BDS_Flag;
+  int lspherc = bds_flag >> 7;
+  int lcomplex = (bds_flag >> 6) & 1;
+  /* lcompress = (bds_flag >> 4)&1; */
+
+  if (lspherc)
+    {
+      if (lcomplex)
+        {
+          int jup = bds[bds_zoffset + 15];
+          int ioff = (jup + 1) * (jup + 2);
+          bds_ext = 4 + 3 + 4 * ioff;
+        }
+      else
+        {
+          bds_ext = 4;
+        }
+    }
+
+  size_t datstart = bds_head + (size_t) bds_ext;
+
+  unsigned char *source = bds + datstart + bds_zoffset;
+  if (llarge)
+    sourceLen = ((size_t) ((bds[21] << 24) + (bds[22] << 16) + (bds[23] << 8) + bds[24]));
+  else
+    sourceLen = ((size_t) ((bds[20] << 16) + (bds[21] << 8) + bds[22]));
+
+  nerr = grib1Sections(dbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize);
+  if (nerr < 0)
+    {
+      fprintf(stdout, "GRIB message error\n");
+      return 0;
+    }
+
+  if (nerr > 0)
+    {
+      fprintf(stdout, "GRIB data corrupted!\n");
+      return 0;
+    }
+
+  unsigned char *dest = bds + datstart;
+  if (llarge)
+    destLen = ((size_t) ((bds[17] << 24) + (bds[18] << 16) + (bds[19] << 8) + bds[20]));
+  else
+    destLen = ((size_t) ((bds[17] << 16) + (bds[18] << 8) + bds[19]));
+
+  BDS_Flag = (unsigned char) (BDS_Flag - 16);
+
+  size_t bdsLen = datstart + destLen;
+
+#if defined(HAVE_LIBSZ)
+  {
+    int bds_zstart = 14;
+    unsigned recLen = GET_UINT3(bds[bds_zstart], bds[bds_zstart + 1], bds[bds_zstart + 2]);
+
+    int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits;
+
+    SZ_com_t sz_param; /* szip parameter block */
+    sz_param.options_mask = OPTIONS_MASK;
+    sz_param.bits_per_pixel = bits_per_sample;
+    sz_param.pixels_per_block = PIXELS_PER_BLOCK;
+    sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE;
+
+    if (bds_ext)
+      for (long i = 0; i < bds_ext; ++i) bds[bds_head + i] = bds[bds_zoffset + bds_head + i];
+
+    /*    fprintf(stderr, "gribUnzip: sourceLen %ld; destLen %ld\n", (long)sourceLen, (long)destLen);
+    fprintf(stderr, "gribUnzip: sourceOff %d; destOff %d\n", bds[12], bds[11]);
+    fprintf(stderr, "gribUnzip: reclen %d; bdslen %d\n", recLen, bdsLen);
+    */
+
+    size_t tmpLen = destLen;
+
+    int status = SZ_BufftoBuffDecompress(dest, &tmpLen, source, sourceLen, &sz_param);
+    if (status != SZ_OK)
+      {
+        if (status == SZ_NO_ENCODER_ERROR)
+          Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_PARAM_ERROR)
+          Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_MEM_ERROR)
+          Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else if (status == SZ_OUTBUFF_FULL)
+          Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2);
+        else
+          Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2);
+      }
+    /*
+    fprintf(stderr, "gribUnzip: sl = %ld  dl = %ld   tl = %ld\n",
+            (long)sourceLen, (long)destLen,(long) tmpLen);
+    */
+    if (tmpLen != destLen)
+      Warning("unzip size differ: code %3d level %3d  ibuflen %ld ubuflen %ld", PDS_Parameter, PDS_Level2, (long) destLen,
+              (long) tmpLen);
+
+    if (bds_nbits == 24)
+      {
+        long nelem = tmpLen / 3;
+        unsigned char *pbuf = (unsigned char *) Malloc(tmpLen);
+        for (long i = 0; i < nelem; ++i)
+          {
+            pbuf[3 * i] = dest[i];
+            pbuf[3 * i + 1] = dest[nelem + i];
+            pbuf[3 * i + 2] = dest[2 * nelem + i];
+          }
+        memcpy(dest, pbuf, tmpLen);
+        Free(pbuf);
+      }
+
+    int bds_ubits = BDS_Flag & 15;
+    BDS_Flag -= bds_ubits;
+
+    if ((bdsLen % 2) == 1)
+      {
+        BDS_Flag += 8;
+        bds[bdsLen++] = 0;
+      }
+
+    SetLen3(bds, 0, bdsLen);
+
+    gribLen = (bds - dbuf) + bdsLen;
+
+    dbuf[gribLen++] = '7';
+    dbuf[gribLen++] = '7';
+    dbuf[gribLen++] = '7';
+    dbuf[gribLen++] = '7';
+
+    if (llarge)
+      {
+        long itemp;
+        bdsLen = gribLen - 4;
+        /*
+          If a very large product, the section 4 length field holds
+          the number of bytes in the product after section 4 upto
+          the end of the padding bytes.
+          This is a fixup to get round the restriction on product lengths
+          due to the count being only 24 bits. It is only possible because
+          the (default) rounding for GRIB products is 120 bytes.
+        */
+        while (gribLen % 120) dbuf[gribLen++] = 0;
+
+        if (gribLen != (size_t) recLen) fprintf(stderr, "Internal problem, recLen and gribLen differ!\n");
+
+        itemp = gribLen / (-120);
+        itemp = JP23SET - itemp + 1;
+
+        SetLen3(dbuf, 4, itemp);
+
+        bdsLen = gribLen - bdsLen;
+
+        SetLen3(bds, 0, bdsLen);
+      }
+    else
+      {
+        SetLen3(dbuf, 4, recLen);
+      }
+    /*
+    fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen);
+    */
+    if (llarge)
+      while (gribLen % 120) dbuf[gribLen++] = 0;
+    else
+      while (gribLen & 7) dbuf[gribLen++] = 0;
+    /*
+    fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen);
+    */
+  }
+#else
+  UNUSED(bds_nbits);
+  UNUSED(sourceLen);
+  UNUSED(source);
+  UNUSED(bdsLen);
+  UNUSED(dest);
+
+  if (libszwarn)
+    {
+      Warning("Decompression disabled, szlib not available!");
+      libszwarn = 0;
+    }
+#endif
+
+  return (int) gribLen;
+}
+#include <stdio.h>
+#include <math.h>
+
+// clang-format off
+
+
+static void
+scm0_double(double *pdl, double *pdr, double *pfl, double *pfr, int klg);
+
+
+static
+int rowina2(double *p, int ko, int ki, double *pw,
+	    int kcode, double msval, int *kret)
+{
+  /* System generated locals */
+  int pw_dim1, pw_offset, i_1;
+
+  /* Local variables */
+  double zwt1, zrdi, zpos;
+  int ip;
+  double zdo, zwt;
+
+  /* Parameter adjustments */
+  --p;
+  pw_dim1 = ko + 3;
+  pw_offset = pw_dim1;
+  pw -= pw_offset;
+
+  /* **** ROWINA2 - Interpolation of row of values. */
+  /*     Input Parameters. */
+  /*     ----------------- */
+  /*     P      - Row of values to be interpolated. */
+  /*              Dimension must be at least KO. */
+  /*     KO     - Number of values required. */
+  /*     KI     - Number of values in P on input. */
+  /*     PW     - Working array. */
+  /*              Dimension must be at least (0:KO+2,3). */
+  /*     KCODE  - Interpolation required. */
+  /*              1 , linear. */
+  /*              3 , cubic. */
+  /*     PMSVAL - Value used for missing data indicator. */
+
+  /*     Output Parameters. */
+  /*     ------------------ */
+  /*     P     - Now contains KO values. */
+  /*     KRET  - Return code */
+  /*             0, OK */
+  /*             Non-zero, error */
+
+  /*     Author. */
+  /*     ------- */
+  /*     J.D.Chambers    ECMWF     22.07.94 */
+
+  /*     ********************************    */
+  /*     Section 1.  Linear interpolation .. */
+  /*     ********************************    */
+
+  *kret = 0;
+
+  if ( kcode == 1 )
+    {
+      /*    Move input values to work array */
+      for (int jl = 1; jl <= ki; ++jl)
+	pw[jl + pw_dim1] = p[jl];
+
+      /*    Arrange wrap-around value in work array */
+      pw[ki + 1 + pw_dim1] = p[1];
+
+      /*    Set up constants to be used to figure out weighting for */
+      /*    values in interpolation. */
+      zrdi = (double) ki;
+      zdo = 1.0 / (double) ko;
+
+      /*    Loop through the output points */
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+
+	  /*    Calculate weight from the start of row */
+	  zpos = (jl - 1) * zdo;
+	  zwt = zpos * zrdi;
+
+	  /*    Get the current array position(minus 1) from the weight - */
+	  /*    note the implicit truncation. */
+	  ip = (int) zwt;
+
+	  /*    If the left value is missing, use the right value */
+	  if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) )
+	    {
+	      p[jl] = pw[ip + 2 + pw_dim1];
+	    }
+	  /*    If the right value is missing, use the left value */
+	  else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) )
+	    {
+	      p[jl] = pw[ip + 1 + pw_dim1];
+	    }
+	  /*    If neither missing, interpolate ... */
+	  else
+	    {
+
+	      /*       Adjust the weight to range (0.0 to 1.0) */
+	      zwt -= ip;
+
+	      /*       Interpolate using the weighted values on either side */
+	      /*       of the output point position */
+	      p[jl] = (1.0 - zwt) * pw[ip + 1 + pw_dim1] +
+		zwt * pw[ip + 2 + pw_dim1];
+	    }
+	}
+
+      /*     *******************************    */
+      /*     Section 2.  Cubic interpolation .. */
+      /*     *******************************    */
+
+    }
+  else if ( kcode == 3 )
+    {
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          if ( IS_EQUAL(p[jl], msval) )
+	    {
+	      fprintf(stderr," ROWINA2: ");
+	      fprintf(stderr," Cubic interpolation not supported");
+	      fprintf(stderr," for fields containing missing data.\n");
+	      *kret = 1;
+	      goto L900;
+	    }
+          pw[jl + pw_dim1] = p[jl];
+	}
+      pw[pw_dim1] = p[ki];
+      pw[ki + 1 + pw_dim1] = p[1];
+      pw[ki + 2 + pw_dim1] = p[2];
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          pw[jl + (pw_dim1 << 1)] =
+	        - pw[jl - 1 + pw_dim1] / 3.0 -
+	          pw[jl     + pw_dim1] * 0.5 +
+	          pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0;
+          pw[jl + 1 + pw_dim1 * 3] =
+                  pw[jl - 1 + pw_dim1] / 6.0 -
+                  pw[jl     + pw_dim1] +
+                  pw[jl + 1 + pw_dim1] * 0.5 +
+                  pw[jl + 2 + pw_dim1] / 3.0;
+	}
+
+      scm0_double(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2],
+		  &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki);
+
+      zrdi = (double) ki;
+      zdo = 1.0 / (double) ko;
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+          zpos = (jl - 1) * zdo;
+          zwt = zpos * zrdi;
+          ip = (int) zwt + 1;
+          zwt = zwt + 1.0 - ip;
+          zwt1 = 1.0 - zwt;
+          p[jl] = ((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] +
+                  zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 +
+                  ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] -
+                  zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt;
+	}
+
+    }
+  else
+    {
+      /*    **************************************    */
+      /*    Section 3.  Invalid interpolation code .. */
+      /*    **************************************    */
+      fprintf(stderr," ROWINA2:");
+      fprintf(stderr," Invalid interpolation code = %2d\n",kcode);
+      *kret = 2;
+    }
+
+L900:
+    return 0;
+} /* rowina2 */
+
+
+
+int qu2reg2(double *pfield, int *kpoint, int klat, int klon,
+	    double *ztemp, double msval, int *kret)
+{
+   /* System generated locals */
+   int i_1, i_2;
+   int kcode = 1;
+
+   /* Local variables */
+   int ilii, ilio, icode;
+   double *zline = NULL;
+   double *zwork = NULL;
+   int iregno, iquano;
+
+
+   zline = (double*) Malloc(2*(size_t)klon*sizeof(double));
+   if ( zline == NULL ) SysError("No Memory!");
+
+   zwork = (double*) Malloc(3*(2*(size_t)klon+3)*sizeof(double));
+   if ( zwork == NULL ) SysError("No Memory!");
+
+   /* Parameter adjustments */
+   --pfield;
+   --kpoint;
+
+/* **** QU2REG - Convert quasi-regular grid data to regular. */
+/*     Input Parameters. */
+/*     ----------------- */
+/*     PFIELD     - Array containing quasi-regular grid */
+/*                  data. */
+/*     KPOINT     - Array containing list of the number of */
+/*                  points on each latitude (or longitude) of */
+/*                  the quasi-regular grid. */
+/*     KLAT       - Number of latitude lines */
+/*     KLON       - Number of longitude lines */
+/*     KCODE      - Interpolation required. */
+/*                  1 , linear - data quasi-regular on */
+/*                               latitude lines. */
+/*                  3 , cubic -  data quasi-regular on */
+/*                               latitude lines. */
+/*                  11, linear - data quasi-regular on */
+/*                               longitude lines. */
+/*                  13, cubic -  data quasi-regular on */
+/*                               longitude lines. */
+/*     PMSVAL     - Value used for missing data indicator. */
+/*     Output Parameters. */
+/*     ------------------ */
+/*     KRET       - return code */
+/*                  0 = OK */
+/*                  non-zero indicates fatal error */
+/*     PFIELD     - Array containing regular grid data. */
+/*     Author. */
+/*     ------- */
+/*     J.D.Chambers     ECMWF      22.07.94 */
+/*     J.D.Chambers     ECMWF      13.09.94 */
+/*     Add return code KRET and remove calls to ABORT. */
+
+
+/* ------------------------------ */
+/* Section 1. Set initial values. */
+/* ------------------------------ */
+
+   *kret = 0;
+
+/* Check input parameters. */
+
+   if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) {
+      fprintf(stderr," QU2REG :");
+      fprintf(stderr," Invalid interpolation type code = %2d\n",kcode);
+      *kret = 1;
+      goto L900;
+   }
+
+/* Set array indices to 0. */
+
+   ilii = 0;
+   ilio = 0;
+
+/* Establish values of loop parameters. */
+
+   if (kcode > 10) {
+
+/*    Quasi-regular along longitude lines. */
+
+      iquano = klon;
+      iregno = klat;
+      icode = kcode - 10;
+   } else {
+
+/*    Quasi-regular along latitude lines. */
+
+      iquano = klat;
+      iregno = klon;
+      icode = kcode;
+   }
+
+/*     -------------------------------------------------------- */
+/**    Section 2. Interpolate field from quasi to regular grid. */
+/*     -------------------------------------------------------- */
+
+   i_1 = iquano;
+   for (int j230 = 1; j230 <= i_1; ++j230) {
+
+      if (iregno != kpoint[j230]) {
+
+/*       Line contains less values than required,so */
+/*       extract quasi-regular grid values for a line */
+
+         i_2 = kpoint[j230];
+         for (int j210 = 1; j210 <= i_2; ++j210) {
+            ++ilii;
+            zline[j210 - 1] = pfield[ilii];
+         }
+
+/*       and interpolate this line. */
+
+         rowina2(zline, iregno, kpoint[j230], zwork, icode, msval, kret);
+         if (*kret != 0) goto L900;
+
+/*       Add regular grid values for this line to the
+         temporary array. */
+
+         i_2 = iregno;
+         for (int j220 = 1; j220 <= i_2; ++j220) {
+            ++ilio;
+            ztemp[ilio - 1] = zline[j220 - 1];
+         }
+
+      } else {
+
+/*       Line contains the required number of values, so add */
+/*       this line to the temporary array. */
+
+         i_2 = iregno;
+         for (int j225 = 1; j225 <= i_2; ++j225) {
+            ++ilio;
+            ++ilii;
+            ztemp[ilio - 1] = pfield[ilii];
+         }
+      }
+   }
+
+   /* Copy temporary array to user array. */
+
+   i_1 = klon * klat;
+   for (int j240 = 1; j240 <= i_1; ++j240) {
+      pfield[j240] = ztemp[j240 - 1];
+   }
+
+/* -------------------------------------------------------- */
+/* Section 9. Return to calling routine. Format statements. */
+/* -------------------------------------------------------- */
+
+L900:
+
+   Free(zline);
+   Free(zwork);
+
+   return 0;
+} /* qu2reg2 */
+
+
+
+#ifdef T
+#undef T
+#endif
+#define T double
+#ifdef T
+
+/* calculate_pfactor: source code from grib_api-1.8.0 */
+double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation)
+{
+  /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/
+  long loop, index, m, n = 0;
+  double zeps = 1.0e-15;
+  long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1);
+  double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0;
+  double numerator = 0.0, denominator = 0.0;
+
+  // Setup the weights
+
+  double range = (double) (ismax - ismin +1);
+
+  double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double));
+  for( loop = ismin; loop <= ismax; loop++ )
+    weights[loop] = range / (double) (loop-ismin+1);
+
+  // Compute norms
+  // Handle values 2 at a time (real and imaginary parts).
+  double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double));
+
+  for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0;
+
+  // Form norms for the rows which contain part of the unscaled subset.
+
+  index = -2;
+  for( m = 0; m < subsetTruncation; m++ )
+    for( n = m; n <= fieldTruncation; n++ ) {
+      index += 2;
+      if( n >= subsetTruncation ) {
+        double tval = spectralField[index];
+        tval=tval<0?-tval:tval;
+        norms[n] = norms[n] > tval ? norms[n] : tval;
+        tval = spectralField[index+1];
+        tval=tval<0?-tval:tval;
+        norms[n] = norms[n] > tval ? norms[n] : tval;
+      }
+    }
+
+  // Form norms for the rows which do not contain part of the unscaled subset.
+
+  for( m = subsetTruncation; m <= fieldTruncation; m++ )
+    for( n = m; n <= fieldTruncation; n++ ) {
+      double tval = spectralField[index];
+      index += 2;
+      tval=tval<0?-tval:tval;
+      norms[n] = norms[n] > tval ? norms[n] : tval;
+      tval = spectralField[index+1];
+      tval=tval<0?-tval:tval;
+      norms[n] = norms[n] > tval ? norms[n] : tval;
+    }
+
+  // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG).
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+    norms[n] = norms[n] > zeps ? norms[n] : zeps;
+    if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps;
+  }
+
+  // Do linear fit to find the slope
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+    double x = log( (double) (loop*(loop+1)) );
+    double y = log( norms[loop] );
+    weightedSumOverX += x * weights[loop];
+    weightedSumOverY += y * weights[loop];
+    sumOfWeights = sumOfWeights + weights[loop];
+  }
+  weightedSumOverX /= sumOfWeights;
+  weightedSumOverY /= sumOfWeights;
+
+  // Perform a least square fit for the equation
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+
+    double x = log( (double)(loop*(loop+1)) );
+    double y = log( norms[loop] );
+    numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX);
+    denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX));
+  }
+  double slope = numerator / denominator;
+
+  Free(weights);
+  Free(norms);
+
+  double pFactor = -slope;
+  if( pFactor < -9999.9 ) pFactor = -9999.9;
+  if( pFactor > 9999.9 )  pFactor = 9999.9;
+
+  return pFactor;
+}
+
+void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv)
+{
+
+  if ( pcScale < -10000 || pcScale > 10000 )
+    {
+      fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale);
+      return;
+    }
+
+  // Setup scaling factors = n(n+1)^^p for n = 1 to truncation
+
+  if ( pcScale != 0 )
+    {
+      double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double));
+      const double power = (double) pcScale / 1000.;
+      scale[0] = 1.0;
+
+      if (pcScale != 1000)
+        for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power);
+      else
+        for (int n = 1; n <= trunc; ++n) scale[n] =     (double) (n*(n+1));
+
+      if ( inv )
+        for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n];
+
+      // Scale the values
+
+      size_t index = 0;
+
+      for (int m = 0;   m < pcStart; ++m)
+        for (int n = m; n <= trunc; n++, index += 2)
+          if ( n >= pcStart )
+            {
+              fpdata[index  ] = (T)(fpdata[index  ] * scale[n]);
+              fpdata[index+1] = (T)(fpdata[index+1] * scale[n]);
+            }
+
+      for (int m = pcStart; m <= trunc; ++m)
+        for (int n = m;     n <= trunc; n++, index += 2)
+          {
+            fpdata[index  ] = (T)(fpdata[index  ] * scale[n]);
+            fpdata[index+1] = (T)(fpdata[index+1] * scale[n]);
+          }
+      Free(scale);
+    }
+}
+
+
+void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp)
+{
+  T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T));
+  size_t inext = 0;
+  size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U;
+  size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U;
+  for (size_t m = 0, index = 0; m <= pcStart_; ++m)
+    {
+      size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0;
+      for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i];
+      inext += n_copies;
+      index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0;
+    }
+  for (size_t m = 0, index = 0; m <= trunc_; ++m)
+    {
+      size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0;
+      index += advIdx;
+      size_t copyStart = m > pcStart_ ? m : pcStart_ + 1;
+      size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0;
+      for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i];
+      inext += n_copies;
+      index += n_copies;
+    }
+  for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m];
+
+  Free(fphelp);
+}
+
+
+void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp)
+{
+  T *restrict fphelp = (T*) Malloc(nsp*sizeof(T));
+  size_t inext = 0;
+
+  for (size_t m = 0, index = 0;   m <= pcStart; ++m)
+    for (size_t n = m; n <= trunc; ++n)
+      {
+	if ( pcStart >= n )
+	  {
+	    fphelp[inext++] = fpdata[index];
+	    fphelp[inext++] = fpdata[index+1];
+	  }
+	index += 2;
+      }
+
+  for (size_t m = 0, index = 0; m <= trunc; ++m)
+    for (size_t n = m; n <= trunc; ++n)
+      {
+	if ( n > pcStart )
+	  {
+	    fphelp[inext++] = fpdata[index];
+	    fphelp[inext++] = fpdata[index+1];
+	  }
+	index += 2;
+      }
+
+  for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m];
+
+  Free(fphelp);
+}
+
+
+static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg)
+{
+  /* **** SCM0   - Apply SCM0 limiter to derivative estimates. */
+  /* output: */
+  /*   pdl   = the limited derivative at the left edge of the interval */
+  /*   pdr   = the limited derivative at the right edge of the interval */
+  /* inputs */
+  /*   pdl   = the original derivative at the left edge */
+  /*   pdr   = the original derivative at the right edge */
+  /*   pfl   = function value at the left edge of the interval */
+  /*   pfr   = function value at the right edge of the interval */
+  /*   klg   = number of intervals where the derivatives are limited */
+
+  /*  define constants */
+
+  double zeps = 1.0e-12;
+  double zfac = (1.0 - zeps) * 3.0;
+
+  for (int jl = 0; jl < klg; ++jl)
+    {
+      double r_1;
+      if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps )
+	{
+	  double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]);
+	  double zbeta  = pdr[jl] / (pfr[jl] - pfl[jl]);
+	  if ( zalpha <= 0.0 ) pdl[jl] = 0.0;
+	  if ( zbeta  <= 0.0 ) pdr[jl] = 0.0;
+	  if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl]));
+	  if ( zbeta  > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl]));
+	}
+      else
+	{
+	  pdl[jl] = 0.0;
+	  pdr[jl] = 0.0;
+	}
+    }
+} /* scm0 */
+
+static
+int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw,
+			int kcode, T msval, int *kret, int omisng, int operio, int oveggy)
+{
+  /*
+C---->
+C**** ROWINA3 - Interpolation of row of values.
+C
+C     Purpose.
+C     --------
+C
+C     Interpolate a row of values.
+C
+C
+C**   Interface.
+C     ----------
+C
+C     CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO)
+C
+C
+C     Input Parameters.
+C     -----------------
+C
+C     P      - Row of values to be interpolated.
+C              Dimension must be at least KO.
+C
+C     KO     - Number of values required.
+C
+C     KI     - Number of values in P on input.
+C
+C     PW     - Working array.
+C              Dimension must be at least (0:KO+2,3).
+C
+C     KCODE  - Interpolation required.
+C              1 , linear.
+C              3 , cubic.
+C
+C     PMSVAL - Value used for missing data indicator.
+C
+C     OMISNG - True if missing values are present in field.
+C
+C     OPERIO - True if input field is periodic.
+C
+C     OVEGGY - True if 'nearest neighbour' processing must be used
+C              for interpolation
+C
+C     Output Parameters.
+C     ------------------
+C
+C     P     - Now contains KO values.
+C     KRET  - Return code
+C             0, OK
+C             Non-zero, error
+C
+C
+C     Method.
+C     -------
+C
+C     Linear or cubic interpolation performed as required.
+C
+C     Comments.
+C     ---------
+C
+C     This is a version of ROWINA which allows for missing data
+C     values and hence for bitmapped fields.
+C
+C
+C     Author.
+C     -------
+C
+C     J.D.Chambers    ECMWF     22.07.94
+C
+C
+C     Modifications.
+C     --------------
+C
+C     J.D.Chambers    ECMWF     13.09.94
+C     Add return code KRET and remove calls to ABORT.
+C
+C     J. Clochard, Meteo France, for ECMWF - January 1998.
+C     Addition of OMISNG and OPERIO arguments.
+C
+C
+C     -----------------------------------------------------------------
+*/
+  /* System generated locals */
+  int pw_dim1, pw_offset, i_1;
+
+  /* Local variables */
+  int ip;
+  double zwt1, zrdi, zpos;
+  double zdo, zwt;
+
+  UNUSED(omisng);
+
+  /* Parameter adjustments */
+  --p;
+  pw_dim1 = ko + 3;
+  pw_offset = pw_dim1;
+  pw -= pw_offset;
+
+  *kret = 0;
+
+  if ( kcode == 1 )
+    {
+      /*    Move input values to work array */
+      for (int jl = 1; jl <= ki; ++jl)
+	pw[jl + pw_dim1] = p[jl];
+
+      if ( operio )
+	{
+	  /* Arrange wrap-around value in work array */
+	  pw[ki + 1 + pw_dim1] = p[1];
+
+	  /* Set up constants to be used to figure out weighting for */
+	  /* values in interpolation. */
+	  zrdi = (double) ki;
+	  zdo = 1.0 / (double) ko;
+	}
+      else
+	{
+	  /* Repeat last value, to cope with "implicit truncation" below */
+	  pw[ki + 1 + pw_dim1] = p[ki];
+
+	  /* Set up constants to be used to figure out weighting for */
+	  /* values in interpolation. */
+	  zrdi = (double) (ki-1);
+	  zdo = 1.0 / (double) (ko-1);
+ 	}
+
+      /*    Loop through the output points */
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+
+	  /* Calculate weight from the start of row */
+	  zpos = (jl - 1) * zdo;
+	  zwt = zpos * zrdi;
+
+	  /* Get the current array position(minus 1) from the weight - */
+	  /* note the implicit truncation. */
+	  ip = (int) zwt;
+
+	  /* Adjust the weight to range (0.0 to 1.0) */
+	  zwt -= ip;
+
+          /* If 'nearest neighbour' processing must be used */
+	  if ( oveggy )
+	    {
+              if ( zwt < 0.5 )
+                p[jl] = pw[ip + 1 + pw_dim1];
+	      else
+		p[jl] = pw[ip + 2 + pw_dim1];
+	    }
+	  else
+	    {
+	      /*    If the left value is missing, use the right value */
+	      if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) )
+		{
+		  p[jl] = pw[ip + 2 + pw_dim1];
+		}
+	      /*    If the right value is missing, use the left value */
+	      else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) )
+		{
+		  p[jl] = pw[ip + 1 + pw_dim1];
+		}
+	      /*    If neither missing, interpolate ... */
+	      else
+		{
+		  /*  Interpolate using the weighted values on either side */
+		  /*  of the output point position */
+		  p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1]
+                              + zwt * pw[ip+2 + pw_dim1]);
+		}
+	    }
+	}
+    }
+  else if ( kcode == 3 )
+    {
+      /*     *******************************    */
+      /*     Section 2.  Cubic interpolation .. */
+      /*     *******************************    */
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          if ( IS_EQUAL(p[jl], msval) )
+	    {
+	      fprintf(stderr," ROWINA3: ");
+	      fprintf(stderr," Cubic interpolation not supported");
+	      fprintf(stderr," for fields containing missing data.\n");
+	      *kret = 1;
+	      goto L900;
+	    }
+          pw[jl + pw_dim1] = p[jl];
+	}
+      pw[pw_dim1] = p[ki];
+      pw[ki + 1 + pw_dim1] = p[1];
+      pw[ki + 2 + pw_dim1] = p[2];
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          pw[jl + (pw_dim1 << 1)] =
+            (T)(- pw[jl - 1 + pw_dim1] / 3.0 -
+                pw[jl     + pw_dim1] * 0.5 +
+                pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0);
+          pw[jl + 1 + pw_dim1 * 3] =
+            (T)(pw[jl - 1 + pw_dim1] / 6.0 -
+                pw[jl     + pw_dim1] +
+                pw[jl + 1 + pw_dim1] * 0.5 +
+                pw[jl + 2 + pw_dim1] / 3.0);
+	}
+
+      TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2],
+		       &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki);
+
+      zrdi = (double) ki;
+      zdo = 1.0 / (double) ko;
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+          zpos = (jl - 1) * zdo;
+          zwt = zpos * zrdi;
+          ip = (int) zwt + 1;
+          zwt = zwt + 1.0 - ip;
+          zwt1 = 1.0 - zwt;
+          p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] +
+                       zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 +
+                      ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] -
+                       zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt);
+	}
+
+    }
+  else
+    {
+      /*    **************************************    */
+      /*    Section 3.  Invalid interpolation code .. */
+      /*    **************************************    */
+      fprintf(stderr," ROWINA3:");
+      fprintf(stderr," Invalid interpolation code = %2d\n",kcode);
+      *kret = 2;
+    }
+
+L900:
+    return 0;
+} /* rowina3 */
+
+
+int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon,
+			T msval, int *kret, int omisng, int operio, int oveggy)
+{
+  /*
+C**** QU2REG3 - Convert quasi-regular grid data to regular.
+C
+C     Purpose.
+C     --------
+C
+C     Convert quasi-regular grid data to regular,
+C     using either a linear or cubic interpolation.
+C
+C
+C**   Interface.
+C     ----------
+C
+C     CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO,
+C    X            OVEGGY)
+C
+C
+C     Input Parameters.
+C     -----------------
+C
+C     PFIELD     - Array containing quasi-regular grid data.
+C
+C     KPOINT     - Array containing list of the number of
+C                  points on each latitude (or longitude) of
+C                  the quasi-regular grid.
+C
+C     KLAT       - Number of latitude lines
+C
+C     KLON       - Number of longitude lines
+C
+C     KCODE      - Interpolation required.
+C                  1 , linear - data quasi-regular on latitude lines.
+C                  3 , cubic -  data quasi-regular on latitude lines.
+C                  11, linear - data quasi-regular on longitude lines.
+C                  13, cubic -  data quasi-regular on longitude lines.
+C
+C     PMSVAL     - Value used for missing data indicator.
+C
+C     OMISNG     - True if missing values are present in field.
+C
+C     OPERIO     - True if input field is periodic.
+C
+C     OVEGGY     - True if 'nearest neighbour' processing must be used
+C                  for interpolation
+C
+C
+C     Output Parameters.
+C     ------------------
+C
+C     KRET       - return code
+C                  0 = OK
+C                  non-zero indicates fatal error
+C
+C
+C     Output Parameters.
+C     ------------------
+C
+C     PFIELD     - Array containing regular grid data.
+C
+C
+C     Method.
+C     -------
+C
+C     Data is interpolated and expanded into a temporary array,
+C     which is then copied back into the user's array.
+C     Returns an error code if an invalid interpolation is requested
+C     or field size exceeds array dimensions.
+C
+C     Comments.
+C     ---------
+C
+C     This routine is an adaptation of QU2REG to allow missing data
+C     values, and hence bit mapped fields.
+C
+C
+C     Author.
+C     -------
+C
+C     J.D.Chambers     ECMWF      22.07.94
+C
+C
+C     Modifications.
+C     --------------
+C
+C     J.D.Chambers     ECMWF      13.09.94
+C     Add return code KRET and remove calls to ABORT.
+C
+C     J.D.Chambers     ECMWF        Feb 1997
+C     Allow for 64-bit pointers
+C
+C     J. Clochard, Meteo France, for ECMWF - January 1998.
+C     Addition of OMISNG and OPERIO arguments.
+C     Fix message for longitude number out of bounds, and routine
+C     name in title and formats.
+C
+*/
+   /* System generated locals */
+   int i_1, i_2;
+   int kcode = 1;
+
+   /* Local variables */
+   int ilii, ilio, icode;
+   int iregno, iquano;
+
+   T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T));
+   T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T));
+   T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T));
+
+   /* Parameter adjustments */
+   --pfield;
+   --kpoint;
+
+/* ------------------------------ */
+/* Section 1. Set initial values. */
+/* ------------------------------ */
+
+   *kret = 0;
+
+/* Check input parameters. */
+
+   if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) {
+      fprintf(stderr," QU2REG :");
+      fprintf(stderr," Invalid interpolation type code = %2d\n",kcode);
+      *kret = 1;
+      goto L900;
+   }
+
+/* Set array indices to 0. */
+
+   ilii = 0;
+   ilio = 0;
+
+/* Establish values of loop parameters. */
+
+   if (kcode > 10) {
+
+/*    Quasi-regular along longitude lines. */
+
+      iquano = klon;
+      iregno = klat;
+      icode = kcode - 10;
+   } else {
+
+/*    Quasi-regular along latitude lines. */
+
+      iquano = klat;
+      iregno = klon;
+      icode = kcode;
+   }
+
+/*     -------------------------------------------------------- */
+/**    Section 2. Interpolate field from quasi to regular grid. */
+/*     -------------------------------------------------------- */
+
+   i_1 = iquano;
+   for (int j230 = 1; j230 <= i_1; ++j230) {
+
+      if (iregno != kpoint[j230]) {
+
+/*       Line contains less values than required,so */
+/*       extract quasi-regular grid values for a line */
+
+         i_2 = kpoint[j230];
+         for (int j210 = 1; j210 <= i_2; ++j210) {
+            ++ilii;
+            zline[j210 - 1] = pfield[ilii];
+         }
+
+/*       and interpolate this line. */
+
+         TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy);
+         if (*kret != 0) goto L900;
+
+/*       Add regular grid values for this line to the
+         temporary array. */
+
+         i_2 = iregno;
+         for (int j220 = 1; j220 <= i_2; ++j220) {
+            ++ilio;
+            ztemp[ilio - 1] = zline[j220 - 1];
+         }
+
+      } else {
+
+/*       Line contains the required number of values, so add */
+/*       this line to the temporary array. */
+
+         i_2 = iregno;
+         for (int j225 = 1; j225 <= i_2; ++j225) {
+            ++ilio;
+            ++ilii;
+            ztemp[ilio - 1] = pfield[ilii];
+         }
+      }
+   }
+
+/* Copy temporary array to user array. */
+
+   i_1 = klon * klat;
+   for (int j240 = 1; j240 <= i_1; ++j240) {
+      pfield[j240] = ztemp[j240 - 1];
+   }
+
+/* -------------------------------------------------------- */
+/* Section 9. Return to calling routine. Format statements. */
+/* -------------------------------------------------------- */
+
+L900:
+
+   Free(zwork);
+   Free(zline);
+   Free(ztemp);
+
+   return 0;
+} /* qu2reg3 */
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+
+#ifdef T
+#undef T
+#endif
+#define T float
+#ifdef T
+
+/* calculate_pfactor: source code from grib_api-1.8.0 */
+double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation)
+{
+  /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/
+  long loop, index, m, n = 0;
+  double zeps = 1.0e-15;
+  long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1);
+  double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0;
+  double numerator = 0.0, denominator = 0.0;
+
+  // Setup the weights
+
+  double range = (double) (ismax - ismin +1);
+
+  double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double));
+  for( loop = ismin; loop <= ismax; loop++ )
+    weights[loop] = range / (double) (loop-ismin+1);
+
+  // Compute norms
+  // Handle values 2 at a time (real and imaginary parts).
+  double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double));
+
+  for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0;
+
+  // Form norms for the rows which contain part of the unscaled subset.
+
+  index = -2;
+  for( m = 0; m < subsetTruncation; m++ )
+    for( n = m; n <= fieldTruncation; n++ ) {
+      index += 2;
+      if( n >= subsetTruncation ) {
+        double tval = spectralField[index];
+        tval=tval<0?-tval:tval;
+        norms[n] = norms[n] > tval ? norms[n] : tval;
+        tval = spectralField[index+1];
+        tval=tval<0?-tval:tval;
+        norms[n] = norms[n] > tval ? norms[n] : tval;
+      }
+    }
+
+  // Form norms for the rows which do not contain part of the unscaled subset.
+
+  for( m = subsetTruncation; m <= fieldTruncation; m++ )
+    for( n = m; n <= fieldTruncation; n++ ) {
+      double tval = spectralField[index];
+      index += 2;
+      tval=tval<0?-tval:tval;
+      norms[n] = norms[n] > tval ? norms[n] : tval;
+      tval = spectralField[index+1];
+      tval=tval<0?-tval:tval;
+      norms[n] = norms[n] > tval ? norms[n] : tval;
+    }
+
+  // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG).
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+    norms[n] = norms[n] > zeps ? norms[n] : zeps;
+    if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps;
+  }
+
+  // Do linear fit to find the slope
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+    double x = log( (double) (loop*(loop+1)) );
+    double y = log( norms[loop] );
+    weightedSumOverX += x * weights[loop];
+    weightedSumOverY += y * weights[loop];
+    sumOfWeights = sumOfWeights + weights[loop];
+  }
+  weightedSumOverX /= sumOfWeights;
+  weightedSumOverY /= sumOfWeights;
+
+  // Perform a least square fit for the equation
+
+  for( loop = ismin; loop <= ismax; loop++ ) {
+
+    double x = log( (double)(loop*(loop+1)) );
+    double y = log( norms[loop] );
+    numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX);
+    denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX));
+  }
+  double slope = numerator / denominator;
+
+  Free(weights);
+  Free(norms);
+
+  double pFactor = -slope;
+  if( pFactor < -9999.9 ) pFactor = -9999.9;
+  if( pFactor > 9999.9 )  pFactor = 9999.9;
+
+  return pFactor;
+}
+
+void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv)
+{
+
+  if ( pcScale < -10000 || pcScale > 10000 )
+    {
+      fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale);
+      return;
+    }
+
+  // Setup scaling factors = n(n+1)^^p for n = 1 to truncation
+
+  if ( pcScale != 0 )
+    {
+      double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double));
+      const double power = (double) pcScale / 1000.;
+      scale[0] = 1.0;
+
+      if (pcScale != 1000)
+        for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power);
+      else
+        for (int n = 1; n <= trunc; ++n) scale[n] =     (double) (n*(n+1));
+
+      if ( inv )
+        for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n];
+
+      // Scale the values
+
+      size_t index = 0;
+
+      for (int m = 0;   m < pcStart; ++m)
+        for (int n = m; n <= trunc; n++, index += 2)
+          if ( n >= pcStart )
+            {
+              fpdata[index  ] = (T)(fpdata[index  ] * scale[n]);
+              fpdata[index+1] = (T)(fpdata[index+1] * scale[n]);
+            }
+
+      for (int m = pcStart; m <= trunc; ++m)
+        for (int n = m;     n <= trunc; n++, index += 2)
+          {
+            fpdata[index  ] = (T)(fpdata[index  ] * scale[n]);
+            fpdata[index+1] = (T)(fpdata[index+1] * scale[n]);
+          }
+      Free(scale);
+    }
+}
+
+
+void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp)
+{
+  T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T));
+  size_t inext = 0;
+  size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U;
+  size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U;
+  for (size_t m = 0, index = 0; m <= pcStart_; ++m)
+    {
+      size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0;
+      for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i];
+      inext += n_copies;
+      index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0;
+    }
+  for (size_t m = 0, index = 0; m <= trunc_; ++m)
+    {
+      size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0;
+      index += advIdx;
+      size_t copyStart = m > pcStart_ ? m : pcStart_ + 1;
+      size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0;
+      for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i];
+      inext += n_copies;
+      index += n_copies;
+    }
+  for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m];
+
+  Free(fphelp);
+}
+
+
+void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp)
+{
+  T *restrict fphelp = (T*) Malloc(nsp*sizeof(T));
+  size_t inext = 0;
+
+  for (size_t m = 0, index = 0;   m <= pcStart; ++m)
+    for (size_t n = m; n <= trunc; ++n)
+      {
+	if ( pcStart >= n )
+	  {
+	    fphelp[inext++] = fpdata[index];
+	    fphelp[inext++] = fpdata[index+1];
+	  }
+	index += 2;
+      }
+
+  for (size_t m = 0, index = 0; m <= trunc; ++m)
+    for (size_t n = m; n <= trunc; ++n)
+      {
+	if ( n > pcStart )
+	  {
+	    fphelp[inext++] = fpdata[index];
+	    fphelp[inext++] = fpdata[index+1];
+	  }
+	index += 2;
+      }
+
+  for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m];
+
+  Free(fphelp);
+}
+
+
+static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg)
+{
+  /* **** SCM0   - Apply SCM0 limiter to derivative estimates. */
+  /* output: */
+  /*   pdl   = the limited derivative at the left edge of the interval */
+  /*   pdr   = the limited derivative at the right edge of the interval */
+  /* inputs */
+  /*   pdl   = the original derivative at the left edge */
+  /*   pdr   = the original derivative at the right edge */
+  /*   pfl   = function value at the left edge of the interval */
+  /*   pfr   = function value at the right edge of the interval */
+  /*   klg   = number of intervals where the derivatives are limited */
+
+  /*  define constants */
+
+  double zeps = 1.0e-12;
+  double zfac = (1.0 - zeps) * 3.0;
+
+  for (int jl = 0; jl < klg; ++jl)
+    {
+      double r_1;
+      if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps )
+	{
+	  double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]);
+	  double zbeta  = pdr[jl] / (pfr[jl] - pfl[jl]);
+	  if ( zalpha <= 0.0 ) pdl[jl] = 0.0;
+	  if ( zbeta  <= 0.0 ) pdr[jl] = 0.0;
+	  if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl]));
+	  if ( zbeta  > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl]));
+	}
+      else
+	{
+	  pdl[jl] = 0.0;
+	  pdr[jl] = 0.0;
+	}
+    }
+} /* scm0 */
+
+static
+int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw,
+			int kcode, T msval, int *kret, int omisng, int operio, int oveggy)
+{
+  /*
+C---->
+C**** ROWINA3 - Interpolation of row of values.
+C
+C     Purpose.
+C     --------
+C
+C     Interpolate a row of values.
+C
+C
+C**   Interface.
+C     ----------
+C
+C     CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO)
+C
+C
+C     Input Parameters.
+C     -----------------
+C
+C     P      - Row of values to be interpolated.
+C              Dimension must be at least KO.
+C
+C     KO     - Number of values required.
+C
+C     KI     - Number of values in P on input.
+C
+C     PW     - Working array.
+C              Dimension must be at least (0:KO+2,3).
+C
+C     KCODE  - Interpolation required.
+C              1 , linear.
+C              3 , cubic.
+C
+C     PMSVAL - Value used for missing data indicator.
+C
+C     OMISNG - True if missing values are present in field.
+C
+C     OPERIO - True if input field is periodic.
+C
+C     OVEGGY - True if 'nearest neighbour' processing must be used
+C              for interpolation
+C
+C     Output Parameters.
+C     ------------------
+C
+C     P     - Now contains KO values.
+C     KRET  - Return code
+C             0, OK
+C             Non-zero, error
+C
+C
+C     Method.
+C     -------
+C
+C     Linear or cubic interpolation performed as required.
+C
+C     Comments.
+C     ---------
+C
+C     This is a version of ROWINA which allows for missing data
+C     values and hence for bitmapped fields.
+C
+C
+C     Author.
+C     -------
+C
+C     J.D.Chambers    ECMWF     22.07.94
+C
+C
+C     Modifications.
+C     --------------
+C
+C     J.D.Chambers    ECMWF     13.09.94
+C     Add return code KRET and remove calls to ABORT.
+C
+C     J. Clochard, Meteo France, for ECMWF - January 1998.
+C     Addition of OMISNG and OPERIO arguments.
+C
+C
+C     -----------------------------------------------------------------
+*/
+  /* System generated locals */
+  int pw_dim1, pw_offset, i_1;
+
+  /* Local variables */
+  int ip;
+  double zwt1, zrdi, zpos;
+  double zdo, zwt;
+
+  UNUSED(omisng);
+
+  /* Parameter adjustments */
+  --p;
+  pw_dim1 = ko + 3;
+  pw_offset = pw_dim1;
+  pw -= pw_offset;
+
+  *kret = 0;
+
+  if ( kcode == 1 )
+    {
+      /*    Move input values to work array */
+      for (int jl = 1; jl <= ki; ++jl)
+	pw[jl + pw_dim1] = p[jl];
+
+      if ( operio )
+	{
+	  /* Arrange wrap-around value in work array */
+	  pw[ki + 1 + pw_dim1] = p[1];
+
+	  /* Set up constants to be used to figure out weighting for */
+	  /* values in interpolation. */
+	  zrdi = (double) ki;
+	  zdo = 1.0 / (double) ko;
+	}
+      else
+	{
+	  /* Repeat last value, to cope with "implicit truncation" below */
+	  pw[ki + 1 + pw_dim1] = p[ki];
+
+	  /* Set up constants to be used to figure out weighting for */
+	  /* values in interpolation. */
+	  zrdi = (double) (ki-1);
+	  zdo = 1.0 / (double) (ko-1);
+ 	}
+
+      /*    Loop through the output points */
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+
+	  /* Calculate weight from the start of row */
+	  zpos = (jl - 1) * zdo;
+	  zwt = zpos * zrdi;
+
+	  /* Get the current array position(minus 1) from the weight - */
+	  /* note the implicit truncation. */
+	  ip = (int) zwt;
+
+	  /* Adjust the weight to range (0.0 to 1.0) */
+	  zwt -= ip;
+
+          /* If 'nearest neighbour' processing must be used */
+	  if ( oveggy )
+	    {
+              if ( zwt < 0.5 )
+                p[jl] = pw[ip + 1 + pw_dim1];
+	      else
+		p[jl] = pw[ip + 2 + pw_dim1];
+	    }
+	  else
+	    {
+	      /*    If the left value is missing, use the right value */
+	      if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) )
+		{
+		  p[jl] = pw[ip + 2 + pw_dim1];
+		}
+	      /*    If the right value is missing, use the left value */
+	      else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) )
+		{
+		  p[jl] = pw[ip + 1 + pw_dim1];
+		}
+	      /*    If neither missing, interpolate ... */
+	      else
+		{
+		  /*  Interpolate using the weighted values on either side */
+		  /*  of the output point position */
+		  p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1]
+                              + zwt * pw[ip+2 + pw_dim1]);
+		}
+	    }
+	}
+    }
+  else if ( kcode == 3 )
+    {
+      /*     *******************************    */
+      /*     Section 2.  Cubic interpolation .. */
+      /*     *******************************    */
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          if ( IS_EQUAL(p[jl], msval) )
+	    {
+	      fprintf(stderr," ROWINA3: ");
+	      fprintf(stderr," Cubic interpolation not supported");
+	      fprintf(stderr," for fields containing missing data.\n");
+	      *kret = 1;
+	      goto L900;
+	    }
+          pw[jl + pw_dim1] = p[jl];
+	}
+      pw[pw_dim1] = p[ki];
+      pw[ki + 1 + pw_dim1] = p[1];
+      pw[ki + 2 + pw_dim1] = p[2];
+      i_1 = ki;
+      for (int jl = 1; jl <= i_1; ++jl)
+	{
+          pw[jl + (pw_dim1 << 1)] =
+            (T)(- pw[jl - 1 + pw_dim1] / 3.0 -
+                pw[jl     + pw_dim1] * 0.5 +
+                pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0);
+          pw[jl + 1 + pw_dim1 * 3] =
+            (T)(pw[jl - 1 + pw_dim1] / 6.0 -
+                pw[jl     + pw_dim1] +
+                pw[jl + 1 + pw_dim1] * 0.5 +
+                pw[jl + 2 + pw_dim1] / 3.0);
+	}
+
+      TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2],
+		       &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki);
+
+      zrdi = (double) ki;
+      zdo = 1.0 / (double) ko;
+      for (int jl = 1; jl <= ko; ++jl)
+	{
+          zpos = (jl - 1) * zdo;
+          zwt = zpos * zrdi;
+          ip = (int) zwt + 1;
+          zwt = zwt + 1.0 - ip;
+          zwt1 = 1.0 - zwt;
+          p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] +
+                       zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 +
+                      ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] -
+                       zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt);
+	}
+
+    }
+  else
+    {
+      /*    **************************************    */
+      /*    Section 3.  Invalid interpolation code .. */
+      /*    **************************************    */
+      fprintf(stderr," ROWINA3:");
+      fprintf(stderr," Invalid interpolation code = %2d\n",kcode);
+      *kret = 2;
+    }
+
+L900:
+    return 0;
+} /* rowina3 */
+
+
+int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon,
+			T msval, int *kret, int omisng, int operio, int oveggy)
+{
+  /*
+C**** QU2REG3 - Convert quasi-regular grid data to regular.
+C
+C     Purpose.
+C     --------
+C
+C     Convert quasi-regular grid data to regular,
+C     using either a linear or cubic interpolation.
+C
+C
+C**   Interface.
+C     ----------
+C
+C     CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO,
+C    X            OVEGGY)
+C
+C
+C     Input Parameters.
+C     -----------------
+C
+C     PFIELD     - Array containing quasi-regular grid data.
+C
+C     KPOINT     - Array containing list of the number of
+C                  points on each latitude (or longitude) of
+C                  the quasi-regular grid.
+C
+C     KLAT       - Number of latitude lines
+C
+C     KLON       - Number of longitude lines
+C
+C     KCODE      - Interpolation required.
+C                  1 , linear - data quasi-regular on latitude lines.
+C                  3 , cubic -  data quasi-regular on latitude lines.
+C                  11, linear - data quasi-regular on longitude lines.
+C                  13, cubic -  data quasi-regular on longitude lines.
+C
+C     PMSVAL     - Value used for missing data indicator.
+C
+C     OMISNG     - True if missing values are present in field.
+C
+C     OPERIO     - True if input field is periodic.
+C
+C     OVEGGY     - True if 'nearest neighbour' processing must be used
+C                  for interpolation
+C
+C
+C     Output Parameters.
+C     ------------------
+C
+C     KRET       - return code
+C                  0 = OK
+C                  non-zero indicates fatal error
+C
+C
+C     Output Parameters.
+C     ------------------
+C
+C     PFIELD     - Array containing regular grid data.
+C
+C
+C     Method.
+C     -------
+C
+C     Data is interpolated and expanded into a temporary array,
+C     which is then copied back into the user's array.
+C     Returns an error code if an invalid interpolation is requested
+C     or field size exceeds array dimensions.
+C
+C     Comments.
+C     ---------
+C
+C     This routine is an adaptation of QU2REG to allow missing data
+C     values, and hence bit mapped fields.
+C
+C
+C     Author.
+C     -------
+C
+C     J.D.Chambers     ECMWF      22.07.94
+C
+C
+C     Modifications.
+C     --------------
+C
+C     J.D.Chambers     ECMWF      13.09.94
+C     Add return code KRET and remove calls to ABORT.
+C
+C     J.D.Chambers     ECMWF        Feb 1997
+C     Allow for 64-bit pointers
+C
+C     J. Clochard, Meteo France, for ECMWF - January 1998.
+C     Addition of OMISNG and OPERIO arguments.
+C     Fix message for longitude number out of bounds, and routine
+C     name in title and formats.
+C
+*/
+   /* System generated locals */
+   int i_1, i_2;
+   int kcode = 1;
+
+   /* Local variables */
+   int ilii, ilio, icode;
+   int iregno, iquano;
+
+   T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T));
+   T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T));
+   T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T));
+
+   /* Parameter adjustments */
+   --pfield;
+   --kpoint;
+
+/* ------------------------------ */
+/* Section 1. Set initial values. */
+/* ------------------------------ */
+
+   *kret = 0;
+
+/* Check input parameters. */
+
+   if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) {
+      fprintf(stderr," QU2REG :");
+      fprintf(stderr," Invalid interpolation type code = %2d\n",kcode);
+      *kret = 1;
+      goto L900;
+   }
+
+/* Set array indices to 0. */
+
+   ilii = 0;
+   ilio = 0;
+
+/* Establish values of loop parameters. */
+
+   if (kcode > 10) {
+
+/*    Quasi-regular along longitude lines. */
+
+      iquano = klon;
+      iregno = klat;
+      icode = kcode - 10;
+   } else {
+
+/*    Quasi-regular along latitude lines. */
+
+      iquano = klat;
+      iregno = klon;
+      icode = kcode;
+   }
+
+/*     -------------------------------------------------------- */
+/**    Section 2. Interpolate field from quasi to regular grid. */
+/*     -------------------------------------------------------- */
+
+   i_1 = iquano;
+   for (int j230 = 1; j230 <= i_1; ++j230) {
+
+      if (iregno != kpoint[j230]) {
+
+/*       Line contains less values than required,so */
+/*       extract quasi-regular grid values for a line */
+
+         i_2 = kpoint[j230];
+         for (int j210 = 1; j210 <= i_2; ++j210) {
+            ++ilii;
+            zline[j210 - 1] = pfield[ilii];
+         }
+
+/*       and interpolate this line. */
+
+         TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy);
+         if (*kret != 0) goto L900;
+
+/*       Add regular grid values for this line to the
+         temporary array. */
+
+         i_2 = iregno;
+         for (int j220 = 1; j220 <= i_2; ++j220) {
+            ++ilio;
+            ztemp[ilio - 1] = zline[j220 - 1];
+         }
+
+      } else {
+
+/*       Line contains the required number of values, so add */
+/*       this line to the temporary array. */
+
+         i_2 = iregno;
+         for (int j225 = 1; j225 <= i_2; ++j225) {
+            ++ilio;
+            ++ilii;
+            ztemp[ilio - 1] = pfield[ilii];
+         }
+      }
+   }
+
+/* Copy temporary array to user array. */
+
+   i_1 = klon * klat;
+   for (int j240 = 1; j240 <= i_1; ++j240) {
+      pfield[j240] = ztemp[j240 - 1];
+   }
+
+/* -------------------------------------------------------- */
+/* Section 9. Return to calling routine. Format statements. */
+/* -------------------------------------------------------- */
+
+L900:
+
+   Free(zwork);
+   Free(zline);
+   Free(ztemp);
+
+   return 0;
+} /* qu2reg3 */
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+
+// clang-format on
+#include <string.h>
+
+int
+gribVersion(unsigned char *is, size_t buffersize)
+{
+  if (buffersize < 8) Error("Buffer too small (current size %d)!", (int) buffersize);
+
+  return GRIB_EDITION(is);
+}
+
+static double
+GET_Real(unsigned char *grib)
+{
+  int iexp = GET_UINT1(grib[0]);
+  int imant = (int) (GET_UINT3(grib[1], grib[2], grib[3]));
+
+  return decfp2(iexp, imant);
+}
+
+static size_t
+decodeIS(unsigned char *is, int *isec0, int *iret)
+{
+  // Octets 1 - 4 : The letters G R I B. Four 8 bit fields.
+
+  // Check letters -> GRIB, BUDG or TIDE.
+
+  // Check that 'GRIB' is found where expected.
+  bool lgrib = GRIB_START(is);
+
+  // ECMWF pseudo-grib data uses 'BUDG' and 'TIDE'.
+  bool lbudg = BUDG_START(is);
+  bool ltide = TIDE_START(is);
+
+  // Data is not GRIB or pseudo-grib.
+  if (lgrib == false && lbudg == false && ltide == false)
+    {
+      *iret = 305;
+      gprintf(__func__, "Input data is not GRIB or pseudo-grib.");
+      gprintf(__func__, "Return code = %d", *iret);
+    }
+  if (lbudg || ltide)
+    {
+      *iret = 305;
+      gprintf(__func__, "Pseudo-grib data unsupported.");
+      gprintf(__func__, "Return code = %d", *iret);
+    }
+
+  // Octets 5 - 7 : Length of message. One 24 bit field.
+  ISEC0_GRIB_Len = (int) (GRIB1_SECLEN(is));
+
+  // Octet 8 : GRIB Edition Number. One 8 bit field.
+  ISEC0_GRIB_Version = GRIB_EDITION(is);
+
+  if (ISEC0_GRIB_Version > 1) Error("GRIB version %d unsupported!", ISEC0_GRIB_Version);
+
+  int grib1offset = ISEC0_GRIB_Version * 4;
+
+  size_t isLen = 4 + (size_t) grib1offset;
+
+  return isLen;
+}
+
+static void
+decodePDS_ECMWF_local_Extension_1(unsigned char *pds, int *isec1)
+{
+  isec1[36] = GET_UINT1(pds[40]);                  /* extension identifier       */
+  isec1[37] = GET_UINT1(pds[41]);                  /* Class                      */
+  isec1[38] = GET_UINT1(pds[42]);                  /* Type                       */
+  isec1[39] = (int) (GET_UINT2(pds[43], pds[44])); /* Stream                     */
+  /* isec1[40] = GET_UINT4(pds[45],pds[46],pds[47],pds[48]); */
+  memcpy((char *) &isec1[40], &pds[45], 4);
+  isec1[41] = GET_UINT1(pds[49]); /* Forecast number            */
+  isec1[42] = GET_UINT1(pds[50]); /* Total number of forecasts  */
+}
+
+static void
+decodePDS_DWD_local_Extension_254(unsigned char *pds, int *isec1)
+{
+  isec1[36] = GET_UINT1(pds[40]); /* extension identifier */
+  for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]);
+
+  int isvn = (int) (GET_UINT2(pds[52], pds[53]));
+
+  isec1[48] = isvn % 0x8000; /* DWD experiment identifier            */
+  isec1[49] = isvn >> 15;    /* DWD run type (0=main, 2=ass, 3=test) */
+}
+
+static void
+decodePDS_DWD_local_Extension_253(unsigned char *pds, int *isec1)
+{
+  isec1[36] = GET_UINT1(pds[40]); /* extension identifier */
+  for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]);
+
+  int isvn = (int) (GET_UINT2(pds[52], pds[53]));
+
+  isec1[48] = isvn % 0x8000;                       /* DWD experiment identifier            */
+  isec1[49] = isvn >> 15;                          /* DWD run type (0=main, 2=ass, 3=test) */
+  isec1[50] = GET_UINT1(pds[54]);                  /* User id, specified by table          */
+  isec1[51] = (int) (GET_UINT2(pds[55], pds[56])); /* Experiment identifier                */
+  isec1[52] = (int) (GET_UINT2(pds[57], pds[58])); /* Ensemble identification by table     */
+  isec1[53] = (int) (GET_UINT2(pds[59], pds[60])); /* Number of ensemble members           */
+  isec1[54] = (int) (GET_UINT2(pds[61], pds[62])); /* Actual number of ensemble member     */
+  isec1[55] = GET_UINT1(pds[63]);                  /* Model major version number           */
+  isec1[56] = GET_UINT1(pds[64]);                  /* Model minor version number           */
+}
+
+static void
+decodePDS_MPIM_local_Extension_1(unsigned char *pds, int *isec1)
+{
+  isec1[36] = GET_UINT1(pds[40]);                  /* extension identifier            */
+  isec1[37] = GET_UINT1(pds[41]);                  /* type of ensemble forecast       */
+  isec1[38] = (int) (GET_UINT2(pds[42], pds[43])); /* individual ensemble member      */
+  isec1[39] = (int) (GET_UINT2(pds[44], pds[45])); /* number of forecasts in ensemble */
+}
+
+static size_t
+decodePDS(unsigned char *pds, int *isec0, int *isec1)
+{
+  size_t pdsLen = PDS_Len;
+
+  // clang-format off
+  ISEC1_CodeTable      = PDS_CodeTable;
+  ISEC1_CenterID       = PDS_CenterID;
+  ISEC1_ModelID        = PDS_ModelID;
+  ISEC1_GridDefinition = PDS_GridDefinition;
+  ISEC1_Sec2Or3Flag    = PDS_Sec2Or3Flag;
+  ISEC1_Parameter      = PDS_Parameter;
+  ISEC1_LevelType      = PDS_LevelType;
+
+  if ( (ISEC1_LevelType !=  20) && 
+       (ISEC1_LevelType != GRIB1_LTYPE_99)           && 
+       (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC)     && 
+       (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA)  && 
+       (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE)     && 
+       (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT)       && 
+       (ISEC1_LevelType != GRIB1_LTYPE_SIGMA)        && 
+       (ISEC1_LevelType != GRIB1_LTYPE_HYBRID)       && 
+       (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH)    && 
+       (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC)   && 
+       (ISEC1_LevelType != 115) && 
+       (ISEC1_LevelType != 117) && 
+       (ISEC1_LevelType != 125) && 
+       (ISEC1_LevelType != 127) && 
+       (ISEC1_LevelType != GRIB1_LTYPE_SEADEPTH)     && 
+       (ISEC1_LevelType != 210) )
+    {
+      ISEC1_Level1 = PDS_Level1;
+      ISEC1_Level2 = PDS_Level2;
+    }
+  else
+    {
+      ISEC1_Level1 = (int)(PDS_Level);
+      ISEC1_Level2 = 0;
+    }
+
+  /* ISEC1_Year        = PDS_Year; */
+  ISEC1_Month          = PDS_Month;
+  ISEC1_Day            = PDS_Day;
+  ISEC1_Hour           = PDS_Hour;
+  ISEC1_Minute         = PDS_Minute;
+  ISEC1_TimeUnit       = PDS_TimeUnit;
+  ISEC1_TimePeriod1    = PDS_TimePeriod1;
+  ISEC1_TimePeriod2    = PDS_TimePeriod2;
+  ISEC1_TimeRange      = PDS_TimeRange;
+  ISEC1_AvgNum         = (int)(PDS_AvgNum);
+  ISEC1_AvgMiss        = PDS_AvgMiss;
+
+  if ( ISEC0_GRIB_Version == 1 )
+    {
+      ISEC1_Year           = PDS_Year;
+      ISEC1_Century        = PDS_Century;
+      ISEC1_SubCenterID    = PDS_Subcenter;
+      ISEC1_DecScaleFactor = PDS_DecimalScale;
+    }
+  else
+    {
+      int year             = GET_UINT1(pds[12]);
+      if ( year <= 100 )
+	{
+	  ISEC1_Year       = year;
+	  ISEC1_Century    = 1;
+	}
+      else
+	{
+	  ISEC1_Year       = year%100;
+	  ISEC1_Century    = 1 + (year-ISEC1_Year)/100;
+	}
+      ISEC1_SubCenterID    = 0;
+      ISEC1_DecScaleFactor = 0;
+    }
+
+  if ( ISEC1_Year < 0 )
+    {
+      ISEC1_Year    = -ISEC1_Year;
+      ISEC1_Century = -ISEC1_Century;
+    }
+
+  ISEC1_LocalFLag = 0;
+  if ( pdsLen > 28 )
+    {
+      size_t localextlen = pdsLen-28;
+
+      if ( localextlen > 4000 )
+	{
+	  Warning("PDS larger than 4000 bytes not supported!");
+	}
+      else
+	{
+	  ISEC1_LocalFLag = 1;
+
+	  if ( ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250 )
+	    {
+	      if ( pds[40] == 254 ) 
+                decodePDS_DWD_local_Extension_254(pds, isec1);
+	      else if ( pds[40] == 253 )
+                decodePDS_DWD_local_Extension_253(pds, isec1);
+	    }
+	  else if ( (ISEC1_CenterID    == 98 && ISEC1_LocalFLag ==  1) ||
+		    (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag ==  1) ||
+		    (ISEC1_CenterID    ==  7 && ISEC1_SubCenterID == 98) )
+	    {
+	      if ( pds[40] == 1 )
+		decodePDS_ECMWF_local_Extension_1(pds, isec1);
+	    }
+	  else if ( ISEC1_CenterID    == 252 && ISEC1_LocalFLag ==  1 )
+	    {
+	      if ( pds[40] == 1 )
+		decodePDS_MPIM_local_Extension_1(pds, isec1);	      
+	    }
+	  else
+	    {
+	      for ( size_t i = 0; i < localextlen; i++ )
+                isec1[24+i] = pds[28+i];
+	    }
+	}
+    }
+  // clang-format on
+
+  return pdsLen;
+}
+
+static void
+gribPrintSec2_double(int *isec0, int *isec2, double *fsec2)
+{
+  gribPrintSec2DP(isec0, isec2, fsec2);
+}
+static void
+gribPrintSec3_double(int *isec0, int *isec3, double *fsec3)
+{
+  gribPrintSec3DP(isec0, isec3, fsec3);
+}
+static void
+gribPrintSec4_double(int *isec0, int *isec4, double *fsec4)
+{
+  gribPrintSec4DP(isec0, isec4, fsec4);
+}
+static void
+gribPrintSec2_float(int *isec0, int *isec2, float *fsec2)
+{
+  gribPrintSec2SP(isec0, isec2, fsec2);
+}
+static void
+gribPrintSec3_float(int *isec0, int *isec3, float *fsec3)
+{
+  gribPrintSec3SP(isec0, isec3, fsec3);
+}
+static void
+gribPrintSec4_float(int *isec0, int *isec4, float *fsec4)
+{
+  gribPrintSec4SP(isec0, isec4, fsec4);
+}
+
+// clang-format off
+
+#ifdef T
+#undef T
+#endif
+#define T double
+#ifdef T
+
+#include <inttypes.h>
+
+static 
+void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, 
+				     T fmin, T zscale, T *restrict fpdata)
+{
+  /* code from wgrib routine BDS_unpack */
+  const unsigned char *bits = igrib;
+  unsigned int tbits = 0;
+  int n_bits = NumBits;
+  int t_bits = 0;
+
+  const unsigned jmask = (1U << n_bits) - 1U;
+  for (long i = 0; i < jlend; ++i)
+    {
+      if (n_bits - t_bits > 8)
+	{
+	  tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]);
+	  bits += 2;
+	  t_bits += 16;
+	}
+
+      while ( t_bits < n_bits )
+	{
+	  tbits = (tbits * 256) + *bits++;
+	  t_bits += 8;
+	}
+      t_bits -= n_bits;
+      fpdata[i] = (float)((tbits >> t_bits) & jmask);
+    }
+  // at least this vectorizes :)
+  for (long i = 0; i < jlend; ++i)
+    fpdata[i] = fmin + zscale*fpdata[i];
+}
+
+static
+void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits,
+				      T fmin, T zscale, T *restrict fpdata)
+{
+  static const unsigned mask[] = {0,1,3,7,15,31,63,127,255};
+  static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0};
+
+  // code from wgrib routine BDS_unpack
+  const unsigned char *bits = igrib;
+  int n_bits = NumBits;
+  int c_bits, j_bits;
+
+  // older unoptimized code, not often used
+  c_bits = 8;
+  for (long i = 0; i < jlend; ++i)
+    {
+      double jj = 0.0;
+      j_bits = n_bits;
+      while (c_bits <= j_bits)
+	{
+	  if (c_bits == 8)
+	    {
+	      jj = jj * 256.0  + (double) (*bits++);
+	      j_bits -= 8;
+	    }
+	  else
+	    {
+	      jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]);
+	      bits++;
+	      j_bits -= c_bits;
+	      c_bits = 8;
+	    }
+	}
+
+      if (j_bits)
+	{
+	  c_bits -= j_bits;
+	  jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]);
+	}
+      fpdata[i] = (T)(fmin + zscale*jj);
+    }
+}
+
+static
+void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib,
+                                    T *fpdata, T fmin, T zscale)
+{
+  const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib);
+
+  if ( IS_BIGENDIAN() )
+    {
+      for (size_t i = 0; i < jlend; ++i)
+        {
+          fpdata[i] = fmin + zscale * sgrib[i];
+        }
+    }
+  else
+    {
+      for (size_t i = 0; i < jlend; ++i)
+        {
+          uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]);
+          fpdata[i] = fmin + zscale * ui16;
+        }
+    }
+}
+
+static 
+void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, 
+			      T fmin, T zscale, T *restrict fpdata)
+{
+#if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER 
+  uint64_t start_decode, end_decode;
+#endif
+
+#ifdef VECTORCODE
+  GRIBPACK *lgrib = NULL;
+
+  if ( numBits%8 == 0 )
+    {
+      long jlenc = jlend * numBits / 8;
+      if ( jlenc > 0 ) 
+	{
+	  lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK));
+	  if ( lgrib == NULL ) SysError("No Memory!");
+
+	  (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L);
+	}
+    }
+
+  if ( numBits ==  0 )
+    {
+      for (long i = 0; i < jlend; ++i)
+	fpdata[i] = fmin;
+    }
+  else if ( numBits ==  8 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (int)lgrib[i];
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 16 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((int)lgrib[2*i  ] <<  8) +  (int)lgrib[2*i+1]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 24 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((int)lgrib[3*i  ] << 16) + ((int)lgrib[3*i+1] <<  8) +
+	  	 (int)lgrib[3*i+2]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 32 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((unsigned int)lgrib[4*i  ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) +
+		((unsigned int)lgrib[4*i+2] <<  8) +  (unsigned int)lgrib[4*i+3]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits <= 25 )
+    {
+      TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else if ( numBits > 25 && numBits < 32 )
+    {
+      TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  if ( lgrib ) Free(lgrib);
+
+#else
+  if ( numBits ==  0 )
+    {
+      for (long i = 0; i < jlend; ++i)
+	fpdata[i] = fmin;
+    }
+  else if ( numBits ==  8 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (int)igrib[i];
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 16 )
+    {
+      TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale);
+    }
+  else if ( numBits == 24 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (T)(((int)igrib[3*i  ] << 16) + ((int)igrib[3*i+1] <<  8) +
+                     (int)igrib[3*i+2]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 32 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (T)(((unsigned int)igrib[4*i  ] << 24) + ((unsigned int)igrib[4*i+1] << 16) +
+                     ((unsigned int)igrib[4*i+2] <<  8) +  (unsigned int)igrib[4*i+3]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits <= 25 )
+    {
+      TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else if ( numBits > 25 && numBits < 32 )
+    {
+      TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+#endif
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+#ifdef T
+#undef T
+#endif
+#define T float
+#ifdef T
+
+#include <inttypes.h>
+
+static 
+void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, 
+				     T fmin, T zscale, T *restrict fpdata)
+{
+  /* code from wgrib routine BDS_unpack */
+  const unsigned char *bits = igrib;
+  unsigned int tbits = 0;
+  int n_bits = NumBits;
+  int t_bits = 0;
+
+  const unsigned jmask = (1U << n_bits) - 1U;
+  for (long i = 0; i < jlend; ++i)
+    {
+      if (n_bits - t_bits > 8)
+	{
+	  tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]);
+	  bits += 2;
+	  t_bits += 16;
+	}
+
+      while ( t_bits < n_bits )
+	{
+	  tbits = (tbits * 256) + *bits++;
+	  t_bits += 8;
+	}
+      t_bits -= n_bits;
+      fpdata[i] = (float)((tbits >> t_bits) & jmask);
+    }
+  // at least this vectorizes :)
+  for (long i = 0; i < jlend; ++i)
+    fpdata[i] = fmin + zscale*fpdata[i];
+}
+
+static
+void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits,
+				      T fmin, T zscale, T *restrict fpdata)
+{
+  static const unsigned mask[] = {0,1,3,7,15,31,63,127,255};
+  static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0};
+
+  // code from wgrib routine BDS_unpack
+  const unsigned char *bits = igrib;
+  int n_bits = NumBits;
+  int c_bits, j_bits;
+
+  // older unoptimized code, not often used
+  c_bits = 8;
+  for (long i = 0; i < jlend; ++i)
+    {
+      double jj = 0.0;
+      j_bits = n_bits;
+      while (c_bits <= j_bits)
+	{
+	  if (c_bits == 8)
+	    {
+	      jj = jj * 256.0  + (double) (*bits++);
+	      j_bits -= 8;
+	    }
+	  else
+	    {
+	      jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]);
+	      bits++;
+	      j_bits -= c_bits;
+	      c_bits = 8;
+	    }
+	}
+
+      if (j_bits)
+	{
+	  c_bits -= j_bits;
+	  jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]);
+	}
+      fpdata[i] = (T)(fmin + zscale*jj);
+    }
+}
+
+static
+void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib,
+                                    T *fpdata, T fmin, T zscale)
+{
+  const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib);
+
+  if ( IS_BIGENDIAN() )
+    {
+      for (size_t i = 0; i < jlend; ++i)
+        {
+          fpdata[i] = fmin + zscale * sgrib[i];
+        }
+    }
+  else
+    {
+      for (size_t i = 0; i < jlend; ++i)
+        {
+          uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]);
+          fpdata[i] = fmin + zscale * ui16;
+        }
+    }
+}
+
+static 
+void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, 
+			      T fmin, T zscale, T *restrict fpdata)
+{
+#if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER 
+  uint64_t start_decode, end_decode;
+#endif
+
+#ifdef VECTORCODE
+  GRIBPACK *lgrib = NULL;
+
+  if ( numBits%8 == 0 )
+    {
+      long jlenc = jlend * numBits / 8;
+      if ( jlenc > 0 ) 
+	{
+	  lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK));
+	  if ( lgrib == NULL ) SysError("No Memory!");
+
+	  (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L);
+	}
+    }
+
+  if ( numBits ==  0 )
+    {
+      for (long i = 0; i < jlend; ++i)
+	fpdata[i] = fmin;
+    }
+  else if ( numBits ==  8 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (int)lgrib[i];
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 16 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((int)lgrib[2*i  ] <<  8) +  (int)lgrib[2*i+1]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 24 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((int)lgrib[3*i  ] << 16) + ((int)lgrib[3*i+1] <<  8) +
+	  	 (int)lgrib[3*i+2]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 32 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (((unsigned int)lgrib[4*i  ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) +
+		((unsigned int)lgrib[4*i+2] <<  8) +  (unsigned int)lgrib[4*i+3]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits <= 25 )
+    {
+      TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else if ( numBits > 25 && numBits < 32 )
+    {
+      TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  if ( lgrib ) Free(lgrib);
+
+#else
+  if ( numBits ==  0 )
+    {
+      for (long i = 0; i < jlend; ++i)
+	fpdata[i] = fmin;
+    }
+  else if ( numBits ==  8 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (int)igrib[i];
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 16 )
+    {
+      TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale);
+    }
+  else if ( numBits == 24 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (T)(((int)igrib[3*i  ] << 16) + ((int)igrib[3*i+1] <<  8) +
+                     (int)igrib[3*i+2]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits == 32 )
+    for (long i = 0; i < jlend; ++i)
+      {
+	T dval = (T)(((unsigned int)igrib[4*i  ] << 24) + ((unsigned int)igrib[4*i+1] << 16) +
+                     ((unsigned int)igrib[4*i+2] <<  8) +  (unsigned int)igrib[4*i+3]);
+	fpdata[i] = fmin + zscale * dval;
+      }
+  else if ( numBits <= 25 )
+    {
+      TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else if ( numBits > 25 && numBits < 32 )
+    {
+      TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata);
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+#endif
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+
+#ifdef T
+#undef T
+#endif
+#define T double
+#ifdef T
+
+static
+size_t TEMPLATE(decodeGDS,T)(unsigned char  *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals)
+{
+  // int imisng = 0;
+  bool ReducedGrid = false, VertCoorTab = false;
+#ifdef VECTORCODE
+  unsigned char *igrib;
+  GRIBPACK *lgrib = NULL;
+  size_t lGribLen = 0;
+#endif
+
+  *numGridVals = 0;
+
+  memset(isec2, 0, 22*sizeof(int));
+
+  const unsigned gdsLen = GDS_Len;
+
+  unsigned ipvpl = GDS_PVPL;
+  if ( ipvpl == 0 ) ipvpl = 0xFF;
+
+  if ( ipvpl != 0xFF )
+    { // Either vct or reduced grid
+      if ( GDS_NV != 0 )
+	{ // we have vct
+	  VertCoorTab = true;
+	  const unsigned ipl =  4*GDS_NV + ipvpl - 1;
+	  if ( ipl < gdsLen ) ReducedGrid = true;
+	}
+      else
+	{
+	  VertCoorTab = false;
+	  ReducedGrid = true;
+	}
+      // ReducedGrid = (gdsLen - 32 - 4*GDS_NV);
+    }
+ 
+  if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0);
+  
+  if ( ReducedGrid )
+    {
+      const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV);
+      const unsigned jlenl = (gdsLen - locnl)  >> 1;
+      if ( jlenl == GDS_NumLat )
+	{
+	  ISEC2_Reduced = true;
+          size_t accum = 0;
+	  for ( size_t i = 0; i < jlenl; ++i )
+	    {
+              unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]);
+              ISEC2_ReducedPoints(i) = (int)rpi;
+              accum += rpi;
+	    }
+          *numGridVals = accum;
+	}
+      else
+	{
+	  ReducedGrid = false;
+	}
+    }
+
+  ISEC2_GridType = GDS_GridType;
+
+  // Gaussian grid definition.
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LATLON    ||
+       ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN  ||
+       ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+    {
+      ISEC2_NumLat    = (int)(GDS_NumLat);
+      if ( ! ReducedGrid )
+	{
+	  ISEC2_NumLon = (int)(GDS_NumLon);
+	  *numGridVals  = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat;
+	}
+      ISEC2_FirstLat  = GDS_FirstLat;
+      ISEC2_FirstLon  = GDS_FirstLon;
+      ISEC2_ResFlag   = GDS_ResFlag;
+      ISEC2_LastLat   = GDS_LastLat;
+      ISEC2_LastLon   = GDS_LastLon;
+      ISEC2_LonIncr   = (int)(GDS_LonIncr);
+
+      ISEC2_NumPar    = (int)GDS_NumPar;
+      ISEC2_ScanFlag  = GDS_ScanFlag;
+      if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+	{
+	  ISEC2_LatSP     = GDS_LatSP;
+	  ISEC2_LonSP     = GDS_LonSP;
+	  FSEC2_RotAngle  = (T)GDS_RotAngle;
+	}
+      // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict");
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN     ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR )
+    {
+      // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON     ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_STR ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR )
+    {
+      // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LCC )
+    {
+      ISEC2_NumLon    = (int)(GDS_NumLon);
+      ISEC2_NumLat    = (int)(GDS_NumLat);
+      *numGridVals  = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat;
+      ISEC2_FirstLat  = GDS_FirstLat;
+      ISEC2_FirstLon  = GDS_FirstLon;
+      ISEC2_ResFlag   = GDS_ResFlag;
+      ISEC2_Lambert_Lov   = GDS_Lambert_Lov;
+      ISEC2_Lambert_dx    = GDS_Lambert_dx;
+      ISEC2_Lambert_dy    = GDS_Lambert_dy;
+      ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1;
+      ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2;
+      ISEC2_Lambert_LatSP = GDS_Lambert_LatSP;
+      ISEC2_Lambert_LonSP = GDS_Lambert_LonSP;
+      ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag;
+      ISEC2_ScanFlag      = GDS_ScanFlag;
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL )
+    {
+      ISEC2_PentaJ  = (int)(GDS_PentaJ); // Truncation
+      ISEC2_PentaK  = (int)(GDS_PentaK);
+      ISEC2_PentaM  = (int)(GDS_PentaM);
+      ISEC2_RepType = GDS_RepType;
+      ISEC2_RepMode = GDS_RepMode;
+      *numGridVals  = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2);
+      isec2[ 6] = 0;
+      isec2[ 7] = 0;
+      isec2[ 8] = 0;
+      isec2[ 9] = 0;
+      isec2[10] = 0;
+      // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GME )
+    {
+      ISEC2_GME_NI2    = (int)(GDS_GME_NI2);
+      ISEC2_GME_NI3    = (int)(GDS_GME_NI3);
+      ISEC2_GME_ND     = (int)(GDS_GME_ND);
+      ISEC2_GME_NI     = (int)(GDS_GME_NI);
+      ISEC2_GME_AFlag  = GDS_GME_AFlag;
+      ISEC2_GME_LatPP  = GDS_GME_LatPP;
+      ISEC2_GME_LonPP  = GDS_GME_LonPP;
+      ISEC2_GME_LonMPL = GDS_GME_LonMPL;
+      ISEC2_GME_BFlag  = GDS_GME_BFlag;
+      *numGridVals  = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10;
+      // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng);
+    }
+  else
+    {
+      static bool lwarn = true;
+      unsigned nlon = GDS_NumLon, nlat = GDS_NumLat;
+      ISEC2_NumLon = (int)nlon;
+      ISEC2_NumLat = (int)nlat;
+      *numGridVals  = (size_t)nlon*(size_t)nlat;
+      if ( lwarn )
+        {
+          lwarn = false;
+          Message("GRIB gridtype %d unsupported", ISEC2_GridType);
+        }
+    }
+
+  // Vertical coordinate parameters for hybrid levels.
+  // Get number of vertical coordinate parameters, if any.
+
+  ISEC2_NumVCP = 0;
+
+  isec2[17] = 0;
+  isec2[18] = 0;
+
+  if ( VertCoorTab )
+    {
+      int locnv;
+      if ( ISEC0_GRIB_Version  == 0 )
+	{
+	  locnv = 32;
+	  ISEC2_NumVCP = ((int)gdsLen - 32) >> 2;
+	}
+      else
+	{
+	  locnv = (int)GDS_PVPL - 1;
+	  ISEC2_NumVCP = GDS_NV;
+	}
+#if defined (SX)
+      lGribLen = 4*ISEC2_NumVCP;	      
+      lgrib    = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK));
+
+      igrib = &gds[locnv];
+      if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L);
+      for (int i = 0; i < ISEC2_NumVCP; ++i)
+	{
+	  const int iexp  = lgrib[4*i];
+	  const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]);
+	  fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64));
+	}
+
+      Free(lgrib);
+#else
+      for (int i = 0; i < ISEC2_NumVCP; ++i)
+	{
+	  const int iexp  = gds[locnv+4*i];
+	  const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3]));
+	  fsec2[10+i] = (T)decfp2(iexp,imant);
+	}
+#endif
+    }
+
+  return gdsLen;
+}
+
+#define ldexp_double ldexp
+#define ldexp_float  ldexpf
+#define pow_double pow
+#define pow_float powf
+
+static
+void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, 
+                           T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret)
+{
+  size_t ioff = 0;
+  enum { bds_head = 11 };
+  T zscale = 0.;
+  T fmin = 0.;
+  T *fpdata = fsec4;
+
+  *iret = 0;
+  unsigned char *igrib = bds;
+
+  memset(isec4, 0, 42*sizeof(int));
+
+  // 4 bit flag / 4 bit count of unused bits at end of block octet.
+
+  const int bds_flag = BDS_Flag;
+
+  // 0------- grid point
+  // 1------- spherical harmonics
+
+  const bool lspherc = (bds_flag >> 7)&1;
+  if ( lspherc ) isec4[2] = 128;
+  else           isec4[2] = 0;
+
+  // -0------  simple packing
+  // -1------ complex packing
+
+  const bool lcomplex = (bds_flag >> 6)&1;
+  if ( lcomplex ) isec4[3] = 64;
+  else            isec4[3] =  0;
+
+  // ---0---- No additional flags
+  // ---1---- No additional flags
+
+  const bool lcompress = (bds_flag >> 4)&1;
+
+  unsigned zoff;
+  if ( lcompress )
+    { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; }
+  else
+    { isec4[5] =  0; isec4[6] = 0;     zoff =  0; }
+
+  // ----++++ number of unused bits at end of section)
+
+  const unsigned bds_ubits = bds_flag & 0xF;
+  
+  // scale factor (2 bytes)
+  const int jscale = BDS_BinScale;
+
+  // check for missing data indicators.
+
+  const int iexp  = bds[ 6];
+  const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9]));
+
+  const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF);
+
+  // convert reference value and scale factor.
+
+  if ( ! (dfunc == 'J') && imiss == 0 )
+    {
+      fmin = (T)BDS_RefValue;
+      zscale = TEMPLATE(ldexp,T)((T)1.0, jscale);
+    }
+
+  // get number of bits in each data value.
+
+  unsigned dvbits = BDS_NumBits;
+  ISEC4_NumBits = BDS_NumBits;
+
+  // octet number of start of packed data calculated from start of block 4 - 1
+
+  size_t locnd = zoff + bds_head;
+
+  // if data is in spherical harmonic form, distinguish  between simple/complex packing (lcomplex = 0/1)
+
+  if ( lspherc )
+    {
+      if ( !lcomplex )
+	{
+	  // no unpacked binary data present octet number of start of packed data
+	  // calculated from start of block 4 - 1
+
+	  ioff   = 1;
+	  locnd += 4*ioff;  // RealCoef
+
+	  // get real (0,0) coefficient in grib format and convert to floating point.
+	  if ( dfunc != 'J' )
+	    {
+	      if ( imiss ) *fpdata++ = 0.0;
+	      else         *fpdata++ = (T)BDS_RealCoef;
+	    }
+	}
+      else // complex packed spherical harmonics
+	{
+	  isec4[15] = BDS_PackData;
+	  // scaling factor
+	  isec4[16] = BDS_Power;
+
+	  // pentagonal resolution parameters of the unpacked section of data field
+
+	  const int jup = bds[zoff+15];
+	  const int kup = bds[zoff+16];
+	  const int mup = bds[zoff+17];
+
+	  isec4[zoff+17] = jup;
+	  isec4[zoff+18] = kup;
+	  isec4[zoff+19] = mup;
+
+	  // unpacked binary data
+
+	  locnd += 4; // 2 + power
+	  locnd += 3; // j, k, m
+	  ioff   = ((size_t)jup+1)*((size_t)jup+2);
+
+	  if ( dfunc != 'J' )
+	    for ( size_t i = 0; i < ioff; ++i )
+	      {
+		if ( imiss )
+		  fpdata[i] = 0.0;
+		else
+		  {
+		    const int iexp2  = (int)(bds[locnd+4*i]);
+		    const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3]));
+		    fpdata[i] = (T)decfp2(iexp2,imant2);
+		  }
+	      }
+          fpdata += ioff;
+	  locnd += 4*ioff;  /* RealCoef */
+	}
+    }
+  else
+    {
+      if ( lcomplex )
+	{
+	  *iret = 1999;
+	  gprintf(__func__, " Second order packed grids unsupported!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+    }
+
+  // Decode data values to floating point and store in fsec4.
+  // First calculate the number of data values.
+  // Take into account that spherical harmonics can be packed
+  // simple (lcomplex = 0) or complex (lcomplex = 1)
+
+  size_t jlend = bdsLen - locnd;
+
+  if ( dvbits == 0 )
+    {
+      if ( jlend > 1 )
+	{
+	  *iret = 2001;
+	  gprintf(__func__, " Number of bits per data value = 0!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+
+      if ( numGridVals == 0 )
+	{
+	  *iret = 2002;
+	  gprintf(__func__, " Constant field unsupported for this grid type!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+
+      jlend = numGridVals - ioff;
+    }
+  else
+    {
+      jlend = (jlend*8 - bds_ubits) / dvbits;
+    }
+
+  ISEC4_NumValues        = (int)(jlend + ioff);
+  ISEC4_NumNonMissValues = 0;
+
+  if ( lcompress )
+    {
+      const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19]));
+
+      ISEC4_NumValues = (int)(len*8/dvbits);
+
+      if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1;
+    }
+
+  if ( dfunc == 'J' ) return;
+
+  // check length of output array.
+  
+  if ( ISEC4_NumValues > fsec4len )
+    {
+      *iret = 710;
+      gprintf(__func__, " Output array too small. Length = %d", fsec4len);
+      gprintf(__func__, " Number of values = %d", ISEC4_NumValues);
+      gprintf(__func__, " Return code =  %d", *iret);
+      return;
+    }
+
+  if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T));
+  else
+    {
+      igrib += locnd;
+
+      TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata);
+    }
+
+  if ( lspherc && lcomplex )
+    {
+      int pcStart = isec4[19], pcScale = isec4[16];
+      TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues);
+      TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1);
+    }
+
+  if ( CGRIBEX_Fix_ZSE )  // Fix ZeroShiftError of simple packed spherical harmonics
+    if ( lspherc && !lcomplex )
+      {
+        // 20100705: Fix ZeroShiftError - Edi Kirk
+	if ( IS_NOT_EQUAL(fsec4[1], 0.0) )
+	  {
+	    const T zserr = fsec4[1];
+	    for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr;
+	  }
+      }
+
+  if ( decscale )
+    {
+      const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale);
+      for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale;
+    }
+}
+
+
+void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3,
+			     T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib,
+			     int kleng, int *kword, int dfunc, int *iret)
+{
+  UCHAR *bms = NULL;
+  bool lsect2 = false, lsect3 = false;
+  static bool lmissvalinfo = true;
+
+  UNUSED(kleng);
+
+  *iret = 0;
+
+  grsdef();
+
+  ISEC2_Reduced = false;
+
+  // ----------------------------------------------------------------
+  // IS Indicator Section (Section 0)
+  // ----------------------------------------------------------------
+  UCHAR *is = (UCHAR *) &kgrib[0];
+  size_t isLen = decodeIS(is, isec0, iret);
+
+  size_t gribLen = (size_t)ISEC0_GRIB_Len;
+
+  /*
+    When decoding or calculating length, previous editions
+    of the GRIB code must be taken into account.
+
+    In the table below, covering sections 0 and 1 of the GRIB
+    code, octet numbering is from the beginning of the GRIB
+    message;
+    * indicates that the value is not available in the code edition;
+    R indicates reserved, should be set to 0;
+    Experimental edition is considered as edition -1.
+
+    GRIB code edition -1 has fixed length of 20 octets for
+    section 1, the length not included in the message.
+    GRIB code edition 0 has fixed length of 24 octets for
+    section 1, the length being included in the message.
+    GRIB code edition 1 can have different lengths for section
+    1, the minimum being 28 octets, length being included in
+    the message.
+
+                                         Octet numbers for code
+                                                  editions
+
+                 Contents.                   -1      0      1
+                 ---------                ----------------------
+       Letters GRIB                          1-4    1-4    1-4
+       Total length of GRIB message.          *      *     5-7
+       GRIB code edition number               *      *      8
+       Length of Section 1.                   *     5-7    9-11
+       Reserved octet (R).                    *      8(R)   *
+       Version no. of Code Table 2.           *      *     12
+       Identification of centre.              5      9     13
+       Generating process.                    6     10     14
+       Grid definition .                      7     11     15
+       Flag (Code Table 1).                   8     12     16
+       Indicator of parameter.                9     13     17
+       Indicator of type of level.           10     14     18
+       Height, pressure etc of levels.      11-12  15-16  19-20
+       Year of century.                      13     17     21
+       Month.                                14     18     22
+       Day.                                  15     19     23
+       Hour.                                 16     20     24
+       Minute.                               17     21     25
+       Indicator of unit of time.            18     22     26
+       P1 - Period of time.                  19     23     27
+       P2 - Period of time                  20(R)   24     28
+       or reserved octet (R).
+       Time range indicator.                21(R)   25     29
+       or reserved octet (R).
+       Number included in average.       22-23(R)  26-27  30-31
+       or reserved octet (R).
+       Number missing from average.         24(R)  28(R)   32
+       or reserved octet (R).
+       Century of data.                       *      *     33
+       Designates sub-centre if not 0.        *      *     34
+       Decimal scale factor.                  *      *    35-36
+       Reserved. Set to 0.                    *      *    37-48
+       (Need not be present)
+       For originating centre use only.       *      *    49-nn
+       (Need not be present)
+
+    Identify which GRIB code edition is being decoded.
+
+    In GRIB edition 1, the edition number is in octet 8.
+    In GRIB edition 0, octet 8 is reserved and set to 0.
+    In GRIB edition -1, octet 8 is a flag field and can have a
+    a valid value of 0, 1, 2 or 3.
+
+    However, GRIB edition number 0 has a fixed
+    length of 24, included in the message, for section 1, so
+    if the value extracted from octets 5-7 is 24 and that from
+    octet 8 is 0, it is safe to assume edition 0 of the code.
+
+  */
+
+  // Set length of GRIB message to missing data value.
+  if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0;
+
+  // ----------------------------------------------------------------
+  // PDS Product Definition Section (Section 1)
+  // ----------------------------------------------------------------
+  UCHAR *pds = is + isLen;
+  size_t pdsLen = decodePDS(pds, isec0, isec1);
+
+  // ----------------------------------------------------------------
+  // GDS Grid Description Section (Section 2)
+  // ----------------------------------------------------------------
+  size_t numGridVals = 0;
+  size_t gdsLen = 0;
+  const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128;
+  if ( gdsIncluded )
+    {
+      UCHAR *gds = is + isLen + pdsLen;
+      gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals);
+    }
+
+  // ----------------------------------------------------------------
+  // BMS Bit-Map Section Section (Section 3)
+  // ----------------------------------------------------------------
+  isec3[0] = 0;
+  size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0;
+  const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64;
+  if ( bmsIncluded )
+    {
+      bms = is + isLen + pdsLen + gdsLen;
+      bmsLen = BMS_Len;
+
+      imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0;
+      bitmapSize = imaskSize - BMS_UnusedBits;
+    }
+
+  // ----------------------------------------------------------------
+  // BDS Binary Data Section (Section 4)
+  // ----------------------------------------------------------------
+  UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen;
+  unsigned bdsLen = BDS_Len;
+  /*
+    If a very large product, the section 4 length field holds
+    the number of bytes in the product after section 4 upto
+    the end of the padding bytes.
+    This is a fixup to get round the restriction on product lengths
+    due to the count being only 24 bits. It is only possible because
+    the (default) rounding for GRIB products is 120 bytes.
+  */
+  const bool llarge = (gribLen > JP23SET && bdsLen <= 120);
+  if ( llarge )
+    {
+      gribLen &= JP23SET;
+      gribLen *= 120;
+      ISEC0_GRIB_Len = (int)gribLen;
+      bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen));
+    }
+
+  TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret);
+
+  if ( *iret != 0 ) return;
+
+  ISEC4_NumNonMissValues = ISEC4_NumValues;
+
+  if ( bitmapSize > 0 )
+    {
+      if ( dfunc != 'L' && dfunc != 'J' )
+	if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo )
+	  {
+	    lmissvalinfo = false;
+	    FSEC3_MissVal = (T)GRIB_MISSVAL;
+	    Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL);
+	  }
+
+      // ISEC4_NumNonMissValues = ISEC4_NumValues;
+      ISEC4_NumValues = (int)bitmapSize;
+
+      if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues )
+	{
+	  GRIBPACK bitmap;
+	  /*
+	  unsigned char *bitmap;
+	  bitmap = BMS_Bitmap;
+	  int j = ISEC4_NumNonMissValues;
+	  for (int i = ISEC4_NumValues-1; i >= 0; --i)
+	    {
+	      fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal;
+	    }
+	  */
+
+	  GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK));
+
+#ifdef VECTORCODE
+	  (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L);
+	  GRIBPACK *pbitmap = imask;
+#else
+	  GRIBPACK *pbitmap = BMS_Bitmap;
+#endif
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+	  for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i )
+	    {
+	      bitmap = pbitmap[i];
+	      imask[i*8+0] = 1 & (bitmap >> 7);
+	      imask[i*8+1] = 1 & (bitmap >> 6);
+	      imask[i*8+2] = 1 & (bitmap >> 5);
+	      imask[i*8+3] = 1 & (bitmap >> 4);
+	      imask[i*8+4] = 1 & (bitmap >> 3);
+	      imask[i*8+5] = 1 & (bitmap >> 2);
+	      imask[i*8+6] = 1 & (bitmap >> 1);
+	      imask[i*8+7] = 1 & (bitmap);
+	    }
+
+	  int j = 0;
+	  for (int i = 0; i < ISEC4_NumValues; ++i)
+	    if ( imask[i] ) j++;
+
+	  if ( ISEC4_NumNonMissValues != j )
+	    {
+	      if ( dfunc != 'J' && ISEC4_NumBits != 0 )
+		Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues);
+
+	      ISEC4_NumNonMissValues = j;
+	    }
+
+	  if ( dfunc != 'J' )
+	    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+	      for (int i = ISEC4_NumValues-1; i >= 0; --i)
+		fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal;
+	    }
+
+	  Free(imask);
+	}
+    }
+
+  if ( ISEC2_Reduced )
+    {
+      int nvalues = 0;
+      int nlat = ISEC2_NumLat;
+      int nlon = ISEC2_ReducedPointsPtr[0];
+      for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat);
+      for (int ilat = 1; ilat < nlat; ++ilat)
+	if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat);
+
+      // int dlon = ISEC2_LastLon-ISEC2_FirstLon;
+      // if ( dlon < 0 ) dlon += 360000;
+	  
+      if ( nvalues != ISEC4_NumValues ) *iret = -801;
+
+      //printf("nlat %d  nlon %d \n", nlat, nlon);
+      //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues);
+
+      if ( dfunc == 'R' && *iret == -801 )
+	gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!",
+		ISEC4_NumValues, nvalues);
+      
+      if ( dfunc == 'R' && *iret != -801 )
+	{
+	  ISEC2_Reduced = 0;
+	  ISEC2_NumLon = nlon;
+	  ISEC4_NumValues = nlon*nlat;
+
+	  lsect3 = bitmapSize > 0;
+          int lperio = 1;
+	  int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && 
+                      ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || 
+                       (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) ||
+                       (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) ||
+                       (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) ||
+                       (ISEC1_Parameter == 43));
+	
+	  (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy);
+	      
+	  if ( bitmapSize > 0 )
+	    {
+	      int j = 0;	      
+	      for (int i = 0; i < ISEC4_NumValues; ++i)
+		if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++;
+		  
+	      ISEC4_NumNonMissValues = j;
+	    }
+	}
+    }
+
+  if ( ISEC0_GRIB_Version == 1 ) isLen = 8;
+  enum { esLen = 4 };
+  gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen;
+
+  if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen )
+    Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen);
+
+  ISEC0_GRIB_Len = (int)gribLen;
+
+  *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int));
+
+  // ----------------------------------------------------------------
+  // Section 9 . Abort/return to calling routine.
+  // ----------------------------------------------------------------
+  bool ldebug = false, l_iorj = false;
+  if ( ldebug )
+    {
+      gprintf(__func__, "Section 9.");
+      gprintf(__func__, "Output values set -");
+
+      gribPrintSec0(isec0);
+      gribPrintSec1(isec0, isec1);
+      // Print section 2 if present.
+      if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2);
+
+      if ( ! l_iorj )
+	{
+	  // Print section 3 if present.
+	  if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3);
+
+	  TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4);
+	  // Special print for 2D spectra wave field real values in section 4
+	  if ( (isec1[ 0] ==  140) && 
+	       (isec1[ 1] ==   98) && 
+	       (isec1[23] ==    1) && 
+	       ((isec1[39] == 1045) || (isec1[39] == 1081))  && 
+	       ((isec1[ 5] ==  250) || (isec1[ 5] ==  251)) )
+	    gribPrintSec4Wave(isec4);
+	}
+    }
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+#ifdef T
+#undef T
+#endif
+#define T float
+#ifdef T
+
+static
+size_t TEMPLATE(decodeGDS,T)(unsigned char  *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals)
+{
+  // int imisng = 0;
+  bool ReducedGrid = false, VertCoorTab = false;
+#ifdef VECTORCODE
+  unsigned char *igrib;
+  GRIBPACK *lgrib = NULL;
+  size_t lGribLen = 0;
+#endif
+
+  *numGridVals = 0;
+
+  memset(isec2, 0, 22*sizeof(int));
+
+  const unsigned gdsLen = GDS_Len;
+
+  unsigned ipvpl = GDS_PVPL;
+  if ( ipvpl == 0 ) ipvpl = 0xFF;
+
+  if ( ipvpl != 0xFF )
+    { // Either vct or reduced grid
+      if ( GDS_NV != 0 )
+	{ // we have vct
+	  VertCoorTab = true;
+	  const unsigned ipl =  4*GDS_NV + ipvpl - 1;
+	  if ( ipl < gdsLen ) ReducedGrid = true;
+	}
+      else
+	{
+	  VertCoorTab = false;
+	  ReducedGrid = true;
+	}
+      // ReducedGrid = (gdsLen - 32 - 4*GDS_NV);
+    }
+ 
+  if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0);
+  
+  if ( ReducedGrid )
+    {
+      const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV);
+      const unsigned jlenl = (gdsLen - locnl)  >> 1;
+      if ( jlenl == GDS_NumLat )
+	{
+	  ISEC2_Reduced = true;
+          size_t accum = 0;
+	  for ( size_t i = 0; i < jlenl; ++i )
+	    {
+              unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]);
+              ISEC2_ReducedPoints(i) = (int)rpi;
+              accum += rpi;
+	    }
+          *numGridVals = accum;
+	}
+      else
+	{
+	  ReducedGrid = false;
+	}
+    }
+
+  ISEC2_GridType = GDS_GridType;
+
+  // Gaussian grid definition.
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LATLON    ||
+       ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN  ||
+       ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+    {
+      ISEC2_NumLat    = (int)(GDS_NumLat);
+      if ( ! ReducedGrid )
+	{
+	  ISEC2_NumLon = (int)(GDS_NumLon);
+	  *numGridVals  = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat;
+	}
+      ISEC2_FirstLat  = GDS_FirstLat;
+      ISEC2_FirstLon  = GDS_FirstLon;
+      ISEC2_ResFlag   = GDS_ResFlag;
+      ISEC2_LastLat   = GDS_LastLat;
+      ISEC2_LastLon   = GDS_LastLon;
+      ISEC2_LonIncr   = (int)(GDS_LonIncr);
+
+      ISEC2_NumPar    = (int)GDS_NumPar;
+      ISEC2_ScanFlag  = GDS_ScanFlag;
+      if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+	{
+	  ISEC2_LatSP     = GDS_LatSP;
+	  ISEC2_LonSP     = GDS_LonSP;
+	  FSEC2_RotAngle  = (T)GDS_RotAngle;
+	}
+      // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict");
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN     ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR )
+    {
+      // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON     ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_STR ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR )
+    {
+      // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LCC )
+    {
+      ISEC2_NumLon    = (int)(GDS_NumLon);
+      ISEC2_NumLat    = (int)(GDS_NumLat);
+      *numGridVals  = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat;
+      ISEC2_FirstLat  = GDS_FirstLat;
+      ISEC2_FirstLon  = GDS_FirstLon;
+      ISEC2_ResFlag   = GDS_ResFlag;
+      ISEC2_Lambert_Lov   = GDS_Lambert_Lov;
+      ISEC2_Lambert_dx    = GDS_Lambert_dx;
+      ISEC2_Lambert_dy    = GDS_Lambert_dy;
+      ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1;
+      ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2;
+      ISEC2_Lambert_LatSP = GDS_Lambert_LatSP;
+      ISEC2_Lambert_LonSP = GDS_Lambert_LonSP;
+      ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag;
+      ISEC2_ScanFlag      = GDS_ScanFlag;
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL )
+    {
+      ISEC2_PentaJ  = (int)(GDS_PentaJ); // Truncation
+      ISEC2_PentaK  = (int)(GDS_PentaK);
+      ISEC2_PentaM  = (int)(GDS_PentaM);
+      ISEC2_RepType = GDS_RepType;
+      ISEC2_RepMode = GDS_RepMode;
+      *numGridVals  = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2);
+      isec2[ 6] = 0;
+      isec2[ 7] = 0;
+      isec2[ 8] = 0;
+      isec2[ 9] = 0;
+      isec2[10] = 0;
+      // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GME )
+    {
+      ISEC2_GME_NI2    = (int)(GDS_GME_NI2);
+      ISEC2_GME_NI3    = (int)(GDS_GME_NI3);
+      ISEC2_GME_ND     = (int)(GDS_GME_ND);
+      ISEC2_GME_NI     = (int)(GDS_GME_NI);
+      ISEC2_GME_AFlag  = GDS_GME_AFlag;
+      ISEC2_GME_LatPP  = GDS_GME_LatPP;
+      ISEC2_GME_LonPP  = GDS_GME_LonPP;
+      ISEC2_GME_LonMPL = GDS_GME_LonMPL;
+      ISEC2_GME_BFlag  = GDS_GME_BFlag;
+      *numGridVals  = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10;
+      // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng);
+    }
+  else
+    {
+      static bool lwarn = true;
+      unsigned nlon = GDS_NumLon, nlat = GDS_NumLat;
+      ISEC2_NumLon = (int)nlon;
+      ISEC2_NumLat = (int)nlat;
+      *numGridVals  = (size_t)nlon*(size_t)nlat;
+      if ( lwarn )
+        {
+          lwarn = false;
+          Message("GRIB gridtype %d unsupported", ISEC2_GridType);
+        }
+    }
+
+  // Vertical coordinate parameters for hybrid levels.
+  // Get number of vertical coordinate parameters, if any.
+
+  ISEC2_NumVCP = 0;
+
+  isec2[17] = 0;
+  isec2[18] = 0;
+
+  if ( VertCoorTab )
+    {
+      int locnv;
+      if ( ISEC0_GRIB_Version  == 0 )
+	{
+	  locnv = 32;
+	  ISEC2_NumVCP = ((int)gdsLen - 32) >> 2;
+	}
+      else
+	{
+	  locnv = (int)GDS_PVPL - 1;
+	  ISEC2_NumVCP = GDS_NV;
+	}
+#if defined (SX)
+      lGribLen = 4*ISEC2_NumVCP;	      
+      lgrib    = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK));
+
+      igrib = &gds[locnv];
+      if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L);
+      for (int i = 0; i < ISEC2_NumVCP; ++i)
+	{
+	  const int iexp  = lgrib[4*i];
+	  const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]);
+	  fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64));
+	}
+
+      Free(lgrib);
+#else
+      for (int i = 0; i < ISEC2_NumVCP; ++i)
+	{
+	  const int iexp  = gds[locnv+4*i];
+	  const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3]));
+	  fsec2[10+i] = (T)decfp2(iexp,imant);
+	}
+#endif
+    }
+
+  return gdsLen;
+}
+
+#define ldexp_double ldexp
+#define ldexp_float  ldexpf
+#define pow_double pow
+#define pow_float powf
+
+static
+void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, 
+                           T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret)
+{
+  size_t ioff = 0;
+  enum { bds_head = 11 };
+  T zscale = 0.;
+  T fmin = 0.;
+  T *fpdata = fsec4;
+
+  *iret = 0;
+  unsigned char *igrib = bds;
+
+  memset(isec4, 0, 42*sizeof(int));
+
+  // 4 bit flag / 4 bit count of unused bits at end of block octet.
+
+  const int bds_flag = BDS_Flag;
+
+  // 0------- grid point
+  // 1------- spherical harmonics
+
+  const bool lspherc = (bds_flag >> 7)&1;
+  if ( lspherc ) isec4[2] = 128;
+  else           isec4[2] = 0;
+
+  // -0------  simple packing
+  // -1------ complex packing
+
+  const bool lcomplex = (bds_flag >> 6)&1;
+  if ( lcomplex ) isec4[3] = 64;
+  else            isec4[3] =  0;
+
+  // ---0---- No additional flags
+  // ---1---- No additional flags
+
+  const bool lcompress = (bds_flag >> 4)&1;
+
+  unsigned zoff;
+  if ( lcompress )
+    { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; }
+  else
+    { isec4[5] =  0; isec4[6] = 0;     zoff =  0; }
+
+  // ----++++ number of unused bits at end of section)
+
+  const unsigned bds_ubits = bds_flag & 0xF;
+  
+  // scale factor (2 bytes)
+  const int jscale = BDS_BinScale;
+
+  // check for missing data indicators.
+
+  const int iexp  = bds[ 6];
+  const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9]));
+
+  const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF);
+
+  // convert reference value and scale factor.
+
+  if ( ! (dfunc == 'J') && imiss == 0 )
+    {
+      fmin = (T)BDS_RefValue;
+      zscale = TEMPLATE(ldexp,T)((T)1.0, jscale);
+    }
+
+  // get number of bits in each data value.
+
+  unsigned dvbits = BDS_NumBits;
+  ISEC4_NumBits = BDS_NumBits;
+
+  // octet number of start of packed data calculated from start of block 4 - 1
+
+  size_t locnd = zoff + bds_head;
+
+  // if data is in spherical harmonic form, distinguish  between simple/complex packing (lcomplex = 0/1)
+
+  if ( lspherc )
+    {
+      if ( !lcomplex )
+	{
+	  // no unpacked binary data present octet number of start of packed data
+	  // calculated from start of block 4 - 1
+
+	  ioff   = 1;
+	  locnd += 4*ioff;  // RealCoef
+
+	  // get real (0,0) coefficient in grib format and convert to floating point.
+	  if ( dfunc != 'J' )
+	    {
+	      if ( imiss ) *fpdata++ = 0.0;
+	      else         *fpdata++ = (T)BDS_RealCoef;
+	    }
+	}
+      else // complex packed spherical harmonics
+	{
+	  isec4[15] = BDS_PackData;
+	  // scaling factor
+	  isec4[16] = BDS_Power;
+
+	  // pentagonal resolution parameters of the unpacked section of data field
+
+	  const int jup = bds[zoff+15];
+	  const int kup = bds[zoff+16];
+	  const int mup = bds[zoff+17];
+
+	  isec4[zoff+17] = jup;
+	  isec4[zoff+18] = kup;
+	  isec4[zoff+19] = mup;
+
+	  // unpacked binary data
+
+	  locnd += 4; // 2 + power
+	  locnd += 3; // j, k, m
+	  ioff   = ((size_t)jup+1)*((size_t)jup+2);
+
+	  if ( dfunc != 'J' )
+	    for ( size_t i = 0; i < ioff; ++i )
+	      {
+		if ( imiss )
+		  fpdata[i] = 0.0;
+		else
+		  {
+		    const int iexp2  = (int)(bds[locnd+4*i]);
+		    const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3]));
+		    fpdata[i] = (T)decfp2(iexp2,imant2);
+		  }
+	      }
+          fpdata += ioff;
+	  locnd += 4*ioff;  /* RealCoef */
+	}
+    }
+  else
+    {
+      if ( lcomplex )
+	{
+	  *iret = 1999;
+	  gprintf(__func__, " Second order packed grids unsupported!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+    }
+
+  // Decode data values to floating point and store in fsec4.
+  // First calculate the number of data values.
+  // Take into account that spherical harmonics can be packed
+  // simple (lcomplex = 0) or complex (lcomplex = 1)
+
+  size_t jlend = bdsLen - locnd;
+
+  if ( dvbits == 0 )
+    {
+      if ( jlend > 1 )
+	{
+	  *iret = 2001;
+	  gprintf(__func__, " Number of bits per data value = 0!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+
+      if ( numGridVals == 0 )
+	{
+	  *iret = 2002;
+	  gprintf(__func__, " Constant field unsupported for this grid type!");
+	  gprintf(__func__, " Return code =  %d", *iret);
+	  return;
+	}
+
+      jlend = numGridVals - ioff;
+    }
+  else
+    {
+      jlend = (jlend*8 - bds_ubits) / dvbits;
+    }
+
+  ISEC4_NumValues        = (int)(jlend + ioff);
+  ISEC4_NumNonMissValues = 0;
+
+  if ( lcompress )
+    {
+      const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19]));
+
+      ISEC4_NumValues = (int)(len*8/dvbits);
+
+      if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1;
+    }
+
+  if ( dfunc == 'J' ) return;
+
+  // check length of output array.
+  
+  if ( ISEC4_NumValues > fsec4len )
+    {
+      *iret = 710;
+      gprintf(__func__, " Output array too small. Length = %d", fsec4len);
+      gprintf(__func__, " Number of values = %d", ISEC4_NumValues);
+      gprintf(__func__, " Return code =  %d", *iret);
+      return;
+    }
+
+  if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T));
+  else
+    {
+      igrib += locnd;
+
+      TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata);
+    }
+
+  if ( lspherc && lcomplex )
+    {
+      int pcStart = isec4[19], pcScale = isec4[16];
+      TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues);
+      TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1);
+    }
+
+  if ( CGRIBEX_Fix_ZSE )  // Fix ZeroShiftError of simple packed spherical harmonics
+    if ( lspherc && !lcomplex )
+      {
+        // 20100705: Fix ZeroShiftError - Edi Kirk
+	if ( IS_NOT_EQUAL(fsec4[1], 0.0) )
+	  {
+	    const T zserr = fsec4[1];
+	    for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr;
+	  }
+      }
+
+  if ( decscale )
+    {
+      const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale);
+      for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale;
+    }
+}
+
+
+void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3,
+			     T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib,
+			     int kleng, int *kword, int dfunc, int *iret)
+{
+  UCHAR *bms = NULL;
+  bool lsect2 = false, lsect3 = false;
+  static bool lmissvalinfo = true;
+
+  UNUSED(kleng);
+
+  *iret = 0;
+
+  grsdef();
+
+  ISEC2_Reduced = false;
+
+  // ----------------------------------------------------------------
+  // IS Indicator Section (Section 0)
+  // ----------------------------------------------------------------
+  UCHAR *is = (UCHAR *) &kgrib[0];
+  size_t isLen = decodeIS(is, isec0, iret);
+
+  size_t gribLen = (size_t)ISEC0_GRIB_Len;
+
+  /*
+    When decoding or calculating length, previous editions
+    of the GRIB code must be taken into account.
+
+    In the table below, covering sections 0 and 1 of the GRIB
+    code, octet numbering is from the beginning of the GRIB
+    message;
+    * indicates that the value is not available in the code edition;
+    R indicates reserved, should be set to 0;
+    Experimental edition is considered as edition -1.
+
+    GRIB code edition -1 has fixed length of 20 octets for
+    section 1, the length not included in the message.
+    GRIB code edition 0 has fixed length of 24 octets for
+    section 1, the length being included in the message.
+    GRIB code edition 1 can have different lengths for section
+    1, the minimum being 28 octets, length being included in
+    the message.
+
+                                         Octet numbers for code
+                                                  editions
+
+                 Contents.                   -1      0      1
+                 ---------                ----------------------
+       Letters GRIB                          1-4    1-4    1-4
+       Total length of GRIB message.          *      *     5-7
+       GRIB code edition number               *      *      8
+       Length of Section 1.                   *     5-7    9-11
+       Reserved octet (R).                    *      8(R)   *
+       Version no. of Code Table 2.           *      *     12
+       Identification of centre.              5      9     13
+       Generating process.                    6     10     14
+       Grid definition .                      7     11     15
+       Flag (Code Table 1).                   8     12     16
+       Indicator of parameter.                9     13     17
+       Indicator of type of level.           10     14     18
+       Height, pressure etc of levels.      11-12  15-16  19-20
+       Year of century.                      13     17     21
+       Month.                                14     18     22
+       Day.                                  15     19     23
+       Hour.                                 16     20     24
+       Minute.                               17     21     25
+       Indicator of unit of time.            18     22     26
+       P1 - Period of time.                  19     23     27
+       P2 - Period of time                  20(R)   24     28
+       or reserved octet (R).
+       Time range indicator.                21(R)   25     29
+       or reserved octet (R).
+       Number included in average.       22-23(R)  26-27  30-31
+       or reserved octet (R).
+       Number missing from average.         24(R)  28(R)   32
+       or reserved octet (R).
+       Century of data.                       *      *     33
+       Designates sub-centre if not 0.        *      *     34
+       Decimal scale factor.                  *      *    35-36
+       Reserved. Set to 0.                    *      *    37-48
+       (Need not be present)
+       For originating centre use only.       *      *    49-nn
+       (Need not be present)
+
+    Identify which GRIB code edition is being decoded.
+
+    In GRIB edition 1, the edition number is in octet 8.
+    In GRIB edition 0, octet 8 is reserved and set to 0.
+    In GRIB edition -1, octet 8 is a flag field and can have a
+    a valid value of 0, 1, 2 or 3.
+
+    However, GRIB edition number 0 has a fixed
+    length of 24, included in the message, for section 1, so
+    if the value extracted from octets 5-7 is 24 and that from
+    octet 8 is 0, it is safe to assume edition 0 of the code.
+
+  */
+
+  // Set length of GRIB message to missing data value.
+  if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0;
+
+  // ----------------------------------------------------------------
+  // PDS Product Definition Section (Section 1)
+  // ----------------------------------------------------------------
+  UCHAR *pds = is + isLen;
+  size_t pdsLen = decodePDS(pds, isec0, isec1);
+
+  // ----------------------------------------------------------------
+  // GDS Grid Description Section (Section 2)
+  // ----------------------------------------------------------------
+  size_t numGridVals = 0;
+  size_t gdsLen = 0;
+  const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128;
+  if ( gdsIncluded )
+    {
+      UCHAR *gds = is + isLen + pdsLen;
+      gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals);
+    }
+
+  // ----------------------------------------------------------------
+  // BMS Bit-Map Section Section (Section 3)
+  // ----------------------------------------------------------------
+  isec3[0] = 0;
+  size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0;
+  const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64;
+  if ( bmsIncluded )
+    {
+      bms = is + isLen + pdsLen + gdsLen;
+      bmsLen = BMS_Len;
+
+      imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0;
+      bitmapSize = imaskSize - BMS_UnusedBits;
+    }
+
+  // ----------------------------------------------------------------
+  // BDS Binary Data Section (Section 4)
+  // ----------------------------------------------------------------
+  UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen;
+  unsigned bdsLen = BDS_Len;
+  /*
+    If a very large product, the section 4 length field holds
+    the number of bytes in the product after section 4 upto
+    the end of the padding bytes.
+    This is a fixup to get round the restriction on product lengths
+    due to the count being only 24 bits. It is only possible because
+    the (default) rounding for GRIB products is 120 bytes.
+  */
+  const bool llarge = (gribLen > JP23SET && bdsLen <= 120);
+  if ( llarge )
+    {
+      gribLen &= JP23SET;
+      gribLen *= 120;
+      ISEC0_GRIB_Len = (int)gribLen;
+      bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen));
+    }
+
+  TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret);
+
+  if ( *iret != 0 ) return;
+
+  ISEC4_NumNonMissValues = ISEC4_NumValues;
+
+  if ( bitmapSize > 0 )
+    {
+      if ( dfunc != 'L' && dfunc != 'J' )
+	if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo )
+	  {
+	    lmissvalinfo = false;
+	    FSEC3_MissVal = (T)GRIB_MISSVAL;
+	    Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL);
+	  }
+
+      // ISEC4_NumNonMissValues = ISEC4_NumValues;
+      ISEC4_NumValues = (int)bitmapSize;
+
+      if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues )
+	{
+	  GRIBPACK bitmap;
+	  /*
+	  unsigned char *bitmap;
+	  bitmap = BMS_Bitmap;
+	  int j = ISEC4_NumNonMissValues;
+	  for (int i = ISEC4_NumValues-1; i >= 0; --i)
+	    {
+	      fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal;
+	    }
+	  */
+
+	  GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK));
+
+#ifdef VECTORCODE
+	  (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L);
+	  GRIBPACK *pbitmap = imask;
+#else
+	  GRIBPACK *pbitmap = BMS_Bitmap;
+#endif
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+	  for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i )
+	    {
+	      bitmap = pbitmap[i];
+	      imask[i*8+0] = 1 & (bitmap >> 7);
+	      imask[i*8+1] = 1 & (bitmap >> 6);
+	      imask[i*8+2] = 1 & (bitmap >> 5);
+	      imask[i*8+3] = 1 & (bitmap >> 4);
+	      imask[i*8+4] = 1 & (bitmap >> 3);
+	      imask[i*8+5] = 1 & (bitmap >> 2);
+	      imask[i*8+6] = 1 & (bitmap >> 1);
+	      imask[i*8+7] = 1 & (bitmap);
+	    }
+
+	  int j = 0;
+	  for (int i = 0; i < ISEC4_NumValues; ++i)
+	    if ( imask[i] ) j++;
+
+	  if ( ISEC4_NumNonMissValues != j )
+	    {
+	      if ( dfunc != 'J' && ISEC4_NumBits != 0 )
+		Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues);
+
+	      ISEC4_NumNonMissValues = j;
+	    }
+
+	  if ( dfunc != 'J' )
+	    {
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+	      for (int i = ISEC4_NumValues-1; i >= 0; --i)
+		fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal;
+	    }
+
+	  Free(imask);
+	}
+    }
+
+  if ( ISEC2_Reduced )
+    {
+      int nvalues = 0;
+      int nlat = ISEC2_NumLat;
+      int nlon = ISEC2_ReducedPointsPtr[0];
+      for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat);
+      for (int ilat = 1; ilat < nlat; ++ilat)
+	if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat);
+
+      // int dlon = ISEC2_LastLon-ISEC2_FirstLon;
+      // if ( dlon < 0 ) dlon += 360000;
+	  
+      if ( nvalues != ISEC4_NumValues ) *iret = -801;
+
+      //printf("nlat %d  nlon %d \n", nlat, nlon);
+      //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues);
+
+      if ( dfunc == 'R' && *iret == -801 )
+	gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!",
+		ISEC4_NumValues, nvalues);
+      
+      if ( dfunc == 'R' && *iret != -801 )
+	{
+	  ISEC2_Reduced = 0;
+	  ISEC2_NumLon = nlon;
+	  ISEC4_NumValues = nlon*nlat;
+
+	  lsect3 = bitmapSize > 0;
+          int lperio = 1;
+	  int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && 
+                      ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || 
+                       (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) ||
+                       (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) ||
+                       (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) ||
+                       (ISEC1_Parameter == 43));
+	
+	  (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy);
+	      
+	  if ( bitmapSize > 0 )
+	    {
+	      int j = 0;	      
+	      for (int i = 0; i < ISEC4_NumValues; ++i)
+		if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++;
+		  
+	      ISEC4_NumNonMissValues = j;
+	    }
+	}
+    }
+
+  if ( ISEC0_GRIB_Version == 1 ) isLen = 8;
+  enum { esLen = 4 };
+  gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen;
+
+  if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen )
+    Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen);
+
+  ISEC0_GRIB_Len = (int)gribLen;
+
+  *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int));
+
+  // ----------------------------------------------------------------
+  // Section 9 . Abort/return to calling routine.
+  // ----------------------------------------------------------------
+  bool ldebug = false, l_iorj = false;
+  if ( ldebug )
+    {
+      gprintf(__func__, "Section 9.");
+      gprintf(__func__, "Output values set -");
+
+      gribPrintSec0(isec0);
+      gribPrintSec1(isec0, isec1);
+      // Print section 2 if present.
+      if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2);
+
+      if ( ! l_iorj )
+	{
+	  // Print section 3 if present.
+	  if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3);
+
+	  TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4);
+	  // Special print for 2D spectra wave field real values in section 4
+	  if ( (isec1[ 0] ==  140) && 
+	       (isec1[ 1] ==   98) && 
+	       (isec1[23] ==    1) && 
+	       ((isec1[39] == 1045) || (isec1[39] == 1081))  && 
+	       ((isec1[ 5] ==  250) || (isec1[ 5] ==  251)) )
+	    gribPrintSec4Wave(isec4);
+	}
+    }
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+// clang-format on
+
+// GRIB block 0 - indicator block
+static void
+encodeIS(GRIBPACK *lGrib, long *gribLen)
+{
+  long z;
+  // z = *gribLen;
+
+  lGrib[0] = 'G';
+  lGrib[1] = 'R';
+  lGrib[2] = 'I';
+  lGrib[3] = 'B';
+
+  // lGrib[4]-lGrib[6] contains full length of grib record.
+  // included before finished CODEGB
+
+  z = 7;
+  Put1Byte(1);  // grib version
+  z = 8;
+
+  *gribLen = z;
+}
+
+// GRIB block 5 - end block
+static void
+encodeES(GRIBPACK *lGrib, long *gribLen, long bdsstart)
+{
+  long z = *gribLen;
+
+  lGrib[z++] = '7';
+  lGrib[z++] = '7';
+  lGrib[z++] = '7';
+  lGrib[z++] = '7';
+
+  if (z > JP24SET)
+    {
+      long bdslen = z - 4;
+      // fprintf(stderr, "Abort: GRIB record too large (max = %d)!\n", JP23SET);
+      // exit(1);
+      /*
+        If a very large product, the section 4 length field holds
+        the number of bytes in the product after section 4 upto
+        the end of the padding bytes.
+        This is a fixup to get round the restriction on product lengths
+        due to the count being only 24 bits. It is only possible because
+        the (default) rounding for GRIB products is 120 bytes.
+      */
+      while (z % 120) lGrib[z++] = 0;
+
+      if (z > JP23SET * 120)
+        {
+          fprintf(stderr, "Abort: GRIB1 record too large (size = %ld; max = %d)!\n", z, JP23SET * 120);
+          exit(1);
+        }
+
+      long itemp = z / (-120);
+      itemp = JP23SET - itemp + 1;
+
+      lGrib[4] = (GRIBPACK) (itemp >> 16);
+      lGrib[5] = (GRIBPACK) (itemp >> 8);
+      lGrib[6] = (GRIBPACK) itemp;
+
+      bdslen = z - bdslen;
+      lGrib[bdsstart] = (GRIBPACK) (bdslen >> 16);
+      lGrib[bdsstart + 1] = (GRIBPACK) (bdslen >> 8);
+      lGrib[bdsstart + 2] = (GRIBPACK) bdslen;
+    }
+  else
+    {
+      lGrib[4] = (GRIBPACK) (z >> 16);
+      lGrib[5] = (GRIBPACK) (z >> 8);
+      lGrib[6] = (GRIBPACK) z;
+
+      while (z % 8) lGrib[z++] = 0;
+    }
+
+  *gribLen = z;
+}
+
+// GRIB block 1 - product definition block.
+
+#define DWD_extension_253_len 38
+#define DWD_extension_254_len 26
+#define ECMWF_extension_1_len 24
+#define MPIM_extension_1_len 18
+
+static long
+getLocalExtLen(int *isec1)
+{
+  long extlen = 0;
+
+  if (ISEC1_LocalFLag)
+    {
+      if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250)
+        {
+          if (isec1[36] == 254)
+            extlen = DWD_extension_254_len;
+          else if (isec1[36] == 253)
+            extlen = DWD_extension_253_len;
+        }
+      else if (ISEC1_CenterID == 98)
+        {
+          if (isec1[36] == 1) extlen = ECMWF_extension_1_len;
+        }
+      else if (ISEC1_CenterID == 252)
+        {
+          if (isec1[36] == 1) extlen = MPIM_extension_1_len;
+        }
+    }
+
+  return extlen;
+}
+
+static long
+getPdsLen(int *isec1)
+{
+  long pdslen = 28;
+
+  pdslen += getLocalExtLen(isec1);
+
+  return pdslen;
+}
+
+static void
+encodePDS_DWD_local_Extension_254(GRIBPACK *lGrib, long *zs, int *isec1)
+{
+  long z = *zs;
+
+  const long localextlen = getLocalExtLen(isec1);
+  for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]);
+
+  int isvn = isec1[49] << 15 | isec1[48];  // DWD experiment identifier
+  Put2Byte(isvn);                          // DWD run type (0=main, 2=ass, 3=test)
+
+  *zs = z;
+}
+
+static void
+encodePDS_DWD_local_Extension_253(GRIBPACK *lGrib, long *zs, int *isec1)
+{
+  long z = *zs;
+
+  const long localextlen = DWD_extension_254_len;
+  for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]);
+
+  int isvn = isec1[49] << 15 | isec1[48]; /* DWD experiment identifier    */
+  Put2Byte(isvn);                         /* DWD run type (0=main, 2=ass, 3=test) */
+  Put1Byte(isec1[50]);                    /* 55 User id, specified by table       */
+  Put2Byte(isec1[51]);                    /* 56 Experiment identifier             */
+  Put2Byte(isec1[52]);                    /* 58 Ensemble identification by table  */
+  Put2Byte(isec1[53]);                    /* 60 Number of ensemble members        */
+  Put2Byte(isec1[54]);                    /* 62 Actual number of ensemble member  */
+  Put1Byte(isec1[55]);                    /* 64 Model major version number        */
+  Put1Byte(isec1[56]);                    /* 65 Model minor version number        */
+  Put1Byte(0);                            /* 66 Blank for even buffer length      */
+
+  *zs = z;
+}
+
+static void
+encodePDS_ECMWF_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1)
+{
+  long z = *zs;
+
+  const long localextlen = getLocalExtLen(isec1);
+  for (long i = 0; i < localextlen - 12; i++) Put1Byte(isec1[24 + i]);
+  /* 12 bytes explicitly encoded below:         */
+  Put1Byte(isec1[36]); /* ECMWF local GRIB use definition identifier */
+                       /*    1=MARS labelling or ensemble fcst. data */
+  Put1Byte(isec1[37]); /* Class                                      */
+  Put1Byte(isec1[38]); /* Type                                       */
+  Put2Byte(isec1[39]); /* Stream                                     */
+
+  // Version number or experiment identifier
+  Put1Byte(((unsigned char *) &isec1[40])[0]);
+  Put1Byte(((unsigned char *) &isec1[40])[1]);
+  Put1Byte(((unsigned char *) &isec1[40])[2]);
+  Put1Byte(((unsigned char *) &isec1[40])[3]);
+
+  Put1Byte(isec1[41]); /* Ensemble forecast number                   */
+  Put1Byte(isec1[42]); /* Total number of forecasts in ensemble      */
+  Put1Byte(0);         /* (Spare)                                    */
+
+  *zs = z;
+}
+
+static void
+encodePDS_MPIM_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1)
+{
+  long z = *zs;
+
+  const long localextlen = getLocalExtLen(isec1);
+  for (long i = 0; i < localextlen - 6; i++) Put1Byte(isec1[24 + i]);
+  /* 6 bytes explicitly encoded below:          */
+  Put1Byte(isec1[36]); /* MPIM local GRIB use definition identifier  */
+                       /*    (extension identifier)                  */
+  Put1Byte(isec1[37]); /* type of ensemble forecast                  */
+  Put2Byte(isec1[38]); /* individual ensemble member                 */
+  Put2Byte(isec1[39]); /* number of forecasts in ensemble            */
+
+  *zs = z;
+}
+
+// GRIB BLOCK 1 - PRODUCT DESCRIPTION SECTION
+static void
+encodePDS(GRIBPACK *lpds, long pdsLen, int *isec1)
+{
+  GRIBPACK *lGrib = lpds;
+  long z = 0;
+  int ival;
+
+  int century = ISEC1_Century;
+  int year = ISEC1_Year;
+
+  if (century < 0)
+    {
+      century = -century;
+      year = -year;
+    }
+
+  Put3Byte(pdsLen);               /*  0 Length of Block 1        */
+  Put1Byte(ISEC1_CodeTable);      /*  3 Local table number       */
+  Put1Byte(ISEC1_CenterID);       /*  4 Identification of centre */
+  Put1Byte(ISEC1_ModelID);        /*  5 Identification of model  */
+  Put1Byte(ISEC1_GridDefinition); /*  6 Grid definition          */
+  Put1Byte(ISEC1_Sec2Or3Flag);    /*  7 Block 2 included         */
+  Put1Byte(ISEC1_Parameter);      /*  8 Parameter Code           */
+  Put1Byte(ISEC1_LevelType);      /*  9 Type of level            */
+  // clang-format off
+  if ( (ISEC1_LevelType !=  20) &&
+       (ISEC1_LevelType != GRIB1_LTYPE_99)           &&
+       (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC)     &&
+       (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA)  &&
+       (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE)     &&
+       (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT)       &&
+       (ISEC1_LevelType != GRIB1_LTYPE_SIGMA)        &&
+       (ISEC1_LevelType != GRIB1_LTYPE_HYBRID)       &&
+       (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH)    &&
+       (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC)   &&
+       (ISEC1_LevelType != 115) &&
+       (ISEC1_LevelType != 117) &&
+       (ISEC1_LevelType != 125) &&
+       (ISEC1_LevelType != 127) &&
+       (ISEC1_LevelType != 160) &&
+       (ISEC1_LevelType != 210) )
+    {
+      Put1Byte(ISEC1_Level1);
+      Put1Byte(ISEC1_Level2);
+    }
+  else
+    {
+      Put2Byte(ISEC1_Level1);     /* 10 Level                    */    
+    }
+  // clang-format on
+
+  Put1Int(year);          /* 12 Year of Century          */
+  Put1Byte(ISEC1_Month);  /* 13 Month                    */
+  Put1Byte(ISEC1_Day);    /* 14 Day                      */
+  Put1Byte(ISEC1_Hour);   /* 15 Hour                     */
+  Put1Byte(ISEC1_Minute); /* 16 Minute                   */
+
+  Put1Byte(ISEC1_TimeUnit); /* 17 Time unit                */
+  if (ISEC1_TimeRange == 10)
+    {
+      Put1Byte(ISEC1_TimePeriod1);
+      Put1Byte(ISEC1_TimePeriod2);
+    }
+  else if (ISEC1_TimeRange == 113 || ISEC1_TimeRange == 0)
+    {
+      Put1Byte(ISEC1_TimePeriod1);
+      Put1Byte(0);
+    }
+  else if (ISEC1_TimeRange == 5 || ISEC1_TimeRange == 4 || ISEC1_TimeRange == 3 || ISEC1_TimeRange == 2)
+    {
+      Put1Byte(ISEC1_TimePeriod1);
+      Put1Byte(ISEC1_TimePeriod2);
+    }
+  else
+    {
+      Put1Byte(0);
+      Put1Byte(0);
+    }
+  Put1Byte(ISEC1_TimeRange); /* 20 Timerange flag           */
+  Put2Byte(ISEC1_AvgNum);    /* 21 Average                  */
+
+  Put1Byte(ISEC1_AvgMiss);       /* 23 Missing from averages    */
+  Put1Byte(century);             /* 24 Century                  */
+  Put1Byte(ISEC1_SubCenterID);   /* 25 Subcenter                */
+  Put2Int(ISEC1_DecScaleFactor); /* 26 Decimal scale factor     */
+
+  if (ISEC1_LocalFLag)
+    {
+      if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250)
+        {
+          if (isec1[36] == 254)
+            encodePDS_DWD_local_Extension_254(lGrib, &z, isec1);
+          else if (isec1[36] == 253)
+            encodePDS_DWD_local_Extension_253(lGrib, &z, isec1);
+        }
+      else if (ISEC1_CenterID == 98)
+        {
+          if (isec1[36] == 1) encodePDS_ECMWF_local_Extension_1(lGrib, &z, isec1);
+        }
+      else if (ISEC1_CenterID == 252)
+        {
+          if (isec1[36] == 1) encodePDS_MPIM_local_Extension_1(lGrib, &z, isec1);
+        }
+      else
+        {
+          const long localextlen = getLocalExtLen(isec1);
+          for (long i = 0; i < localextlen; i++) Put1Byte(isec1[24 + i]);
+        }
+    }
+}
+
+// clang-format off
+
+
+#ifdef T
+#undef T
+#endif
+#define T double
+#ifdef T
+
+
+#define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5)
+
+static
+void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib,
+				     const T *data, T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+  unsigned int ival;
+  int cbits, jbits;
+  unsigned int c;
+
+  // code from gribw routine flist2bitstream
+
+  cbits = 8;
+  c = 0;
+  for (size_t i = packStart; i < datasize; ++i)
+    {
+      // note float -> unsigned int .. truncate
+      ival = (unsigned int)(CGRIBEX_FPSCALE(data[i]));
+      /*
+	if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2;
+	if ( ival < 0 ) ival = 0;
+      */
+      jbits = numBits;
+      while ( cbits <= jbits ) 
+	{
+	  if ( cbits == 8 )
+	    {
+	      jbits -= 8;
+	      lGrib[z++] = (ival >> jbits) & 0xFF;
+	    }
+	  else
+	    {
+	      jbits -= cbits;
+	      lGrib[z++] = (GRIBPACK)((c << cbits)
+                                      + ((ival >> jbits) & ((1U << cbits) - 1)));
+	      cbits = 8;
+	      c = 0;
+	    }
+	}
+      /* now jbits < cbits */
+      if ( jbits )
+	{
+	  c = (c << jbits) + (ival & ((1U << jbits)-1));
+	  cbits -= jbits;
+	}
+    }
+  if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits);
+
+  *gz = z;
+}
+
+
+static
+void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib,
+				    const T *restrict data, T zref, T factor, size_t *gz)
+{
+  uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz);
+
+  if (IS_BIGENDIAN())
+    {
+      for (size_t i = 0; i < datasize; ++i)
+        sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]);
+    }
+  else
+    {
+      for (size_t i = 0; i < datasize; ++i)
+        {
+          uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]);
+          sgrib[i] = gribSwapByteOrder_uint16(ui16);
+        }
+    }
+
+  *gz += 2*datasize;
+}
+
+static
+void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, 
+			      GRIBPACK *restrict lGrib,
+			      const T *restrict data, 
+			      T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+
+  data += packStart;
+  datasize -= packStart;
+
+  if (numBits ==  8)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+	  lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]);
+	}
+    }
+  else if (numBits == 16)
+    {
+      if (sizeof(T) == sizeof(double))
+      	{
+          grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z);
+        }
+      else
+        {
+          TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z);
+        }
+    }
+  else if (numBits == 24)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+          uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 16);
+          lGrib[z++] = (GRIBPACK)(ui32 >>  8);
+          lGrib[z++] = (GRIBPACK)ui32;
+	}
+    }
+  else if (numBits == 32)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+          uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 24);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 16);
+          lGrib[z++] = (GRIBPACK)(ui32 >>  8);
+          lGrib[z++] = (GRIBPACK)ui32;
+	}
+    }
+  else if (numBits > 0 && numBits <= 32)
+    {
+      TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z);
+    }
+  else if (numBits == 0)
+    {
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  *gz = z;
+}
+
+static
+void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, 
+				       GRIBPACK *restrict lGrib,
+				       const T *restrict data, 
+				       T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+#ifdef _ARCH_PWR6
+  enum { CGRIBEX__UNROLL_DEPTH_2 = 8 };
+#else
+  enum { CGRIBEX__UNROLL_DEPTH_2 = 128 };
+#endif
+  size_t residual;
+  size_t ofs;
+  double dval[CGRIBEX__UNROLL_DEPTH_2];
+
+  data += packStart;
+  datasize -= packStart;
+  residual =  datasize % CGRIBEX__UNROLL_DEPTH_2;
+  ofs = datasize - residual;
+
+  // reducing FP operations to single FMA is slowing down on pwr6 ...
+
+  if      ( numBits ==  8 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(2, "pack 8 bit unrolled");
+#endif
+      unsigned char *cgrib = (unsigned char *) (lGrib + z);
+      size_t i;
+      for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+	      dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+	    }
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+#ifdef _ARCH_PWR6
+	      *cgrib++ =  (unsigned long) dval[j];
+#else
+	      *cgrib++ =  (unsigned char) dval[j];
+#endif
+	    }
+	  z += CGRIBEX__UNROLL_DEPTH_2;
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+#ifdef _ARCH_PWR6
+	  *cgrib++ = (unsigned long) dval[j];
+#else
+	  *cgrib++ = (unsigned char) dval[j];
+#endif
+	}
+      z += residual;
+
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(2);
+#endif
+    }
+  else if ( numBits == 16 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(3, "pack 16 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint16_t ival;
+#endif
+      uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z);
+
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    dval[j] = CGRIBEX_FPSCALE(data[j]);
+	  if ( IS_BIGENDIAN() )
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+#ifdef _ARCH_PWR6
+		  *sgrib++ = (unsigned long) dval[j];
+#else
+		  *sgrib++ = (uint16_t) dval[j];
+#endif
+		}
+	      z += 2*CGRIBEX__UNROLL_DEPTH_2;
+	    }
+	  else
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+		  ival = (uint16_t) dval[j];
+                  *sgrib++ = gribSwapByteOrder_uint16(ival);
+		}
+	      z += 2*CGRIBEX__UNROLL_DEPTH_2;
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[j]);
+	}
+      if ( IS_BIGENDIAN() )
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+#ifdef _ARCH_PWR6
+	      *sgrib++ = (unsigned long) dval[j];
+#else
+              *sgrib++ = (uint16_t) dval[j];
+#endif
+	    }
+	  z += 2*residual;
+	}
+      else
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+              ival = (uint16_t) dval[j];
+	      lGrib[z  ] = (GRIBPACK)(ival >>  8);
+	      lGrib[z+1] = (GRIBPACK)ival;
+	      z += 2;
+	    }
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(3);
+#endif
+    }
+  else if ( numBits == 24 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(4, "pack 24 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint32_t ival;
+#endif
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+	      dval[j] = CGRIBEX_FPSCALE(data[j]);
+	    }
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+#ifdef _ARCH_PWR6
+	      ival = (unsigned long) dval[j];
+#else
+	      ival = (uint32_t) dval[j];
+#endif
+	      lGrib[z  ] =  (GRIBPACK)(ival >> 16);
+	      lGrib[z+1] =  (GRIBPACK)(ival >>  8);
+	      lGrib[z+2] =  (GRIBPACK)ival;
+	      z += 3;
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[j]);
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  ival = (uint32_t) dval[j];
+	  lGrib[z  ] =  (GRIBPACK)(ival >> 16);
+	  lGrib[z+1] =  (GRIBPACK)(ival >>  8);
+	  lGrib[z+2] =  (GRIBPACK)ival;
+	  z += 3;
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(4);
+#endif
+    }
+  else if ( numBits == 32 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(5, "pack 32 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint32_t ival;
+#endif
+      unsigned int *igrib = (unsigned int *)(void *)(lGrib + z);
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+        {
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+
+	  if ( IS_BIGENDIAN() )
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+#ifdef _ARCH_PWR6
+		  *igrib = (unsigned long) dval[j];
+#else
+		  *igrib = (uint32_t) dval[j];
+#endif
+		  igrib++;
+		  z += 4;
+		}
+	    }
+	  else
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+                  ival = (uint32_t) dval[j];
+		  lGrib[z  ] =  (GRIBPACK)(ival >> 24);
+		  lGrib[z+1] =  (GRIBPACK)(ival >> 16);
+		  lGrib[z+2] =  (GRIBPACK)(ival >>  8);
+		  lGrib[z+3] =  (GRIBPACK)ival;
+		  z += 4;
+		}
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+          dval[j] = CGRIBEX_FPSCALE(data[ofs+j]);
+	}
+      if ( IS_BIGENDIAN() )
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+#ifdef _ARCH_PWR6
+	      *igrib = (unsigned long) dval[j];
+#else
+	      *igrib = (uint32_t) dval[j];
+#endif
+	      igrib++;
+	      z += 4;
+	    }
+	}
+      else
+	{
+          for (size_t j = 0; j < residual; ++j) 
+	    {
+	      ival = (uint32_t) dval[j];
+	      lGrib[z  ] =  (GRIBPACK)(ival >> 24);
+	      lGrib[z+1] =  (GRIBPACK)(ival >> 16);
+	      lGrib[z+2] =  (GRIBPACK)(ival >>  8);
+	      lGrib[z+3] =  (GRIBPACK)ival;
+	      z += 4;
+	    }
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(5);
+#endif
+    }
+  else if ( numBits > 0 && numBits <= 32 )
+    {
+      TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z);
+    }
+  else if ( numBits == 0 )
+    {
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  *gz = z;
+}
+
+#ifdef CGRIBEX_FPSCALE
+#undef CGRIBEX_FPSCALE
+#endif
+
+#endif /* T */
+
+#ifdef T
+#undef T
+#endif
+#define T float
+#ifdef T
+
+
+#define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5)
+
+static
+void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib,
+				     const T *data, T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+  unsigned int ival;
+  int cbits, jbits;
+  unsigned int c;
+
+  // code from gribw routine flist2bitstream
+
+  cbits = 8;
+  c = 0;
+  for (size_t i = packStart; i < datasize; ++i)
+    {
+      // note float -> unsigned int .. truncate
+      ival = (unsigned int)(CGRIBEX_FPSCALE(data[i]));
+      /*
+	if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2;
+	if ( ival < 0 ) ival = 0;
+      */
+      jbits = numBits;
+      while ( cbits <= jbits ) 
+	{
+	  if ( cbits == 8 )
+	    {
+	      jbits -= 8;
+	      lGrib[z++] = (ival >> jbits) & 0xFF;
+	    }
+	  else
+	    {
+	      jbits -= cbits;
+	      lGrib[z++] = (GRIBPACK)((c << cbits)
+                                      + ((ival >> jbits) & ((1U << cbits) - 1)));
+	      cbits = 8;
+	      c = 0;
+	    }
+	}
+      /* now jbits < cbits */
+      if ( jbits )
+	{
+	  c = (c << jbits) + (ival & ((1U << jbits)-1));
+	  cbits -= jbits;
+	}
+    }
+  if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits);
+
+  *gz = z;
+}
+
+
+static
+void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib,
+				    const T *restrict data, T zref, T factor, size_t *gz)
+{
+  uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz);
+
+  if (IS_BIGENDIAN())
+    {
+      for (size_t i = 0; i < datasize; ++i)
+        sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]);
+    }
+  else
+    {
+      for (size_t i = 0; i < datasize; ++i)
+        {
+          uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]);
+          sgrib[i] = gribSwapByteOrder_uint16(ui16);
+        }
+    }
+
+  *gz += 2*datasize;
+}
+
+static
+void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, 
+			      GRIBPACK *restrict lGrib,
+			      const T *restrict data, 
+			      T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+
+  data += packStart;
+  datasize -= packStart;
+
+  if (numBits ==  8)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+	  lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]);
+	}
+    }
+  else if (numBits == 16)
+    {
+      if (sizeof(T) == sizeof(double))
+      	{
+          grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z);
+        }
+      else
+        {
+          TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z);
+        }
+    }
+  else if (numBits == 24)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+          uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 16);
+          lGrib[z++] = (GRIBPACK)(ui32 >>  8);
+          lGrib[z++] = (GRIBPACK)ui32;
+	}
+    }
+  else if (numBits == 32)
+    {
+      for (size_t i = 0; i < datasize; ++i)
+	{
+          uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 24);
+          lGrib[z++] = (GRIBPACK)(ui32 >> 16);
+          lGrib[z++] = (GRIBPACK)(ui32 >>  8);
+          lGrib[z++] = (GRIBPACK)ui32;
+	}
+    }
+  else if (numBits > 0 && numBits <= 32)
+    {
+      TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z);
+    }
+  else if (numBits == 0)
+    {
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  *gz = z;
+}
+
+static
+void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, 
+				       GRIBPACK *restrict lGrib,
+				       const T *restrict data, 
+				       T zref, T factor, size_t *gz)
+{
+  size_t z = *gz;
+#ifdef _ARCH_PWR6
+  enum { CGRIBEX__UNROLL_DEPTH_2 = 8 };
+#else
+  enum { CGRIBEX__UNROLL_DEPTH_2 = 128 };
+#endif
+  size_t residual;
+  size_t ofs;
+  double dval[CGRIBEX__UNROLL_DEPTH_2];
+
+  data += packStart;
+  datasize -= packStart;
+  residual =  datasize % CGRIBEX__UNROLL_DEPTH_2;
+  ofs = datasize - residual;
+
+  // reducing FP operations to single FMA is slowing down on pwr6 ...
+
+  if      ( numBits ==  8 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(2, "pack 8 bit unrolled");
+#endif
+      unsigned char *cgrib = (unsigned char *) (lGrib + z);
+      size_t i;
+      for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+	      dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+	    }
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+#ifdef _ARCH_PWR6
+	      *cgrib++ =  (unsigned long) dval[j];
+#else
+	      *cgrib++ =  (unsigned char) dval[j];
+#endif
+	    }
+	  z += CGRIBEX__UNROLL_DEPTH_2;
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+#ifdef _ARCH_PWR6
+	  *cgrib++ = (unsigned long) dval[j];
+#else
+	  *cgrib++ = (unsigned char) dval[j];
+#endif
+	}
+      z += residual;
+
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(2);
+#endif
+    }
+  else if ( numBits == 16 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(3, "pack 16 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint16_t ival;
+#endif
+      uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z);
+
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    dval[j] = CGRIBEX_FPSCALE(data[j]);
+	  if ( IS_BIGENDIAN() )
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+#ifdef _ARCH_PWR6
+		  *sgrib++ = (unsigned long) dval[j];
+#else
+		  *sgrib++ = (uint16_t) dval[j];
+#endif
+		}
+	      z += 2*CGRIBEX__UNROLL_DEPTH_2;
+	    }
+	  else
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+		  ival = (uint16_t) dval[j];
+                  *sgrib++ = gribSwapByteOrder_uint16(ival);
+		}
+	      z += 2*CGRIBEX__UNROLL_DEPTH_2;
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[j]);
+	}
+      if ( IS_BIGENDIAN() )
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+#ifdef _ARCH_PWR6
+	      *sgrib++ = (unsigned long) dval[j];
+#else
+              *sgrib++ = (uint16_t) dval[j];
+#endif
+	    }
+	  z += 2*residual;
+	}
+      else
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+              ival = (uint16_t) dval[j];
+	      lGrib[z  ] = (GRIBPACK)(ival >>  8);
+	      lGrib[z+1] = (GRIBPACK)ival;
+	      z += 2;
+	    }
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(3);
+#endif
+    }
+  else if ( numBits == 24 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(4, "pack 24 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint32_t ival;
+#endif
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+	{
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+	      dval[j] = CGRIBEX_FPSCALE(data[j]);
+	    }
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+	    {
+#ifdef _ARCH_PWR6
+	      ival = (unsigned long) dval[j];
+#else
+	      ival = (uint32_t) dval[j];
+#endif
+	      lGrib[z  ] =  (GRIBPACK)(ival >> 16);
+	      lGrib[z+1] =  (GRIBPACK)(ival >>  8);
+	      lGrib[z+2] =  (GRIBPACK)ival;
+	      z += 3;
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  dval[j] = CGRIBEX_FPSCALE(data[j]);
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+	  ival = (uint32_t) dval[j];
+	  lGrib[z  ] =  (GRIBPACK)(ival >> 16);
+	  lGrib[z+1] =  (GRIBPACK)(ival >>  8);
+	  lGrib[z+2] =  (GRIBPACK)ival;
+	  z += 3;
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(4);
+#endif
+    }
+  else if ( numBits == 32 )
+    {
+#ifdef _GET_IBM_COUNTER 
+      hpmStart(5, "pack 32 bit unrolled");
+#endif
+#ifdef _ARCH_PWR6
+      unsigned long ival;
+#else
+      uint32_t ival;
+#endif
+      unsigned int *igrib = (unsigned int *)(void *)(lGrib + z);
+      for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2)
+        {
+	  for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]);
+
+	  if ( IS_BIGENDIAN() )
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+#ifdef _ARCH_PWR6
+		  *igrib = (unsigned long) dval[j];
+#else
+		  *igrib = (uint32_t) dval[j];
+#endif
+		  igrib++;
+		  z += 4;
+		}
+	    }
+	  else
+	    {
+	      for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j)
+		{
+                  ival = (uint32_t) dval[j];
+		  lGrib[z  ] =  (GRIBPACK)(ival >> 24);
+		  lGrib[z+1] =  (GRIBPACK)(ival >> 16);
+		  lGrib[z+2] =  (GRIBPACK)(ival >>  8);
+		  lGrib[z+3] =  (GRIBPACK)ival;
+		  z += 4;
+		}
+	    }
+	}
+      for (size_t j = 0; j < residual; ++j) 
+	{
+          dval[j] = CGRIBEX_FPSCALE(data[ofs+j]);
+	}
+      if ( IS_BIGENDIAN() )
+	{
+	  for (size_t j = 0; j < residual; ++j) 
+	    {
+#ifdef _ARCH_PWR6
+	      *igrib = (unsigned long) dval[j];
+#else
+	      *igrib = (uint32_t) dval[j];
+#endif
+	      igrib++;
+	      z += 4;
+	    }
+	}
+      else
+	{
+          for (size_t j = 0; j < residual; ++j) 
+	    {
+	      ival = (uint32_t) dval[j];
+	      lGrib[z  ] =  (GRIBPACK)(ival >> 24);
+	      lGrib[z+1] =  (GRIBPACK)(ival >> 16);
+	      lGrib[z+2] =  (GRIBPACK)(ival >>  8);
+	      lGrib[z+3] =  (GRIBPACK)ival;
+	      z += 4;
+	    }
+	}
+#ifdef _GET_IBM_COUNTER 
+      hpmStop(5);
+#endif
+    }
+  else if ( numBits > 0 && numBits <= 32 )
+    {
+      TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z);
+    }
+  else if ( numBits == 0 )
+    {
+    }
+  else
+    {
+      Error("Unimplemented packing factor %d!", numBits);
+    }
+
+  *gz = z;
+}
+
+#ifdef CGRIBEX_FPSCALE
+#undef CGRIBEX_FPSCALE
+#endif
+
+#endif /* T */
+
+
+#ifdef T
+#undef T
+#endif
+#define T double
+#ifdef T
+
+// GRIB BLOCK 2 - GRID DESCRIPTION SECTION
+static
+void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2)
+{
+  long z = *gribLen;
+  int exponent, mantissa;
+  int ival;
+  int gdslen = 32;
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10;
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )  gdslen += 10;
+
+  const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF;
+
+  if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat;
+
+  gdslen += ISEC2_NumVCP * 4;
+
+  Put3Byte(gdslen);             /*  0- 2 Length of Block 2 Byte 0 */
+  Put1Byte(ISEC2_NumVCP);       /*  3    NV */
+  Put1Byte(pvoffset);           /*  4    PV */
+  Put1Byte(ISEC2_GridType);     /*  5    LatLon=0 Gauss=4 Spectral=50 */
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL )
+    {
+      Put2Byte(ISEC2_PentaJ);   /*  6- 7 Pentagonal resolution J  */
+      Put2Byte(ISEC2_PentaK);   /*  8- 9 Pentagonal resolution K  */
+      Put2Byte(ISEC2_PentaM);   /* 10-11 Pentagonal resolution M  */
+      Put1Byte(ISEC2_RepType);  /* 12    Representation type      */
+      Put1Byte(ISEC2_RepMode);  /* 13    Representation mode      */
+      PutnZero(18);             /* 14-31 reserved                 */
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GME )
+    {
+      Put2Byte(ISEC2_GME_NI2);
+      Put2Byte(ISEC2_GME_NI3);
+      Put3Byte(ISEC2_GME_ND);
+      Put3Byte(ISEC2_GME_NI);
+      Put1Byte(ISEC2_GME_AFlag);
+      Put3Int(ISEC2_GME_LatPP);
+      Put3Int(ISEC2_GME_LonPP);
+      Put3Int(ISEC2_GME_LonMPL);
+      Put1Byte(ISEC2_GME_BFlag);
+      PutnZero(5);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LCC )
+    {
+      Put2Byte(ISEC2_NumLon);          /*  6- 7 Longitudes               */
+
+      Put2Byte(ISEC2_NumLat);          /*  8- 9 Latitudes                */
+      Put3Int(ISEC2_FirstLat);
+      Put3Int(ISEC2_FirstLon);
+      Put1Byte(ISEC2_ResFlag);         /* 16    Resolution flag          */
+      Put3Int(ISEC2_Lambert_Lov);      /* 17-19 */
+      Put3Int(ISEC2_Lambert_dx);       /* 20-22 */
+      Put3Int(ISEC2_Lambert_dy);       /* 23-25 */
+      Put1Byte(ISEC2_Lambert_ProjFlag);/* 26    Projection flag          */
+      Put1Byte(ISEC2_ScanFlag);        /* 27    Scanning mode            */
+      Put3Int(ISEC2_Lambert_LatS1);    /* 28-30 */  
+      Put3Int(ISEC2_Lambert_LatS2);    /* 31-33 */
+      Put3Int(ISEC2_Lambert_LatSP);    /* 34-36 */  
+      Put3Int(ISEC2_Lambert_LonSP);    /* 37-39 */
+      PutnZero(2);                     /* 34-41 */
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON    ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN  ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+    {
+      const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon;
+      Put2Byte(numlon);                /*  6- 7 Number of Longitudes     */
+
+      Put2Byte(ISEC2_NumLat);          /*  8- 9 Number of Latitudes      */
+      Put3Int(ISEC2_FirstLat);
+      Put3Int(ISEC2_FirstLon);
+      Put1Byte(ISEC2_ResFlag);         /* 16    Resolution flag          */
+      Put3Int(ISEC2_LastLat);
+      Put3Int(ISEC2_LastLon);
+      const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr;
+      const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr;
+      Put2Byte(lonIncr);               /* 23-24 i - direction increment  */
+      if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN )
+	Put2Byte(ISEC2_NumPar);        /* 25-26 Latitudes Pole->Equator  */
+      else
+	Put2Byte(latIncr);             /* 25-26 j - direction increment  */
+
+      Put1Byte(ISEC2_ScanFlag);        /* 27    Scanning mode            */
+      PutnZero(4);                     /* 28-31 reserved                 */
+
+      if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+	{
+	  Put3Int(ISEC2_LatSP);
+	  Put3Int(ISEC2_LonSP);
+	  Put1Real((double)(FSEC2_RotAngle));
+	}
+    }
+  else
+    {
+      Error("Unsupported grid type %d", ISEC2_GridType);
+    }
+
+#if defined (SX)
+#pragma vdir novector     /* vectorization gives wrong results on NEC */
+#endif
+  for (long i = 0; i < ISEC2_NumVCP; ++i)
+    {
+      Put1Real((double)(fsec2[10+i]));
+    }
+
+  if ( ISEC2_Reduced )
+    for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i));
+
+  *gribLen = z;
+}
+
+// GRIB BLOCK 3 - BIT MAP SECTION
+static
+void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize)
+{
+  long z = *gribLen;
+  static bool lmissvalinfo = true;
+  //  unsigned int c, imask;
+
+  if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo)
+    {
+      lmissvalinfo = false;
+      Message("Missing value = NaN is unsupported!");
+    }
+
+  const long bitmapSize = ISEC4_NumValues;
+  const long imaskSize = ((bitmapSize+7)>>3)<<3;
+  GRIBPACK *bitmap = &lGrib[z+6];
+  long fsec4size = 0;
+
+#ifdef VECTORCODE
+  unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int));
+  memset(imask, 0, imaskSize*sizeof(int));
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+  for (long i = 0; i < bitmapSize; ++i)
+    {
+      if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) )
+	{
+	  data[fsec4size++] = data[i];
+	  imask[i] = 1;
+	}
+    }
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+  for (long i = 0; i < imaskSize/8; ++i)
+    {
+      bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) |
+	          (imask[i*8+2] << 5) | (imask[i*8+3] << 4) |
+	          (imask[i*8+4] << 3) | (imask[i*8+5] << 2) |
+	          (imask[i*8+6] << 1) | (imask[i*8+7]);
+    }
+
+  Free(imask);
+#else
+  for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0;
+
+  for (long i = 0; i < bitmapSize; ++i)
+    {
+      if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) )
+	{
+	  data[fsec4size++] = data[i];
+	  bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7)));
+	}
+    }
+#endif
+
+  const long bmsLen = imaskSize/8 + 6;
+  const long bmsUnusedBits = imaskSize - bitmapSize;
+
+  Put3Byte(bmsLen);   /*  0- 2 Length of Block 3 Byte 0 */
+  Put1Byte(bmsUnusedBits);
+  Put2Byte(0);
+
+  *gribLen += bmsLen;
+
+  *datasize = fsec4size;
+}
+
+#define pow_double pow
+#define pow_float powf
+
+// GRIB BLOCK 4 - BINARY DATA SECTION
+static
+int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data,
+			  long *datstart, long *datsize, int code)
+{
+  // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded
+  // Uwe Schulzweida,  6/05/2003 : Copy result to fpval to prevent integer overflow
+
+  size_t z = (size_t)*gribLen;
+  int numBits;
+  int ival;
+  long PackStart = 0;
+  int Flag = 0;
+  int binscale = 0;
+  int bds_head = 11;
+  int bds_ext = 0;
+  /* ibits = BitsPerInt; */
+  int exponent, mantissa;
+  bool lspherc = false;
+  int isubset = 0, itemp = 0, itrunc = 0;
+  T factor = 1, fmin, fmax;
+  const double jpepsln = 1.0e-12; // -----> tolerance used to check equality
+                                  //        of floating point numbers - needed
+		                  //        on some platforms (eg vpp700, linux)
+  extern int CGRIBEX_Const;       // 1: Don't pack constant fields on regular grids
+
+  if ( isec2 )
+    {
+      /* If section 2 is present, it says if data is spherical harmonic */
+
+      lspherc =  ( isec2[0] == 50 || isec2[0] == 60 ||
+                   isec2[0] == 70 || isec2[0] == 80 );
+
+      isec4[2] = lspherc ? 128 : 0;
+    }
+  else
+    {
+      /* Section 4 says if it's spherical harmonic data.. */
+
+      lspherc = ( isec4[2] == 128 );
+    }
+
+  /* Complex packing supported for spherical harmonics. */
+
+  const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) ||
+                        ( lspherc && isec2 && ( isec2[5] == 2 ) );
+
+  // Check input specification is consistent
+
+  if ( lcomplex && isec2 )
+    {
+      if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) )
+	{
+	  gprintf(__func__, "  COMPLEX mismatch. isec4[3] = %d\n", isec4[3]);
+	  gprintf(__func__, "  COMPLEX mismatch. isec2[5] = %d\n", isec2[5]);
+	  return (807);
+	}
+      else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) )
+	{
+	  gprintf(__func__, "  COMPLEX mismatch. isec4[3] = %d\n", isec4[3]);
+	  gprintf(__func__, "  COMPLEX mismatch. isec2[5] = %d\n", isec2[5]);
+	  return (807);
+        }
+      else if ( lcomplex )
+	{
+          // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation.
+	  isubset = isec4[17];
+	  // When encoding, use the total number of data.
+	  itemp   = isec4[0];
+	  itrunc  = (int) (sqrt(itemp*4 + 1.) - 3) / 2;
+	}
+    }
+
+  if ( decscale )
+    {
+      const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale);
+      for (long i = 0; i < datasize; ++i) data[i] *= scale;
+    }
+
+  if ( lspherc )
+    {
+      if ( lcomplex )
+	{
+	  const int jup  = isubset;
+	  const int ioff = (jup+1)*(jup+2);
+	  bds_ext = 4 + 3 + 4*ioff;
+	  PackStart = ioff;
+	  Flag = 192;
+	}
+      else
+	{
+	  bds_ext = 4;
+	  PackStart = 1;
+	  Flag = 128;
+	}
+    }
+
+  *datstart = bds_head + bds_ext;
+
+  int nbpv = numBits = ISEC4_NumBits;
+
+  if ( lspherc && lcomplex )
+    {
+      const int pcStart = isubset;
+      const int pcScale = isec4[16];
+      TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0);
+      TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize);
+    }
+
+  fmin = fmax = data[PackStart];
+
+  TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax);
+
+  double zref = (double)fmin;
+  if (!(zref < DBL_MAX && zref > -DBL_MAX))
+    {
+      gprintf(__func__, "Minimum value out of range: %g!", zref);
+      return (707);
+    }
+
+  if ( CGRIBEX_Const && !lspherc )
+    {
+      if ( IS_EQUAL(fmin, fmax) ) nbpv = 0;
+    }
+
+  long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8;
+  blockLength += blockLength & 1;
+
+  const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart);
+
+  Flag += (int)unused_bits;
+
+
+  // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit).
+  // if( nbpv == ibits ) nbpv = nbpv - 1;
+  /*
+    Calculate the binary scaling factor to spread the range of values over the number of bits per value.
+    Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline).
+  */
+  const double range = fabs(fmax - fmin);
+
+  if ( fabs(fmin) < FLT_MIN ) fmin = 0;
+  /*
+    Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux),
+    such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2.
+  */
+  if ( range <= jpepsln )
+    {
+      binscale = 0;
+    }
+  else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) )
+    {
+      binscale = 0;
+    }
+  else if ( fabs(range-1.0) <= jpepsln )
+    {
+      binscale = 1 - nbpv;
+    }
+  else if ( range > 1.0 )
+    {
+      const double rangec = range + jpepsln;
+      double p2 = 2.0;
+      int jloop = 1;
+      while ( jloop < 128 && p2 <= rangec )
+        {
+          p2 *= 2.0;
+          ++jloop;
+        }
+      if (jloop < 128)
+        binscale = jloop - nbpv;
+      else
+        {
+          gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code);
+          gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax);
+          return (707);
+        }
+    }
+  else
+    {
+      const double rangec = range - jpepsln;
+      double p05 = 0.5;
+      int jloop = 1;
+      while ( jloop < 127 && p05 >= rangec )
+	{
+          p05 *= 0.5;
+          jloop++;
+	}
+      if ( jloop < 127 )
+	{
+	  binscale = 1 - jloop - nbpv;
+	}
+      else
+	{
+	  gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code);
+	  gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax);
+	  return (707);
+	}
+    }
+
+  const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1);
+
+  if ( binscale != 0 )
+    {
+      while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++;
+
+      factor = (T)intpow2(-binscale);
+    }
+
+  ref2ibm(&zref, BitsPerInt);
+
+  Put3Byte(blockLength);      //  0-2 Length of Block 4
+  Put1Byte(Flag);             //  3   Flag & Unused bits
+  if ( binscale < 0 ) binscale = 32768 - binscale;
+  Put2Byte(binscale);         //  4-5 Scale factor
+  Put1Real(zref);             //  6-9 Reference value
+  Put1Byte(nbpv);             //   10 Packing size
+
+  if ( lspherc )
+    {
+      if ( lcomplex )
+	{
+	  const int jup = isubset;
+	  int ioff = (int)z + bds_ext;
+	  if ( ioff > 0xFFFF ) ioff = 0;
+	  Put2Byte(ioff);
+	  Put2Int(isec4[16]);
+	  Put1Byte(jup);
+	  Put1Byte(jup);
+	  Put1Byte(jup);
+	  for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i]));
+	}
+      else
+	{
+	  Put1Real((double)(data[0]));
+	}
+    }
+
+  *datsize  = ((datasize-PackStart)*nbpv + 7)/8;
+
+#if  defined  (_ARCH_PWR6)
+  TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z);
+#else
+  TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z);
+#endif
+
+  if ( unused_bits >= 8 ) Put1Byte(0);  //  Fillbyte
+
+  *gribLen = (long)z;
+
+  return 0;
+}
+
+
+void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3,
+			     T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib,
+			     int kleng, int *kword, int efunc, int *kret)
+{
+  long gribLen = 0; // Counter of GRIB length for output
+  long fsec4size = 0;
+  long datstart, datsize;
+
+  UNUSED(isec3);
+  UNUSED(efunc);
+
+  grsdef();
+
+  unsigned char *CGrib = (unsigned char *) kgrib;
+
+  const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128;
+  const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64;
+
+  // set max header len
+  size_t len = 16384;
+
+  // add data len
+  const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3);
+
+  len += numBytes*(size_t)klenp;
+
+  // add bitmap len
+  if ( bmsIncluded ) len += (size_t)((klenp+7)>>3);
+
+#ifdef VECTORCODE
+  GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK));
+  if ( lGrib == NULL ) SysError("No Memory!");
+#else
+  GRIBPACK *lGrib = CGrib;
+#endif
+
+  const long isLen = 8;
+  encodeIS(lGrib, &gribLen);
+  GRIBPACK *lpds = &lGrib[isLen];
+  const long pdsLen = getPdsLen(isec1);
+
+  encodePDS(lpds, pdsLen,  isec1);
+  gribLen += pdsLen;
+  /*
+  if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) )
+    {
+      static bool lwarn_cplx = true;
+
+      if ( lwarn_cplx )
+	Message("Complex packing of spectral data unsupported, using simple packing!");
+
+      isec2[5] = 1;
+      isec4[3] = 0;
+
+      lwarn_cplx = false;
+    }
+  */
+  if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2);
+  /*
+    ----------------------------------------------------------------
+    BMS Bit-Map Section Section (Section 3)
+    ----------------------------------------------------------------
+  */ 
+  if ( bmsIncluded )
+    {
+      TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size);
+    }
+  else
+    {
+      fsec4size = ISEC4_NumValues;
+    }
+
+  const long bdsstart = gribLen;
+  int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2,
+                                     isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter);
+  if ( status )
+    {
+      *kret = status;
+      return;
+    }
+
+  encodeES(lGrib, &gribLen, bdsstart);
+
+  if ( (size_t) gribLen > (size_t)kleng*sizeof(int) )
+    Error("kgrib buffer too small! kleng = %d  gribLen = %d", kleng, gribLen);
+
+#ifdef VECTORCODE
+  if ( (size_t) gribLen > len )
+    Error("lGrib buffer too small! len = %d  gribLen = %d", len, gribLen);
+
+  (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L);
+
+  Free(lGrib);
+#endif
+
+  ISEC0_GRIB_Len     = (int)gribLen;
+  ISEC0_GRIB_Version = 1;
+
+  *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int));
+
+  *kret = status;
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+
+#ifdef T
+#undef T
+#endif
+#define T float
+#ifdef T
+
+// GRIB BLOCK 2 - GRID DESCRIPTION SECTION
+static
+void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2)
+{
+  long z = *gribLen;
+  int exponent, mantissa;
+  int ival;
+  int gdslen = 32;
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10;
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )  gdslen += 10;
+
+  const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF;
+
+  if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat;
+
+  gdslen += ISEC2_NumVCP * 4;
+
+  Put3Byte(gdslen);             /*  0- 2 Length of Block 2 Byte 0 */
+  Put1Byte(ISEC2_NumVCP);       /*  3    NV */
+  Put1Byte(pvoffset);           /*  4    PV */
+  Put1Byte(ISEC2_GridType);     /*  5    LatLon=0 Gauss=4 Spectral=50 */
+
+  if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL )
+    {
+      Put2Byte(ISEC2_PentaJ);   /*  6- 7 Pentagonal resolution J  */
+      Put2Byte(ISEC2_PentaK);   /*  8- 9 Pentagonal resolution K  */
+      Put2Byte(ISEC2_PentaM);   /* 10-11 Pentagonal resolution M  */
+      Put1Byte(ISEC2_RepType);  /* 12    Representation type      */
+      Put1Byte(ISEC2_RepMode);  /* 13    Representation mode      */
+      PutnZero(18);             /* 14-31 reserved                 */
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_GME )
+    {
+      Put2Byte(ISEC2_GME_NI2);
+      Put2Byte(ISEC2_GME_NI3);
+      Put3Byte(ISEC2_GME_ND);
+      Put3Byte(ISEC2_GME_NI);
+      Put1Byte(ISEC2_GME_AFlag);
+      Put3Int(ISEC2_GME_LatPP);
+      Put3Int(ISEC2_GME_LonPP);
+      Put3Int(ISEC2_GME_LonMPL);
+      Put1Byte(ISEC2_GME_BFlag);
+      PutnZero(5);
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LCC )
+    {
+      Put2Byte(ISEC2_NumLon);          /*  6- 7 Longitudes               */
+
+      Put2Byte(ISEC2_NumLat);          /*  8- 9 Latitudes                */
+      Put3Int(ISEC2_FirstLat);
+      Put3Int(ISEC2_FirstLon);
+      Put1Byte(ISEC2_ResFlag);         /* 16    Resolution flag          */
+      Put3Int(ISEC2_Lambert_Lov);      /* 17-19 */
+      Put3Int(ISEC2_Lambert_dx);       /* 20-22 */
+      Put3Int(ISEC2_Lambert_dy);       /* 23-25 */
+      Put1Byte(ISEC2_Lambert_ProjFlag);/* 26    Projection flag          */
+      Put1Byte(ISEC2_ScanFlag);        /* 27    Scanning mode            */
+      Put3Int(ISEC2_Lambert_LatS1);    /* 28-30 */  
+      Put3Int(ISEC2_Lambert_LatS2);    /* 31-33 */
+      Put3Int(ISEC2_Lambert_LatSP);    /* 34-36 */  
+      Put3Int(ISEC2_Lambert_LonSP);    /* 37-39 */
+      PutnZero(2);                     /* 34-41 */
+    }
+  else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON    ||
+	    ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN  ||
+	    ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+    {
+      const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon;
+      Put2Byte(numlon);                /*  6- 7 Number of Longitudes     */
+
+      Put2Byte(ISEC2_NumLat);          /*  8- 9 Number of Latitudes      */
+      Put3Int(ISEC2_FirstLat);
+      Put3Int(ISEC2_FirstLon);
+      Put1Byte(ISEC2_ResFlag);         /* 16    Resolution flag          */
+      Put3Int(ISEC2_LastLat);
+      Put3Int(ISEC2_LastLon);
+      const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr;
+      const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr;
+      Put2Byte(lonIncr);               /* 23-24 i - direction increment  */
+      if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN )
+	Put2Byte(ISEC2_NumPar);        /* 25-26 Latitudes Pole->Equator  */
+      else
+	Put2Byte(latIncr);             /* 25-26 j - direction increment  */
+
+      Put1Byte(ISEC2_ScanFlag);        /* 27    Scanning mode            */
+      PutnZero(4);                     /* 28-31 reserved                 */
+
+      if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT )
+	{
+	  Put3Int(ISEC2_LatSP);
+	  Put3Int(ISEC2_LonSP);
+	  Put1Real((double)(FSEC2_RotAngle));
+	}
+    }
+  else
+    {
+      Error("Unsupported grid type %d", ISEC2_GridType);
+    }
+
+#if defined (SX)
+#pragma vdir novector     /* vectorization gives wrong results on NEC */
+#endif
+  for (long i = 0; i < ISEC2_NumVCP; ++i)
+    {
+      Put1Real((double)(fsec2[10+i]));
+    }
+
+  if ( ISEC2_Reduced )
+    for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i));
+
+  *gribLen = z;
+}
+
+// GRIB BLOCK 3 - BIT MAP SECTION
+static
+void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize)
+{
+  long z = *gribLen;
+  static bool lmissvalinfo = true;
+  //  unsigned int c, imask;
+
+  if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo)
+    {
+      lmissvalinfo = false;
+      Message("Missing value = NaN is unsupported!");
+    }
+
+  const long bitmapSize = ISEC4_NumValues;
+  const long imaskSize = ((bitmapSize+7)>>3)<<3;
+  GRIBPACK *bitmap = &lGrib[z+6];
+  long fsec4size = 0;
+
+#ifdef VECTORCODE
+  unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int));
+  memset(imask, 0, imaskSize*sizeof(int));
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+  for (long i = 0; i < bitmapSize; ++i)
+    {
+      if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) )
+	{
+	  data[fsec4size++] = data[i];
+	  imask[i] = 1;
+	}
+    }
+
+#if defined (CRAY)
+#pragma _CRI ivdep
+#endif
+#if defined (SX)
+#pragma vdir nodep
+#endif
+#ifdef __uxpch__
+#pragma loop novrec
+#endif
+  for (long i = 0; i < imaskSize/8; ++i)
+    {
+      bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) |
+	          (imask[i*8+2] << 5) | (imask[i*8+3] << 4) |
+	          (imask[i*8+4] << 3) | (imask[i*8+5] << 2) |
+	          (imask[i*8+6] << 1) | (imask[i*8+7]);
+    }
+
+  Free(imask);
+#else
+  for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0;
+
+  for (long i = 0; i < bitmapSize; ++i)
+    {
+      if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) )
+	{
+	  data[fsec4size++] = data[i];
+	  bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7)));
+	}
+    }
+#endif
+
+  const long bmsLen = imaskSize/8 + 6;
+  const long bmsUnusedBits = imaskSize - bitmapSize;
+
+  Put3Byte(bmsLen);   /*  0- 2 Length of Block 3 Byte 0 */
+  Put1Byte(bmsUnusedBits);
+  Put2Byte(0);
+
+  *gribLen += bmsLen;
+
+  *datasize = fsec4size;
+}
+
+#define pow_double pow
+#define pow_float powf
+
+// GRIB BLOCK 4 - BINARY DATA SECTION
+static
+int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data,
+			  long *datstart, long *datsize, int code)
+{
+  // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded
+  // Uwe Schulzweida,  6/05/2003 : Copy result to fpval to prevent integer overflow
+
+  size_t z = (size_t)*gribLen;
+  int numBits;
+  int ival;
+  long PackStart = 0;
+  int Flag = 0;
+  int binscale = 0;
+  int bds_head = 11;
+  int bds_ext = 0;
+  /* ibits = BitsPerInt; */
+  int exponent, mantissa;
+  bool lspherc = false;
+  int isubset = 0, itemp = 0, itrunc = 0;
+  T factor = 1, fmin, fmax;
+  const double jpepsln = 1.0e-12; // -----> tolerance used to check equality
+                                  //        of floating point numbers - needed
+		                  //        on some platforms (eg vpp700, linux)
+  extern int CGRIBEX_Const;       // 1: Don't pack constant fields on regular grids
+
+  if ( isec2 )
+    {
+      /* If section 2 is present, it says if data is spherical harmonic */
+
+      lspherc =  ( isec2[0] == 50 || isec2[0] == 60 ||
+                   isec2[0] == 70 || isec2[0] == 80 );
+
+      isec4[2] = lspherc ? 128 : 0;
+    }
+  else
+    {
+      /* Section 4 says if it's spherical harmonic data.. */
+
+      lspherc = ( isec4[2] == 128 );
+    }
+
+  /* Complex packing supported for spherical harmonics. */
+
+  const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) ||
+                        ( lspherc && isec2 && ( isec2[5] == 2 ) );
+
+  // Check input specification is consistent
+
+  if ( lcomplex && isec2 )
+    {
+      if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) )
+	{
+	  gprintf(__func__, "  COMPLEX mismatch. isec4[3] = %d\n", isec4[3]);
+	  gprintf(__func__, "  COMPLEX mismatch. isec2[5] = %d\n", isec2[5]);
+	  return (807);
+	}
+      else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) )
+	{
+	  gprintf(__func__, "  COMPLEX mismatch. isec4[3] = %d\n", isec4[3]);
+	  gprintf(__func__, "  COMPLEX mismatch. isec2[5] = %d\n", isec2[5]);
+	  return (807);
+        }
+      else if ( lcomplex )
+	{
+          // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation.
+	  isubset = isec4[17];
+	  // When encoding, use the total number of data.
+	  itemp   = isec4[0];
+	  itrunc  = (int) (sqrt(itemp*4 + 1.) - 3) / 2;
+	}
+    }
+
+  if ( decscale )
+    {
+      const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale);
+      for (long i = 0; i < datasize; ++i) data[i] *= scale;
+    }
+
+  if ( lspherc )
+    {
+      if ( lcomplex )
+	{
+	  const int jup  = isubset;
+	  const int ioff = (jup+1)*(jup+2);
+	  bds_ext = 4 + 3 + 4*ioff;
+	  PackStart = ioff;
+	  Flag = 192;
+	}
+      else
+	{
+	  bds_ext = 4;
+	  PackStart = 1;
+	  Flag = 128;
+	}
+    }
+
+  *datstart = bds_head + bds_ext;
+
+  int nbpv = numBits = ISEC4_NumBits;
+
+  if ( lspherc && lcomplex )
+    {
+      const int pcStart = isubset;
+      const int pcScale = isec4[16];
+      TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0);
+      TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize);
+    }
+
+  fmin = fmax = data[PackStart];
+
+  TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax);
+
+  double zref = (double)fmin;
+  if (!(zref < DBL_MAX && zref > -DBL_MAX))
+    {
+      gprintf(__func__, "Minimum value out of range: %g!", zref);
+      return (707);
+    }
+
+  if ( CGRIBEX_Const && !lspherc )
+    {
+      if ( IS_EQUAL(fmin, fmax) ) nbpv = 0;
+    }
+
+  long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8;
+  blockLength += blockLength & 1;
+
+  const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart);
+
+  Flag += (int)unused_bits;
+
+
+  // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit).
+  // if( nbpv == ibits ) nbpv = nbpv - 1;
+  /*
+    Calculate the binary scaling factor to spread the range of values over the number of bits per value.
+    Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline).
+  */
+  const double range = fabs(fmax - fmin);
+
+  if ( fabs(fmin) < FLT_MIN ) fmin = 0;
+  /*
+    Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux),
+    such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2.
+  */
+  if ( range <= jpepsln )
+    {
+      binscale = 0;
+    }
+  else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) )
+    {
+      binscale = 0;
+    }
+  else if ( fabs(range-1.0) <= jpepsln )
+    {
+      binscale = 1 - nbpv;
+    }
+  else if ( range > 1.0 )
+    {
+      const double rangec = range + jpepsln;
+      double p2 = 2.0;
+      int jloop = 1;
+      while ( jloop < 128 && p2 <= rangec )
+        {
+          p2 *= 2.0;
+          ++jloop;
+        }
+      if (jloop < 128)
+        binscale = jloop - nbpv;
+      else
+        {
+          gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code);
+          gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax);
+          return (707);
+        }
+    }
+  else
+    {
+      const double rangec = range - jpepsln;
+      double p05 = 0.5;
+      int jloop = 1;
+      while ( jloop < 127 && p05 >= rangec )
+	{
+          p05 *= 0.5;
+          jloop++;
+	}
+      if ( jloop < 127 )
+	{
+	  binscale = 1 - jloop - nbpv;
+	}
+      else
+	{
+	  gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code);
+	  gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax);
+	  return (707);
+	}
+    }
+
+  const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1);
+
+  if ( binscale != 0 )
+    {
+      while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++;
+
+      factor = (T)intpow2(-binscale);
+    }
+
+  ref2ibm(&zref, BitsPerInt);
+
+  Put3Byte(blockLength);      //  0-2 Length of Block 4
+  Put1Byte(Flag);             //  3   Flag & Unused bits
+  if ( binscale < 0 ) binscale = 32768 - binscale;
+  Put2Byte(binscale);         //  4-5 Scale factor
+  Put1Real(zref);             //  6-9 Reference value
+  Put1Byte(nbpv);             //   10 Packing size
+
+  if ( lspherc )
+    {
+      if ( lcomplex )
+	{
+	  const int jup = isubset;
+	  int ioff = (int)z + bds_ext;
+	  if ( ioff > 0xFFFF ) ioff = 0;
+	  Put2Byte(ioff);
+	  Put2Int(isec4[16]);
+	  Put1Byte(jup);
+	  Put1Byte(jup);
+	  Put1Byte(jup);
+	  for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i]));
+	}
+      else
+	{
+	  Put1Real((double)(data[0]));
+	}
+    }
+
+  *datsize  = ((datasize-PackStart)*nbpv + 7)/8;
+
+#if  defined  (_ARCH_PWR6)
+  TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z);
+#else
+  TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z);
+#endif
+
+  if ( unused_bits >= 8 ) Put1Byte(0);  //  Fillbyte
+
+  *gribLen = (long)z;
+
+  return 0;
+}
+
+
+void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3,
+			     T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib,
+			     int kleng, int *kword, int efunc, int *kret)
+{
+  long gribLen = 0; // Counter of GRIB length for output
+  long fsec4size = 0;
+  long datstart, datsize;
+
+  UNUSED(isec3);
+  UNUSED(efunc);
+
+  grsdef();
+
+  unsigned char *CGrib = (unsigned char *) kgrib;
+
+  const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128;
+  const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64;
+
+  // set max header len
+  size_t len = 16384;
+
+  // add data len
+  const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3);
+
+  len += numBytes*(size_t)klenp;
+
+  // add bitmap len
+  if ( bmsIncluded ) len += (size_t)((klenp+7)>>3);
+
+#ifdef VECTORCODE
+  GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK));
+  if ( lGrib == NULL ) SysError("No Memory!");
+#else
+  GRIBPACK *lGrib = CGrib;
+#endif
+
+  const long isLen = 8;
+  encodeIS(lGrib, &gribLen);
+  GRIBPACK *lpds = &lGrib[isLen];
+  const long pdsLen = getPdsLen(isec1);
+
+  encodePDS(lpds, pdsLen,  isec1);
+  gribLen += pdsLen;
+  /*
+  if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) )
+    {
+      static bool lwarn_cplx = true;
+
+      if ( lwarn_cplx )
+	Message("Complex packing of spectral data unsupported, using simple packing!");
+
+      isec2[5] = 1;
+      isec4[3] = 0;
+
+      lwarn_cplx = false;
+    }
+  */
+  if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2);
+  /*
+    ----------------------------------------------------------------
+    BMS Bit-Map Section Section (Section 3)
+    ----------------------------------------------------------------
+  */ 
+  if ( bmsIncluded )
+    {
+      TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size);
+    }
+  else
+    {
+      fsec4size = ISEC4_NumValues;
+    }
+
+  const long bdsstart = gribLen;
+  int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2,
+                                     isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter);
+  if ( status )
+    {
+      *kret = status;
+      return;
+    }
+
+  encodeES(lGrib, &gribLen, bdsstart);
+
+  if ( (size_t) gribLen > (size_t)kleng*sizeof(int) )
+    Error("kgrib buffer too small! kleng = %d  gribLen = %d", kleng, gribLen);
+
+#ifdef VECTORCODE
+  if ( (size_t) gribLen > len )
+    Error("lGrib buffer too small! len = %d  gribLen = %d", len, gribLen);
+
+  (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L);
+
+  Free(lGrib);
+#endif
+
+  ISEC0_GRIB_Len     = (int)gribLen;
+  ISEC0_GRIB_Version = 1;
+
+  *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int));
+
+  *kret = status;
+}
+
+#endif /* T */
+
+/*
+ * Local Variables:
+ * mode: c
+ * End:
+ */
+// clang-format on
+
+void encode_dummy(void);
+void
+encode_dummy(void)
+{
+  (void) encode_array_unrolled_double(0, 0, 0, NULL, NULL, 0, 0, NULL);
+  (void) encode_array_unrolled_float(0, 0, 0, NULL, NULL, 0, 0, NULL);
+}
+static const char grb_libvers[] = "2.3.0";
+const char *
+cgribexLibraryVersion(void)
+{
+  return (grb_libvers);
+}
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
+#pragma GCC diagnostic pop
+#endif
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#ifdef WORDS_BIGENDIAN
+#include <limits.h>
+#endif
+
+
+static const uint32_t crctab[]
+    = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f,
+        0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
+        0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
+        0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+        0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027,
+        0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+        0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c,
+        0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+        0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
+        0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
+        0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044,
+        0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59,
+        0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
+        0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
+        0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+        0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601,
+        0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad,
+        0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+        0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
+        0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
+        0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12,
+        0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06,
+        0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 };
+
+uint32_t
+memcrc(const unsigned char *b, size_t n)
+{
+  /*  Input arguments:
+   *  const char*   b == byte sequence to checksum
+   *  size_t        n == length of sequence
+   */
+
+  uint32_t s = 0;
+
+  memcrc_r(&s, b, n);
+
+  /* Extend with the length of the string. */
+  while (n != 0)
+    {
+      register uint32_t c = n & 0377;
+      n >>= 8;
+      s = (s << 8) ^ crctab[(s >> 24) ^ c];
+    }
+
+  return ~s;
+}
+
+void
+memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len)
+{
+  /*  Input arguments:
+   *  const char*   b == byte sequence to checksum
+   *  size_t        n == length of sequence
+   */
+
+  register uint32_t c, s = *state;
+  register size_t n = block_len;
+  register const unsigned char *b = block;
+
+  for (; n > 0; --n)
+    {
+      c = (uint32_t) (*b++);
+      s = (s << 8) ^ crctab[(s >> 24) ^ c];
+    }
+
+  *state = s;
+}
+
+#ifdef WORDS_BIGENDIAN
+#define SWAP_CSUM(BITWIDTH, BYTEWIDTH, NACC)                               \
+  do                                                                       \
+    {                                                                      \
+      register const uint##BITWIDTH##_t *b = (uint##BITWIDTH##_t *) elems; \
+      for (size_t i = 0; i < num_elems; ++i)                               \
+        {                                                                  \
+          for (size_t aofs = NACC; aofs > 0; --aofs)                       \
+            {                                                              \
+              uint##BITWIDTH##_t accum = b[i + aofs - 1];                  \
+              for (size_t j = 0; j < BYTEWIDTH; ++j)                       \
+                {                                                          \
+                  uint32_t c = (uint32_t) (accum & UCHAR_MAX);             \
+                  s = (s << 8) ^ crctab[(s >> 24) ^ c];                    \
+                  accum >>= 8;                                             \
+                }                                                          \
+            }                                                              \
+        }                                                                  \
+    }                                                                      \
+  while (0)
+#endif
+
+/**
+ *  Does endian-swapping prior to checksumming in case platform is big-endian
+ *
+ *  @param elems points to first first element with alignment elem_size
+ *  @param num_elems number of elements to process
+ *  @param elem_size size of each element in bytes
+ */
+void
+memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size)
+{
+#ifdef WORDS_BIGENDIAN
+  register uint32_t s = *state;
+
+  switch (elem_size)
+    {
+    case 1: memcrc_r(state, elems, num_elems * elem_size); return;
+    case 2: SWAP_CSUM(16, 2, 1); break;
+    case 4: SWAP_CSUM(32, 4, 1); break;
+    case 8: SWAP_CSUM(64, 8, 1); break;
+    case 16: SWAP_CSUM(64, 8, 2); break;
+    }
+  *state = s;
+#else
+  memcrc_r(state, elems, num_elems * elem_size);
+#endif
+}
+
+uint32_t
+memcrc_finish(uint32_t *state, off_t total_size)
+{
+  register uint32_t c, s = *state;
+  register uint64_t n = (uint64_t) total_size;
+
+  /* Extend with the length of the string. */
+  while (n != 0)
+    {
+      c = n & 0377;
+      n >>= 8;
+      s = (s << 8) ^ crctab[(s >> 24) ^ c];
+    }
+
+  return ~s;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#if !defined(HAVE_CONFIG_H) && !defined(HAVE_MALLOC_H) && defined(SX)
+#define HAVE_MALLOC_H
+#endif
+
+#ifdef HAVE_MALLOC_H
+#include <malloc.h>
+#endif
+
+
+enum
+{
+  MALLOC_FUNC = 0,
+  CALLOC_FUNC,
+  REALLOC_FUNC,
+  FREE_FUNC
+};
+
+static const char *const memfunc[] = { "Malloc", "Calloc", "Realloc", "Free" };
+
+#undef MEM_UNDEFID
+#define MEM_UNDEFID -1
+
+#define MEM_MAXNAME 32 /* Min = 8, for  "unknown" ! */
+
+static int dmemory_ExitOnError = 1;
+
+typedef struct
+{
+  void *ptr;
+  size_t size;
+  size_t nobj;
+  int item;
+  int mtype;
+  int line;
+  char filename[MEM_MAXNAME];
+  char functionname[MEM_MAXNAME];
+} MemTable_t;
+
+static MemTable_t *memTable;
+static size_t memTableSize = 0;
+static long memAccess = 0;
+
+static size_t MemObjs = 0;
+static size_t MaxMemObjs = 0;
+static size_t MemUsed = 0;
+static size_t MaxMemUsed = 0;
+
+static int MEM_Debug = 0; /* If set to 1, debugging */
+static int MEM_Info = 0;  /* If set to 1, print mem table at exit */
+
+static const char *
+get_filename(const char *file)
+{
+  const char *fnptr = strrchr(file, '/');
+  if (fnptr)
+    fnptr++;
+  else
+    fnptr = (char *) file;
+
+  return fnptr;
+}
+
+void
+memDebug(int debug)
+{
+  MEM_Debug = debug;
+  if (MEM_Debug && !MEM_Info) MEM_Info = 1;
+}
+
+// If we're not using GNU C, elide __attribute__
+#if !defined __GNUC__ && !defined __attribute__
+#define __attribute__(x) /*NOTHING*/
+#endif
+
+static void memInternalProblem(const char *caller, const char *fmt, ...) __attribute__((noreturn));
+
+static void memError(const char *caller, const char *file, int line, size_t size) __attribute__((noreturn));
+
+static void
+memInternalProblem(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+  va_start(args, fmt);
+
+  printf("\n");
+  fprintf(stderr, "Internal problem (%s) : ", caller);
+  vfprintf(stderr, fmt, args);
+  fprintf(stderr, "\n");
+
+  va_end(args);
+
+  exit(EXIT_FAILURE);
+}
+
+static void
+memError(const char *caller, const char *file, int line, size_t size)
+{
+  fputs("\n", stdout);
+  fprintf(stderr, "Error (%s) : Allocation of %zu bytes failed. [ line %d file %s ]\n", caller, size, line, get_filename(file));
+
+  if (errno) perror("System error message ");
+
+  exit(EXIT_FAILURE);
+}
+
+static void
+memListPrintEntry(int mtype, int item, size_t size, void *ptr, const char *caller, const char *file, int line)
+{
+  fprintf(stderr, "[%-7s ", memfunc[mtype]);
+
+  fprintf(stderr, "memory item %3d ", item);
+  fprintf(stderr, "(%6zu byte) ", size);
+  fprintf(stderr, "at %p", ptr);
+  if (file != NULL)
+    {
+      fprintf(stderr, " line %4d", line);
+      fprintf(stderr, " file %s", get_filename(file));
+    }
+  if (caller != NULL) fprintf(stderr, " (%s)", caller);
+  fprintf(stderr, "]\n");
+}
+
+static void
+memListPrintTable(void)
+{
+  if (MemObjs) fprintf(stderr, "\nMemory table:\n");
+
+  for (size_t memID = 0; memID < memTableSize; memID++)
+    {
+      if (memTable[memID].item != MEM_UNDEFID)
+        memListPrintEntry(memTable[memID].mtype, memTable[memID].item, memTable[memID].size * memTable[memID].nobj,
+                          memTable[memID].ptr, memTable[memID].functionname, memTable[memID].filename, memTable[memID].line);
+    }
+
+  if (MemObjs)
+    {
+      fprintf(stderr, "  Memory access             : %6u\n", (unsigned) memAccess);
+      fprintf(stderr, "  Maximum objects           : %6zu\n", memTableSize);
+      fprintf(stderr, "  Objects used              : %6u\n", (unsigned) MaxMemObjs);
+      fprintf(stderr, "  Objects in use            : %6u\n", (unsigned) MemObjs);
+      fprintf(stderr, "  Memory allocated          : ");
+      if (MemUsed > 1024 * 1024 * 1024)
+        fprintf(stderr, " %5d GB\n", (int) (MemUsed / (1024 * 1024 * 1024)));
+      else if (MemUsed > 1024 * 1024)
+        fprintf(stderr, " %5d MB\n", (int) (MemUsed / (1024 * 1024)));
+      else if (MemUsed > 1024)
+        fprintf(stderr, " %5d KB\n", (int) (MemUsed / (1024)));
+      else
+        fprintf(stderr, " %5d Byte\n", (int) MemUsed);
+    }
+
+  if (MaxMemUsed)
+    {
+      fprintf(stderr, "  Maximum memory allocated  : ");
+      if (MaxMemUsed > 1024 * 1024 * 1024)
+        fprintf(stderr, " %5d GB\n", (int) (MaxMemUsed / (1024 * 1024 * 1024)));
+      else if (MaxMemUsed > 1024 * 1024)
+        fprintf(stderr, " %5d MB\n", (int) (MaxMemUsed / (1024 * 1024)));
+      else if (MaxMemUsed > 1024)
+        fprintf(stderr, " %5d KB\n", (int) (MaxMemUsed / (1024)));
+      else
+        fprintf(stderr, " %5d Byte\n", (int) MaxMemUsed);
+    }
+}
+
+static void
+memGetDebugLevel(void)
+{
+  const char *envstr = getenv("MEMORY_INFO");
+  if (envstr && isdigit((int) envstr[0])) MEM_Info = atoi(envstr);
+
+  envstr = getenv("MEMORY_DEBUG");
+  if (envstr && isdigit((int) envstr[0])) MEM_Debug = atoi(envstr);
+
+  if (MEM_Debug && !MEM_Info) MEM_Info = 1;
+
+  if (MEM_Info) atexit(memListPrintTable);
+}
+
+static void
+memInit(void)
+{
+  static int initDebugLevel = 0;
+
+  if (!initDebugLevel)
+    {
+      memGetDebugLevel();
+      initDebugLevel = 1;
+    }
+}
+
+static int
+memListDeleteEntry(void *ptr, size_t *size)
+{
+  int item = MEM_UNDEFID;
+  size_t memID = 0;
+
+  for (memID = 0; memID < memTableSize; memID++)
+    {
+      if (memTable[memID].item == MEM_UNDEFID) continue;
+      if (memTable[memID].ptr == ptr) break;
+    }
+
+  if (memID != memTableSize)
+    {
+      MemObjs--;
+      MemUsed -= memTable[memID].size * memTable[memID].nobj;
+      *size = memTable[memID].size * memTable[memID].nobj;
+      item = memTable[memID].item;
+      memTable[memID].item = MEM_UNDEFID;
+    }
+
+  return item;
+}
+
+static void
+memTableInitEntry(size_t memID)
+{
+  if (memID >= memTableSize) memInternalProblem(__func__, "memID %d undefined!", memID);
+
+  memTable[memID].ptr = NULL;
+  memTable[memID].item = MEM_UNDEFID;
+  memTable[memID].size = 0;
+  memTable[memID].nobj = 0;
+  memTable[memID].mtype = MEM_UNDEFID;
+  memTable[memID].line = MEM_UNDEFID;
+}
+
+static void
+set_filename(const char *file, char *memEntyFilename)
+{
+  if (file)
+    {
+      const char *filename = get_filename(file);
+      size_t len = strlen(filename);
+      if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1;
+
+      (void) memcpy(memEntyFilename, filename, len);
+      memEntyFilename[len] = '\0';
+    }
+  else
+    {
+      (void) strcpy(memEntyFilename, "unknown");
+    }
+}
+
+static void
+set_functionname(const char *functionname, char *memEntyFunctionname)
+{
+  if (functionname)
+    {
+      size_t len = strlen(functionname);
+      if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1;
+
+      (void) memcpy(memEntyFunctionname, functionname, len);
+      memEntyFunctionname[len] = '\0';
+    }
+  else
+    {
+      (void) strcpy(memEntyFunctionname, "unknown");
+    }
+}
+
+static int
+memListNewEntry(int mtype, void *ptr, size_t size, size_t nobj, const char *functionname, const char *file, int line)
+{
+  static int item = 0;
+  size_t memID = 0;
+
+  // Look for a free slot in memTable (Create the table the first time through).
+  if (memTableSize == 0)
+    {
+      memTableSize = 8;
+      size_t memSize = memTableSize * sizeof(MemTable_t);
+      memTable = (MemTable_t *) malloc(memSize);
+      if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize);
+
+      for (size_t i = 0; i < memTableSize; i++) memTableInitEntry(i);
+    }
+  else
+    {
+      while (memID < memTableSize)
+        {
+          if (memTable[memID].item == MEM_UNDEFID) break;
+          memID++;
+        }
+    }
+
+  // If the table overflows, double its size.
+  if (memID == memTableSize)
+    {
+      memTableSize = 2 * memTableSize;
+      size_t memSize = memTableSize * sizeof(MemTable_t);
+      memTable = (MemTable_t *) realloc(memTable, memSize);
+      if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize);
+
+      for (size_t i = memID; i < memTableSize; i++) memTableInitEntry(i);
+    }
+
+  memTable[memID].item = item;
+  memTable[memID].ptr = ptr;
+  memTable[memID].size = size;
+  memTable[memID].nobj = nobj;
+  memTable[memID].mtype = mtype;
+  memTable[memID].line = line;
+
+  set_filename(file, memTable[memID].filename);
+  set_functionname(functionname, memTable[memID].functionname);
+
+  MaxMemObjs++;
+  MemObjs++;
+  MemUsed += size * nobj;
+  if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed;
+
+  return item++;
+}
+
+static int
+memListChangeEntry(intptr_t ptrold, void *ptr, size_t size, const char *functionname, const char *file, int line)
+{
+  int item = MEM_UNDEFID;
+  size_t memID = 0;
+
+  while (memID < memTableSize)
+    {
+      if (memTable[memID].item != MEM_UNDEFID && (intptr_t) memTable[memID].ptr == ptrold) break;
+      memID++;
+    }
+
+  if (memID == memTableSize)
+    {
+      if ((void *) ptrold != NULL) memInternalProblem(__func__, "Item at %p not found.", ptrold);
+    }
+  else
+    {
+      item = memTable[memID].item;
+
+      size_t sizeold = memTable[memID].size * memTable[memID].nobj;
+
+      memTable[memID].ptr = ptr;
+      memTable[memID].size = size;
+      memTable[memID].nobj = 1;
+      memTable[memID].mtype = REALLOC_FUNC;
+      memTable[memID].line = line;
+
+      set_filename(file, memTable[memID].filename);
+      set_functionname(functionname, memTable[memID].functionname);
+
+      MemUsed -= sizeold;
+      MemUsed += size;
+      if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed;
+    }
+
+  return item;
+}
+
+void *
+memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line)
+{
+  void *ptr = NULL;
+
+  memInit();
+
+  if (nobjs * size > 0)
+    {
+      ptr = calloc(nobjs, size);
+
+      if (MEM_Info)
+        {
+          memAccess++;
+
+          int item = MEM_UNDEFID;
+          if (ptr) item = memListNewEntry(CALLOC_FUNC, ptr, size, nobjs, functionname, file, line);
+
+          if (MEM_Debug) memListPrintEntry(CALLOC_FUNC, item, size * nobjs, ptr, functionname, file, line);
+        }
+
+      if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size * nobjs);
+    }
+  else
+    fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file);
+
+  return ptr;
+}
+
+void *
+memMalloc(size_t size, const char *file, const char *functionname, int line)
+{
+  void *ptr = NULL;
+
+  memInit();
+
+  if (size > 0)
+    {
+      ptr = malloc(size);
+
+      if (MEM_Info)
+        {
+          memAccess++;
+
+          int item = MEM_UNDEFID;
+          if (ptr) item = memListNewEntry(MALLOC_FUNC, ptr, size, 1, functionname, file, line);
+
+          if (MEM_Debug) memListPrintEntry(MALLOC_FUNC, item, size, ptr, functionname, file, line);
+        }
+
+      if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size);
+    }
+  else
+    fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file);
+
+  return ptr;
+}
+
+void *
+memRealloc(void *ptrold, size_t size, const char *file, const char *functionname, int line)
+{
+  void *ptr = NULL;
+
+  memInit();
+
+  if (size > 0)
+    {
+      intptr_t ptrold_ = (intptr_t) ptrold;
+      ptr = realloc(ptrold, size);
+
+      if (MEM_Info)
+        {
+          memAccess++;
+
+          int item = MEM_UNDEFID;
+          if (ptr)
+            {
+              item = memListChangeEntry(ptrold_, ptr, size, functionname, file, line);
+              if (item == MEM_UNDEFID) item = memListNewEntry(REALLOC_FUNC, ptr, size, 1, functionname, file, line);
+            }
+
+          if (MEM_Debug) memListPrintEntry(REALLOC_FUNC, item, size, ptr, functionname, file, line);
+        }
+
+      if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size);
+    }
+  else
+    fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, get_filename(file));
+
+  return ptr;
+}
+
+void
+memFree(void *ptr, const char *file, const char *functionname, int line)
+{
+  memInit();
+
+  if (MEM_Info)
+    {
+      size_t size = 0;
+      int item = memListDeleteEntry(ptr, &size);
+      if (item >= 0)
+        {
+          if (MEM_Debug) memListPrintEntry(FREE_FUNC, item, size, ptr, functionname, file, line);
+        }
+      else
+        {
+          if (ptr && MEM_Debug)
+            fprintf(stderr, "%s info: memory entry at %p not found. [line %4d file %s (%s)]\n", __func__, ptr, line,
+                    get_filename(file), functionname);
+        }
+    }
+
+  free(ptr);
+}
+
+size_t
+memTotal(void)
+{
+  size_t memtotal = 0;
+#ifdef HAVE_MALLINFO
+  struct mallinfo meminfo = mallinfo();
+  if (MEM_Debug)
+    {
+      fprintf(stderr, "arena      %8zu (non-mmapped space allocated from system)\n", (size_t) meminfo.arena);
+      fprintf(stderr, "ordblks    %8zu (number of free chunks)\n", (size_t) meminfo.ordblks);
+      fprintf(stderr, "smblks     %8zu (number of fastbin blocks)\n", (size_t) meminfo.smblks);
+      fprintf(stderr, "hblks      %8zu (number of mmapped regions)\n", (size_t) meminfo.hblks);
+      fprintf(stderr, "hblkhd     %8zu (space in mmapped regions)\n", (size_t) meminfo.hblkhd);
+      fprintf(stderr, "usmblks    %8zu (maximum total allocated space)\n", (size_t) meminfo.usmblks);
+      fprintf(stderr, "fsmblks    %8zu (maximum total allocated space)\n", (size_t) meminfo.fsmblks);
+      fprintf(stderr, "uordblks   %8zu (total allocated space)\n", (size_t) meminfo.uordblks);
+      fprintf(stderr, "fordblks   %8zu (total free space)\n", (size_t) meminfo.fordblks);
+      fprintf(stderr, "Memory in use:   %8zu bytes\n", (size_t) meminfo.usmblks + (size_t) meminfo.uordblks);
+      fprintf(stderr, "Total heap size: %8zu bytes\n", (size_t) meminfo.arena);
+
+      // malloc_stats();
+    }
+
+  memtotal = (size_t) meminfo.arena;
+#endif
+
+  return memtotal;
+}
+
+void
+memExitOnError(void)
+{
+  dmemory_ExitOnError = 1;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <errno.h>
+
+#if !defined(NAMESPACE_H)
+#endif
+
+int _ExitOnError = 1;  // If set to 1, exit on error
+int _Verbose = 1;      // If set to 1, errors are reported
+int _Debug = 0;        // If set to 1, debugging
+
+/* If we're not using GNU C, elide __attribute__ */
+#if !defined __GNUC__ && !defined __attribute__
+#define __attribute__(x) /*NOTHING*/
+#endif
+
+void SysError_(const char *caller, const char *fmt, ...) __attribute__((noreturn));
+
+void
+SysError_(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+  int saved_errno = errno;
+
+  va_start(args, fmt);
+
+  printf("\n");
+  fprintf(stderr, "%s  error (%s): ", PACKAGE_NAME, caller);
+  vfprintf(stderr, fmt, args);
+  fprintf(stderr, "\n");
+
+  va_end(args);
+
+  if (saved_errno)
+    {
+      errno = saved_errno;
+      perror("System error message");
+    }
+
+  exit(EXIT_FAILURE);
+}
+
+void
+Error_(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+
+  va_start(args, fmt);
+
+  printf("\n");
+  fprintf(stderr, "%s  error (%s): ", PACKAGE_NAME, caller);
+  vfprintf(stderr, fmt, args);
+  fprintf(stderr, "\n");
+
+  va_end(args);
+
+  if (_ExitOnError) exit(EXIT_FAILURE);
+}
+
+typedef void (*cdiAbortCFunc)(const char *caller, const char *filename, const char *functionname, int line, const char *errorString,
+                              va_list ap)
+#ifdef __GNUC__
+    __attribute__((noreturn))
+#endif
+    ;
+
+void
+cdiAbortC(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, ...)
+{
+  va_list ap;
+  va_start(ap, errorString);
+  cdiAbortCFunc cdiAbortC_p = (cdiAbortCFunc) namespaceSwitchGet(NSSWITCH_ABORT).func;
+  cdiAbortC_p(caller, filename, functionname, line, errorString, ap);
+  va_end(ap);
+}
+
+void
+cdiAbortC_serial(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap)
+{
+  fprintf(stderr, "%s  error, %s, %s, line %d%s%s\nerrorString: \"", PACKAGE_NAME, functionname, filename, line,
+          caller ? ", called from " : "", caller ? caller : "");
+  vfprintf(stderr, errorString, ap);
+  fputs("\"\n", stderr);
+  exit(EXIT_FAILURE);
+}
+
+typedef void (*cdiWarningFunc)(const char *caller, const char *fmt, va_list ap);
+
+void
+Warning_(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+
+  va_start(args, fmt);
+
+  if (_Verbose)
+    {
+      cdiWarningFunc cdiWarning_p = (cdiWarningFunc) namespaceSwitchGet(NSSWITCH_WARNING).func;
+      cdiWarning_p(caller, fmt, args);
+    }
+
+  va_end(args);
+}
+
+void
+cdiWarning(const char *caller, const char *fmt, va_list ap)
+{
+  fprintf(stderr, "%s  warning (%s): ", PACKAGE_NAME, caller);
+  vfprintf(stderr, fmt, ap);
+  fputc('\n', stderr);
+}
+
+void
+Message_(const char *caller, const char *fmt, ...)
+{
+  va_list args;
+
+  va_start(args, fmt);
+
+  fprintf(stdout, "%s  %-18s: ", PACKAGE_NAME, caller);
+  vfprintf(stdout, fmt, args);
+  fprintf(stdout, "\n");
+
+  va_end(args);
+}
+
+bool
+cdiObsoleteInfo(const char *oldFunction, const char *newFunction)
+{
+  fprintf(stdout, "cdi info: Function %s() is deprecated and might be removed in the future versions of CDI.\n", oldFunction);
+  fprintf(stdout, "cdi info:    Consider switching to the new function %s() as soon as possible.\n", newFunction);
+  return false;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef EXSE_H
+#define EXSE_H
+
+enum
+{
+  EXSE_PREC_FP16 = 2,
+  EXSE_PREC_FP32 = 4,
+  EXSE_PREC_FP64 = 8,
+};
+
+#endif
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+
+enum
+{
+  EXT_HEADER_LEN = 4,
+};
+
+union EXT_HEADER
+{
+  int32_t i32[EXT_HEADER_LEN];
+  int64_t i64[EXT_HEADER_LEN];
+};
+
+static int initExtLib = 0;
+static int extDefaultPrec = 0;
+static int extDefaultNumber = EXT_REAL;
+
+// A version string.
+#undef LIBVERSION
+#define LIBVERSION 2.0.0
+#define XSTRING(x) #x
+#define STRING(x) XSTRING(x)
+static const char ext_libvers[] = STRING(LIBVERSION);
+
+const char *
+extLibraryVersion(void)
+{
+  return ext_libvers;
+}
+
+static int EXT_Debug = 0;  // If set to 1, debugging
+
+void
+extDebug(int debug)
+{
+  if (debug) Message("debug level %d", debug);
+  EXT_Debug = debug;
+}
+
+static void
+extLibInit(void)
+{
+  const char *envName = "EXT_PRECISION";
+
+  char *envString = getenv(envName);
+  if (envString)
+    {
+      if (strlen(envString) == 2)
+        {
+          switch (tolower((int) envString[0]))
+            {
+            case 'r':
+              {
+                extDefaultNumber = EXT_REAL;
+                switch ((int) envString[1])
+                  {
+                  case '2': extDefaultPrec = EXSE_PREC_FP16; break;
+                  case '4': extDefaultPrec = EXSE_PREC_FP32; break;
+                  case '8': extDefaultPrec = EXSE_PREC_FP64; break;
+                  default: Warning("Invalid digit in %s: %s", envName, envString);
+                  }
+                break;
+              }
+            case 'c':
+              {
+                extDefaultNumber = EXT_COMP;
+                switch ((int) envString[1])
+                  {
+                  case '4': extDefaultPrec = EXSE_PREC_FP32; break;
+                  case '8': extDefaultPrec = EXSE_PREC_FP64; break;
+                  default: Warning("Invalid digit in %s: %s", envName, envString);
+                  }
+                break;
+              }
+            default:
+              {
+                Warning("Invalid character in %s: %s", envName, envString);
+                break;
+              }
+            }
+        }
+    }
+
+  initExtLib = 1;
+}
+
+static void
+extInit(extrec_t *extp)
+{
+  extp->checked = 0;
+  extp->byteswap = 0;
+  extp->prec = 0;
+  extp->number = extDefaultNumber;
+  extp->datasize = 0;
+  extp->buffersize = 0;
+  extp->buffer = NULL;
+}
+
+void *
+extNew(void)
+{
+  if (!initExtLib) extLibInit();
+
+  extrec_t *extp = (extrec_t *) Malloc(sizeof(extrec_t));
+
+  extInit(extp);
+
+  return (void *) extp;
+}
+
+void
+extDelete(void *ext)
+{
+  extrec_t *extp = (extrec_t *) ext;
+
+  if (extp)
+    {
+      if (extp->buffer) Free(extp->buffer);
+      Free(extp);
+    }
+}
+
+int
+extCheckFiletype(int fileID, int *swap)
+{
+  size_t fact = 0;
+  size_t data = 0;
+  size_t dimxy = 0;
+  unsigned char buffer[40], *pbuf;
+
+  if (fileRead(fileID, buffer, 4) != 4) return 0;
+
+  size_t blocklen = (size_t) get_uint32(buffer);
+  size_t sblocklen = (size_t) get_swap_uint32(buffer);
+
+  if (EXT_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen);
+
+  // clang-format off
+  if (blocklen == 16)
+    {
+     *swap = 0;
+      fact = blocklen / 4;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+3*fact;      dimxy = (size_t) get_uint32(pbuf);
+      pbuf = buffer+blocklen+4;  data  = (size_t) get_uint32(pbuf);
+    }
+  else if (blocklen == 32)
+    {
+     *swap = 0;
+      fact = blocklen / 4;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+3*fact;      dimxy = (size_t) get_uint64(pbuf);
+      pbuf = buffer+blocklen+4;  data  = (size_t) get_uint32(pbuf);
+    }
+  else if (sblocklen == 16)
+    {
+     *swap = 1;
+      fact = sblocklen / 4;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+3*fact;       dimxy = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+sblocklen+4;  data  = (size_t) get_swap_uint32(pbuf);
+    }
+  else if (sblocklen == 32)
+    {
+     *swap = 1;
+      fact = sblocklen / 4;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+3*fact;       dimxy = (size_t) get_swap_uint64(pbuf);
+      pbuf = buffer+sblocklen+4;  data  = (size_t) get_swap_uint32(pbuf);
+    }
+  // clang-format on
+
+  fileRewind(fileID);
+
+  if (EXT_Debug) Message("swap = %d fact = %d", *swap, fact);
+  if (EXT_Debug) Message("dimxy = %lu data = %lu", dimxy, data);
+
+  int found = data && (dimxy * fact == data || dimxy * fact * 2 == data || dimxy * fact / 2 == data);
+  return found;
+}
+
+int
+extInqHeader(void *ext, int *header)
+{
+  extrec_t *extp = (extrec_t *) ext;
+
+  for (int i = 0; i < EXT_HEADER_LEN; i++) header[i] = extp->header[i];
+
+  if (EXT_Debug) Message("datasize = %zu", extp->datasize);
+
+  return 0;
+}
+
+int
+extDefHeader(void *ext, const int *header)
+{
+  extrec_t *extp = (extrec_t *) ext;
+
+  for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = header[i];
+
+  extp->datasize = (size_t) header[3];
+  if (extp->number == EXT_COMP) extp->datasize *= 2;
+
+  if (EXT_Debug) Message("datasize = %zu", extp->datasize);
+
+  return 0;
+}
+
+static int
+extInqData(extrec_t *extp, int prec, void *data)
+{
+  int ierr = 0;
+  int byteswap = extp->byteswap;
+  size_t datasize = extp->datasize, buffer_size = datasize * (size_t) prec;
+  void *buffer = extp->buffer;
+  int rprec = extp->prec;
+
+  switch (rprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (byteswap) swap4byte(buffer, datasize);
+
+        if (EXSE_PREC_FP32 == prec)
+          memcpy(data, buffer, buffer_size);
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i];
+#ifdef HAVE__FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((float *) buffer)[i];
+#endif
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (byteswap) swap8byte(buffer, datasize);
+
+        if (EXSE_PREC_FP64 == prec)
+          memcpy(data, buffer, buffer_size);
+        else if (EXSE_PREC_FP32 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i];
+#ifdef HAVE__FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((double *) buffer)[i];
+#endif
+        break;
+      }
+#ifdef HAVE__FLOAT16
+    case EXSE_PREC_FP16:
+      {
+        if (EXSE_PREC_FP16 == prec)
+          memcpy(data, buffer, buffer_size);
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((_Float16 *) buffer)[i];
+        else if (EXSE_PREC_FP32 == prec)
+          for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((_Float16 *) buffer)[i];
+
+        break;
+      }
+#endif
+    default:
+      {
+        Error("unexpected data precision %d", rprec);
+        break;
+      }
+    }
+
+  return ierr;
+}
+
+int
+extInqDataFP32(void *ext, float *data)
+{
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+extInqDataFP64(void *ext, double *data)
+{
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP64, (void *) data);
+}
+#ifdef HAVE__FLOAT16
+int
+extInqDataFP16(void *ext, _Float16 *data)
+{
+  return extInqData((extrec_t *) ext, EXSE_PREC_FP16, (void *) data);
+}
+#endif
+
+static int
+extDefData(void *ext, int prec, const void *data)
+{
+  extrec_t *extp = (extrec_t *) ext;
+
+  int rprec = extDefaultPrec ? extDefaultPrec : extp->prec;
+  extp->prec = rprec ? rprec : prec;
+
+  int *header = extp->header;
+
+  size_t datasize = (size_t) header[3];
+  if (extp->number == EXT_COMP) datasize *= 2;
+  size_t blocklen = datasize * (size_t) rprec;
+
+  extp->datasize = datasize;
+
+  if (extp->buffersize != blocklen)
+    {
+      extp->buffersize = blocklen;
+      extp->buffer = Realloc(extp->buffer, extp->buffersize);
+    }
+
+  switch (rprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (EXSE_PREC_FP32 == prec)
+          memcpy(extp->buffer, data, blocklen);
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((double *) data)[i];
+#ifdef HAVE__FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((_Float16 *) data)[i];
+#endif
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (EXSE_PREC_FP64 == prec)
+          memcpy(extp->buffer, data, blocklen);
+        else if (EXSE_PREC_FP32 == prec)
+          for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((float *) data)[i];
+#ifdef HAVE__FLOAT16
+        else if (EXSE_PREC_FP16 == prec)
+          for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((_Float16 *) data)[i];
+#endif
+        break;
+      }
+#ifdef HAVE__FLOAT16
+    case EXSE_PREC_FP16:
+      {
+        if (EXSE_PREC_FP16 == prec)
+          memcpy(extp->buffer, data, blocklen);
+        else if (EXSE_PREC_FP32 == prec)
+          for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((float *) data)[i];
+        else if (EXSE_PREC_FP64 == prec)
+          for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((double *) data)[i];
+
+        break;
+      }
+#endif
+    default:
+      {
+        Error("unexpected data precision %d", rprec);
+        break;
+      }
+    }
+
+  return 0;
+}
+
+int
+extDefDataFP32(void *ext, const float *data)
+{
+  return extDefData(ext, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+extDefDataFP64(void *ext, const double *data)
+{
+  return extDefData(ext, EXSE_PREC_FP64, (void *) data);
+}
+#ifdef HAVE__FLOAT16
+int
+extDefDataFP16(void *ext, const _Float16 *data)
+{
+  return extDefData(ext, EXSE_PREC_FP16, (void *) data);
+}
+#endif
+
+int
+extRead(int fileID, void *ext)
+{
+  extrec_t *extp = (extrec_t *) ext;
+
+  if (!extp->checked)
+    {
+      int status = extCheckFiletype(fileID, &extp->byteswap);
+      if (status == 0) Error("Not a EXTRA file!");
+      extp->checked = 1;
+    }
+
+  int byteswap = extp->byteswap;
+
+  // read header record
+  size_t blocklen = binReadF77Block(fileID, byteswap);
+
+  if (fileEOF(fileID)) return -1;
+
+  if (EXT_Debug) Message("blocklen = %lu", blocklen);
+
+  size_t hprec = blocklen / EXT_HEADER_LEN;
+  // extp->prec = (int) hprec;
+
+  union EXT_HEADER tempheader;
+  switch (hprec)
+    {
+    case EXSE_PREC_FP32:
+    case EXSE_PREC_FP16:
+      {
+        binReadInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32);
+        for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i32[i];
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        binReadInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64);
+        for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i64[i];
+        break;
+      }
+    default:
+      {
+        Error("Unexpected header precision %d", hprec);
+        break;
+      }
+    }
+
+  size_t blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2);
+      if (blocklen2 != 0) return -1;
+    }
+
+  extp->datasize = (size_t) extp->header[3];
+
+  if (EXT_Debug) Message("datasize = %zu", extp->datasize);
+
+  blocklen = binReadF77Block(fileID, byteswap);
+
+  if (extp->buffersize < blocklen)
+    {
+      extp->buffersize = blocklen;
+      extp->buffer = Realloc(extp->buffer, extp->buffersize);
+    }
+
+  size_t dprec = blocklen / extp->datasize;
+  extp->prec = (int) dprec;
+
+  if (dprec == hprec || dprec == hprec / 2)
+    {
+      extp->number = EXT_REAL;
+    }
+  else if (dprec == hprec * 2)
+    {
+      dprec /= 2;
+      extp->datasize *= 2;
+      extp->number = EXT_COMP;
+    }
+
+  if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64 && dprec != EXSE_PREC_FP16)
+    {
+      Warning("Unexpected data precision %d", dprec);
+      return -1;
+    }
+
+  fileRead(fileID, extp->buffer, blocklen);
+
+  blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2);
+      if (blocklen2 != 0) return -1;
+    }
+
+  return 0;
+}
+
+int
+extWrite(int fileID, void *ext)
+{
+  extrec_t *extp = (extrec_t *) ext;
+  union EXT_HEADER tempheader;
+  int byteswap = extp->byteswap;
+  int rprec = extp->prec;
+  int number = extp->number;
+  int *header = extp->header;
+
+  // write header record
+  size_t blocklen = EXT_HEADER_LEN * (size_t) ((rprec == EXSE_PREC_FP16) ? EXSE_PREC_FP32 : rprec);
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  switch (rprec)
+    {
+    case EXSE_PREC_FP16:
+    case EXSE_PREC_FP32:
+      {
+        for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i];
+        binWriteInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32);
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i];
+        binWriteInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64);
+        break;
+      }
+    default:
+      {
+        Error("unexpected header precision %d", rprec);
+        break;
+      }
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  extp->datasize = (size_t) header[3];
+  if (number == EXT_COMP) extp->datasize *= 2;
+  blocklen = extp->datasize * (size_t) rprec;
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  switch (rprec)
+    {
+#ifdef HAVE__FLOAT16
+    case EXSE_PREC_FP16:
+      {
+        binWriteFlt16(fileID, extp->datasize, (_Float16 *) extp->buffer);
+        break;
+      }
+#endif
+    case EXSE_PREC_FP32:
+      {
+        binWriteFlt32(fileID, byteswap, extp->datasize, (float *) extp->buffer);
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        binWriteFlt64(fileID, byteswap, extp->datasize, (double *) extp->buffer);
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", rprec);
+        break;
+      }
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  return 0;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+// strdup() from string.h
+#ifdef __STDC_ALLOC_LIB__
+#define __STDC_WANT_LIB_EXT2__ 1
+#else
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200809L
+#endif
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <unistd.h>
+
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>  // gettimeofday()
+#endif
+
+
+#ifdef CDI
+#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#ifdef HAVE_MMAP
+#include <sys/mman.h>  // mmap() is defined in this header
+#endif
+
+#ifndef SSIZE_MAX
+#define SSIZE_MAX LONG_MAX
+#endif
+
+#define MAX_FILES 8192
+static int _file_max = MAX_FILES;
+
+static void file_initialize(void);
+
+static bool _file_init = false;
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+
+static pthread_once_t _file_init_thread = PTHREAD_ONCE_INIT;
+static pthread_mutex_t _file_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#define FILE_LOCK() pthread_mutex_lock(&_file_mutex)
+#define FILE_UNLOCK() pthread_mutex_unlock(&_file_mutex)
+#define FILE_INIT() \
+  if (_file_init == false) pthread_once(&_file_init_thread, file_initialize)
+
+#else
+
+#define FILE_LOCK()
+#define FILE_UNLOCK()
+#define FILE_INIT() \
+  if (_file_init == false) file_initialize()
+#endif
+
+typedef struct
+{
+  int self;
+  int flag;            // access and error flag
+  int eof;             // end of file flag
+  int fd;              // file descriptor used for read
+  FILE *fp;            // FILE pointer used for write
+  char *name;          // file name
+  off_t size;          // file size
+  off_t position;      // file position
+  long access;         // file access
+  off_t byteTrans;     //
+  size_t blockSize;    // file block size
+  int mode;            // file access mode
+  int type;            // file type [1:open  2:fopen]
+  int bufferType;      // buffer type [1:std  2:mmap]
+  size_t bufferSize;   // file buffer size
+  size_t mappedSize;   // mmap buffer size
+  char *buffer;        // file buffer
+  long bufferNumFill;  // number of buffer fill
+  char *bufferPtr;     // file buffer pointer
+  off_t bufferPos;
+  off_t bufferStart;
+  off_t bufferEnd;
+  size_t bufferCnt;
+  double time_in_sec;
+} bfile_t;
+
+enum FILE_Flags
+{
+  FILE_EOF = 010,
+  FILE_ERROR = 020
+};
+
+#ifndef MIN_BUF_SIZE
+#define MIN_BUF_SIZE 131072L
+#endif
+
+static const char *fbtname[] = { "unknown", "standard", "mmap" };
+static const char *ftname[] = { "unknown", "open", "fopen" };
+
+static size_t FileBufferSizeMin = MIN_BUF_SIZE;
+static long FileBufferSizeEnv = -1;
+static int FileBufferTypeEnv = 0;
+
+static int FileTypeRead = FILE_TYPE_OPEN;
+static int FileTypeWrite = FILE_TYPE_FOPEN;
+static int FileFlagWrite = 0;
+
+static int FileDebug = 0;  // If set to 1, debugging
+static bool FileInfo = false;
+
+static void file_table_print(void);
+
+// A version string.
+#undef LIBVERSION
+#define LIBVERSION 1.9.1
+#define XSTRING(x) #x
+#define STRING(x) XSTRING(x)
+static const char file_libvers[] = STRING(LIBVERSION);
+
+/*
+  21/05/2004  1.3.2 set min I/O Buffersize to 128k
+  31/05/2005  1.4.0 replace fileTable by _fileList
+  26/08/2005  1.4.1 fileClose with return value
+                    checks for all fileptr
+  01/09/2005  1.5.0 thread safe version
+  06/11/2005  1.5.1 add filePtrEOF, filePtr, filePtrGetc
+  03/02/2006  1.5.2 ansi C: define getpagesize and strdupx
+  27/12/2007  1.6.0 add FILE_TYPE_FOPEN
+  24/03/2008  1.6.1 add O_BINARY if available
+                    remove default HAVE_MMAP
+                    use HAVE_STRUCT_STAT_ST_BLKSIZE
+  22/08/2010  1.7.0 refactor
+  11/11/2010  1.7.1 update for changed interface of error.h
+  02/02/2012  1.8.0 cleanup
+  16/11/2012  1.8.1 added support for unbuffered write
+  27/06/2013  1.8.2 added env. var. FILE_TYPE_WRITE (1:open; 2:fopen)
+  29/04/2020  1.9.0 fileSetPos(): refactored
+  30/04/2020  1.9.1 fileSetPos(): not initialized correctly (bug fix)
+ */
+
+typedef struct _filePtrToIdx
+{
+  int idx;
+  bfile_t *ptr;
+  struct _filePtrToIdx *next;
+} filePtrToIdx;
+
+static filePtrToIdx *_fileList = NULL;
+static filePtrToIdx *_fileAvail = NULL;
+
+static void
+file_list_new(void)
+{
+  assert(_fileList == NULL);
+
+  _fileList = (filePtrToIdx *) malloc((size_t) _file_max * sizeof(filePtrToIdx));
+}
+
+static void
+file_list_delete(void)
+{
+  if (_fileList)
+    {
+      free(_fileList);
+      _fileList = NULL;
+    }
+}
+
+static void
+file_init_pointer(void)
+{
+  for (int i = 0; i < _file_max; i++)
+    {
+      _fileList[i].next = _fileList + i + 1;
+      _fileList[i].idx = i;
+      _fileList[i].ptr = 0;
+    }
+
+  _fileList[_file_max - 1].next = 0;
+
+  _fileAvail = _fileList;
+}
+
+static bfile_t *
+file_to_pointer(int idx)
+{
+  bfile_t *fileptr = NULL;
+
+  FILE_INIT();
+
+  if (idx >= 0 && idx < _file_max)
+    {
+      FILE_LOCK();
+      fileptr = _fileList[idx].ptr;
+      FILE_UNLOCK();
+    }
+  else
+    Error("file index %d undefined!", idx);
+
+  return fileptr;
+}
+
+// Create an index from a pointer
+static int
+file_from_pointer(bfile_t *ptr)
+{
+  int idx = -1;
+
+  if (ptr)
+    {
+      FILE_LOCK();
+
+      if (_fileAvail)
+        {
+          filePtrToIdx *newptr = _fileAvail;
+          _fileAvail = _fileAvail->next;
+          newptr->next = 0;
+          idx = newptr->idx;
+          newptr->ptr = ptr;
+
+          if (FileDebug) Message("Pointer %p has idx %d from file list", ptr, idx);
+        }
+      else
+        {
+          Warning("Too many open files (limit is %d)!", _file_max);
+          idx = -2;
+        }
+
+      FILE_UNLOCK();
+    }
+  else
+    Error("Internal problem (pointer %p undefined)", ptr);
+
+  return idx;
+}
+
+static void
+file_init_entry(bfile_t *fileptr)
+{
+  fileptr->self = file_from_pointer(fileptr);
+
+  fileptr->flag = 0;
+  fileptr->fd = -1;
+  fileptr->fp = NULL;
+  fileptr->mode = 0;
+  fileptr->size = 0;
+  fileptr->name = NULL;
+  fileptr->access = 0;
+  fileptr->position = 0;
+  fileptr->byteTrans = 0;
+  fileptr->type = 0;
+  fileptr->bufferType = 0;
+  fileptr->bufferSize = 0;
+  fileptr->mappedSize = 0;
+  fileptr->buffer = NULL;
+  fileptr->bufferNumFill = 0;
+  fileptr->bufferStart = 0;
+  fileptr->bufferEnd = -1;
+  fileptr->bufferPos = 0;
+  fileptr->bufferCnt = 0;
+  fileptr->bufferPtr = NULL;
+  fileptr->time_in_sec = 0.0;
+}
+
+static bfile_t *
+file_new_entry(void)
+{
+  bfile_t *fileptr = (bfile_t *) malloc(sizeof(bfile_t));
+  if (fileptr) file_init_entry(fileptr);
+  return fileptr;
+}
+
+static void
+file_delete_entry(bfile_t *fileptr)
+{
+  int idx = fileptr->self;
+
+  FILE_LOCK();
+
+  free(fileptr);
+
+  _fileList[idx].next = _fileAvail;
+  _fileList[idx].ptr = 0;
+  _fileAvail = &_fileList[idx];
+
+  FILE_UNLOCK();
+
+  if (FileDebug) Message("Removed idx %d from file list", idx);
+}
+
+const char *
+fileLibraryVersion(void)
+{
+  return file_libvers;
+}
+
+static int
+file_pagesize(void)
+{
+#ifdef _SC_PAGESIZE
+  return (int) sysconf(_SC_PAGESIZE);
+#else
+#ifndef POSIXIO_DEFAULT_PAGESIZE
+#define POSIXIO_DEFAULT_PAGESIZE 4096
+#endif
+  return (int) POSIXIO_DEFAULT_PAGESIZE;
+#endif
+}
+
+static double
+file_time(void)
+{
+#ifdef HAVE_SYS_TIME_H
+  struct timeval mytime;
+  gettimeofday(&mytime, NULL);
+  return (double) mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6;
+#else
+  return 0;
+#endif
+}
+
+void
+fileDebug(int debug)
+{
+  FileDebug = debug;
+  if (FileDebug) Message("Debug level %d", debug);
+}
+
+void *
+filePtr(int fileID)
+{
+  return (void *) file_to_pointer(fileID);
+}
+
+static void
+file_pointer_info(const char *caller, int fileID)
+{
+  if (FileDebug)
+    {
+      fprintf(stdout, "%-18s : ", caller);
+      fprintf(stdout, "The fileID %d underlying pointer is not valid!", fileID);
+      fprintf(stdout, "\n");
+    }
+}
+
+int
+fileSetBufferType(int fileID, int type)
+{
+  int ret = 0;
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      switch (type)
+        {
+        case FILE_BUFTYPE_STD:
+        case FILE_BUFTYPE_MMAP: fileptr->bufferType = type; break;
+        default: Error("File type %d not implemented!", type);
+        }
+    }
+
+#ifndef HAVE_MMAP
+  if (type == FILE_BUFTYPE_MMAP) ret = 1;
+#endif
+
+  return ret;
+}
+
+int
+fileFlush(int fileID)
+{
+  int retval = 0;
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      FILE *fp = fileptr->fp;
+      retval = fflush(fp);
+      if (retval == 0) retval = fsync(fileno(fp));
+      if (retval != 0) retval = errno;
+    }
+
+  return retval;
+}
+
+void
+fileClearerr(int fileID)
+{
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      if (fileptr->mode != 'r') clearerr(fileptr->fp);
+    }
+}
+
+int
+filePtrEOF(void *vfileptr)
+{
+  bfile_t *fileptr = (bfile_t *) vfileptr;
+  return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0;
+}
+
+int
+fileEOF(int fileID)
+{
+  bfile_t *fileptr = file_to_pointer(fileID);
+  return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0;
+}
+
+void
+fileRewind(int fileID)
+{
+  fileSetPos(fileID, (off_t) 0, SEEK_SET);
+  fileClearerr(fileID);
+}
+
+off_t
+fileGetPos(int fileID)
+{
+  off_t filepos = 0;
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      filepos = (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) ? fileptr->position : ftell(fileptr->fp);
+    }
+
+  if (FileDebug) Message("Position %ld", filepos);
+
+  return filepos;
+}
+
+static int
+file_set_buffer_pos(bfile_t *fileptr)
+{
+  off_t position = fileptr->position;
+  if (position < fileptr->bufferStart || position > fileptr->bufferEnd)
+    {
+      fileptr->bufferPos = (fileptr->bufferType == FILE_BUFTYPE_STD) ? position : position - position % file_pagesize();
+      fileptr->bufferCnt = 0;
+      fileptr->bufferPtr = NULL;
+
+      return 1;
+    }
+
+  return 0;
+}
+
+static void
+file_check_buffer_pos(bfile_t *fileptr)
+{
+  if (fileptr->bufferPos != fileptr->bufferEnd + 1)
+    {
+      if (FileDebug) Message("Reset buffer pos from %ld to %ld", fileptr->bufferPos, fileptr->bufferEnd + 1);
+
+      fileptr->bufferPos = fileptr->bufferEnd + 1;
+    }
+}
+
+static void
+file_seek_buffer(bfile_t *fileptr, off_t offset, int whence)
+{
+  if (whence == SEEK_SET)
+    {
+      fileptr->position = offset;
+      if (!file_set_buffer_pos(fileptr))
+        {
+          file_check_buffer_pos(fileptr);
+          fileptr->bufferCnt = (size_t) (fileptr->bufferEnd - fileptr->position) + 1;
+          fileptr->bufferPtr = fileptr->buffer + fileptr->position - fileptr->bufferStart;
+        }
+    }
+  else if (whence == SEEK_CUR)
+    {
+      fileptr->position += offset;
+      if (!file_set_buffer_pos(fileptr))
+        {
+          file_check_buffer_pos(fileptr);
+          fileptr->bufferCnt -= (size_t) offset;
+          fileptr->bufferPtr += offset;
+        }
+    }
+}
+
+int
+fileSetPos(int fileID, off_t offset, int whence)
+{
+  int status = 0;
+
+  if (FileDebug) Message("Offset %8ld  Whence %3d", (long) offset, whence);
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr == 0)
+    {
+      file_pointer_info(__func__, fileID);
+      return 1;
+    }
+
+  if (whence != SEEK_SET && whence != SEEK_CUR) Error("Whence = %d not implemented", whence);
+
+  if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN)
+    file_seek_buffer(fileptr, offset, whence);
+  else
+    status = fseek(fileptr->fp, offset, whence);
+
+  if ((fileptr->position < fileptr->size) && ((fileptr->flag & FILE_EOF) != 0)) fileptr->flag -= FILE_EOF;
+
+  return status;
+}
+
+static void
+file_table_print(void)
+{
+  int lprintHeader = 1;
+
+  for (int fileID = 0; fileID < _file_max; fileID++)
+    {
+      bfile_t *fileptr = file_to_pointer(fileID);
+      if (fileptr)
+        {
+          if (lprintHeader)
+            {
+              fprintf(stderr, "\nFile table:\n");
+              fprintf(stderr, "+-----+---------+");
+              fprintf(stderr, "----------------------------------------------------+\n");
+              fprintf(stderr, "|  ID |  Mode   |");
+              fprintf(stderr, "  Name                                              |\n");
+              fprintf(stderr, "+-----+---------+");
+              fprintf(stderr, "----------------------------------------------------+\n");
+              lprintHeader = 0;
+            }
+
+          fprintf(stderr, "| %3d | ", fileID);
+
+          switch (fileptr->mode)
+            {
+            case 'r': fprintf(stderr, "read   "); break;
+            case 'w': fprintf(stderr, "write  "); break;
+            case 'a': fprintf(stderr, "append "); break;
+            default: fprintf(stderr, "unknown");
+            }
+
+          fprintf(stderr, " | %-51s|\n", fileptr->name);
+        }
+    }
+
+  if (lprintHeader == 0)
+    {
+      fprintf(stderr, "+-----+---------+");
+      fprintf(stderr, "----------------------------------------------------+\n");
+    }
+}
+
+char *
+fileInqName(int fileID)
+{
+  bfile_t *fileptr = file_to_pointer(fileID);
+  return fileptr ? fileptr->name : NULL;
+}
+
+int
+fileInqMode(int fileID)
+{
+  bfile_t *fileptr = file_to_pointer(fileID);
+  return fileptr ? fileptr->mode : 0;
+}
+
+static long
+file_getenv(const char *envName)
+{
+  long envValue = -1;
+  char *envString = getenv(envName);
+  if (envString)
+    {
+      long fact = 1;
+      for (int i = 0; i < (int) strlen(envString); i++)
+        {
+          if (!isdigit((int) envString[i]))
+            {
+              switch (tolower((int) envString[i]))
+                {
+                case 'k': fact = 1024; break;
+                case 'm': fact = 1048576; break;
+                case 'g': fact = 1073741824; break;
+                default:
+                  fact = 0;
+                  Warning("Invalid number string in %s: %s", envName, envString);
+                  Warning("%s must comprise only digits [0-9].", envName);
+                }
+              break;
+            }
+        }
+
+      if (fact) envValue = fact * atol(envString);
+
+      if (FileDebug) Message("Set %s to %ld", envName, envValue);
+    }
+
+  return envValue;
+}
+
+static void
+file_initialize(void)
+{
+  long value;
+
+  FileInfo = (file_getenv("FILE_INFO") > 0);
+
+  value = file_getenv("FILE_DEBUG");
+  if (value >= 0) FileDebug = (int) value;
+
+  value = file_getenv("FILE_MAX");
+  if (value >= 0) _file_max = (int) value;
+
+  if (FileInfo) fprintf(stderr, "FILE_MAX = %d\n", _file_max);
+
+  value = file_getenv("FILE_BUFSIZE");
+  if (value >= 0)
+    FileBufferSizeEnv = value;
+  else
+    {
+      value = file_getenv("GRIB_API_IO_BUFFER_SIZE");
+      if (value >= 0) FileBufferSizeEnv = value;
+    }
+
+  if (FileInfo) fprintf(stderr, "FILE_BUFSIZE = %ld\n", FileBufferSizeEnv);
+
+  value = file_getenv("FILE_TYPE_READ");
+  if (value > 0)
+    {
+      switch (value)
+        {
+        case FILE_TYPE_OPEN:
+        case FILE_TYPE_FOPEN: FileTypeRead = (int) value; break;
+        default: Warning("File type %ld not implemented!", value);
+        }
+    }
+
+  if (FileInfo)
+    fprintf(stderr, "FILE_TYPE_READ = %d [%d:%s  %d:%s]\n", FileTypeRead, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN,
+            ftname[FILE_TYPE_FOPEN]);
+
+  value = file_getenv("FILE_TYPE_WRITE");
+  if (value > 0)
+    {
+      switch (value)
+        {
+        case FILE_TYPE_OPEN:
+        case FILE_TYPE_FOPEN: FileTypeWrite = (int) value; break;
+        default: Warning("File type %ld not implemented!", value);
+        }
+    }
+
+  if (FileInfo)
+    fprintf(stderr, "FILE_TYPE_WRITE = %d [%d:%s  %d:%s]\n", FileTypeWrite, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN,
+            ftname[FILE_TYPE_FOPEN]);
+
+#ifdef O_NONBLOCK
+  FileFlagWrite = O_NONBLOCK;
+#endif
+  char *envString = getenv("FILE_FLAG_WRITE");
+  if (envString)
+    {
+#ifdef O_NONBLOCK
+      if (strcmp(envString, "NONBLOCK") == 0) FileFlagWrite = O_NONBLOCK;
+#endif
+    }
+
+  value = file_getenv("FILE_BUFTYPE");
+#ifndef HAVE_MMAP
+  if (value == FILE_BUFTYPE_MMAP)
+    {
+      Warning("MMAP not available!");
+      value = 0;
+    }
+#endif
+  if (value > 0)
+    {
+      switch (value)
+        {
+        case FILE_BUFTYPE_STD:
+        case FILE_BUFTYPE_MMAP: FileBufferTypeEnv = (int) value; break;
+        default: Warning("File buffer type %ld not implemented!", value);
+        }
+    }
+
+  if (FileInfo)
+    fprintf(stderr, "FILE_BUFTYPE = %d [%d:%s  %d:%s]\n", FileBufferTypeEnv, FILE_BUFTYPE_STD, fbtname[FILE_BUFTYPE_STD],
+            FILE_BUFTYPE_MMAP, fbtname[FILE_BUFTYPE_MMAP]);
+
+  file_list_new();
+  atexit(file_list_delete);
+
+  FILE_LOCK();
+  file_init_pointer();
+  FILE_UNLOCK();
+
+  if (FileDebug) atexit(file_table_print);
+
+  _file_init = true;
+}
+
+static size_t
+file_get_buffersize(bfile_t *fileptr)
+{
+  size_t buffersize = 0;
+
+  if (FileBufferSizeEnv >= 0)
+    buffersize = (size_t) FileBufferSizeEnv;
+  else if (fileptr->bufferSize > 0)
+    buffersize = fileptr->bufferSize;
+  else
+    {
+      buffersize = fileptr->blockSize * 4;
+      if (buffersize < FileBufferSizeMin) buffersize = FileBufferSizeMin;
+    }
+
+  return buffersize;
+}
+
+static void
+file_set_buffer(bfile_t *fileptr)
+{
+  size_t buffersize = 0;
+
+  if (fileptr->mode == 'r')
+    {
+      if (FileBufferTypeEnv)
+        fileptr->bufferType = FileBufferTypeEnv;
+      else if (fileptr->bufferType == 0)
+        fileptr->bufferType = FILE_BUFTYPE_STD;
+
+      buffersize = file_get_buffersize(fileptr);
+
+      if ((size_t) fileptr->size < buffersize) buffersize = (size_t) fileptr->size;
+
+      if (fileptr->bufferType == FILE_BUFTYPE_MMAP)
+        {
+          size_t blocksize = (size_t) file_pagesize();
+          size_t minblocksize = 4 * blocksize;
+          buffersize = buffersize - buffersize % minblocksize;
+
+          if (buffersize < (size_t) fileptr->size && buffersize < minblocksize) buffersize = minblocksize;
+        }
+
+      if (buffersize == 0) buffersize = 1;
+    }
+  else
+    {
+      fileptr->bufferType = FILE_BUFTYPE_STD;
+      buffersize = file_get_buffersize(fileptr);
+    }
+
+  if (fileptr->bufferType == FILE_BUFTYPE_STD || fileptr->type == FILE_TYPE_FOPEN)
+    {
+      if (buffersize > 0)
+        {
+          fileptr->buffer = (char *) malloc(buffersize);
+          if (fileptr->buffer == NULL) SysError("Allocation of file buffer failed!");
+        }
+    }
+
+  if (fileptr->type == FILE_TYPE_FOPEN)
+    if (setvbuf(fileptr->fp, fileptr->buffer, fileptr->buffer ? _IOFBF : _IONBF, buffersize)) SysError("setvbuf failed!");
+
+  fileptr->bufferSize = buffersize;
+}
+
+static int
+file_fill_buffer(bfile_t *fileptr)
+{
+  ssize_t nread;
+  long offset = 0;
+
+  if (FileDebug) Message("file ptr = %p  Cnt = %ld", fileptr, fileptr->bufferCnt);
+
+  if ((fileptr->flag & FILE_EOF) != 0) return EOF;
+
+  if (fileptr->buffer == NULL) file_set_buffer(fileptr);
+
+  if (fileptr->bufferSize == 0) return EOF;
+
+  int fd = fileptr->fd;
+
+#ifdef HAVE_MMAP
+  if (fileptr->bufferType == FILE_BUFTYPE_MMAP)
+    {
+      if (fileptr->bufferPos >= fileptr->size)
+        {
+          nread = 0;
+        }
+      else
+        {
+#ifdef CDI
+          xassert(fileptr->bufferSize <= SSIZE_MAX);
+#endif
+          nread = (ssize_t) fileptr->bufferSize;
+          if ((nread + fileptr->bufferPos) > fileptr->size) nread = fileptr->size - fileptr->bufferPos;
+
+          if (fileptr->buffer)
+            {
+              int ret = munmap(fileptr->buffer, fileptr->mappedSize);
+              if (ret == -1) SysError("munmap error for read %s", fileptr->name);
+              fileptr->buffer = NULL;
+            }
+
+          fileptr->mappedSize = (size_t) nread;
+
+          fileptr->buffer = (char *) mmap(NULL, (size_t) nread, PROT_READ, MAP_PRIVATE, fd, fileptr->bufferPos);
+
+          if (fileptr->buffer == MAP_FAILED) SysError("mmap error for read %s", fileptr->name);
+
+          offset = fileptr->position - fileptr->bufferPos;
+        }
+    }
+  else
+#endif
+    {
+      off_t retseek = lseek(fileptr->fd, fileptr->bufferPos, SEEK_SET);
+      if (retseek == (off_t) -1) SysError("lseek error at pos %ld file %s", (long) fileptr->bufferPos, fileptr->name);
+
+      nread = read(fd, fileptr->buffer, fileptr->bufferSize);
+      if (nread > 0) offset = fileptr->position - fileptr->bufferPos;
+    }
+
+  if (nread <= 0)
+    {
+      fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR;
+      fileptr->bufferCnt = 0;
+      return EOF;
+    }
+
+  fileptr->bufferPtr = fileptr->buffer;
+  fileptr->bufferCnt = (size_t) nread;
+
+  fileptr->bufferStart = fileptr->bufferPos;
+  fileptr->bufferPos += nread;
+  fileptr->bufferEnd = fileptr->bufferPos - 1;
+
+  if (FileDebug)
+    {
+      Message("fileID = %d  Val     = %d", fileptr->self, (int) fileptr->buffer[0]);
+      Message("fileID = %d  Start   = %ld", fileptr->self, fileptr->bufferStart);
+      Message("fileID = %d  End     = %ld", fileptr->self, fileptr->bufferEnd);
+      Message("fileID = %d  nread   = %ld", fileptr->self, nread);
+      Message("fileID = %d  offset  = %ld", fileptr->self, offset);
+      Message("fileID = %d  Pos     = %ld", fileptr->self, fileptr->bufferPos);
+      Message("fileID = %d  postion = %ld", fileptr->self, fileptr->position);
+    }
+
+  if (offset > 0)
+    {
+      if (offset > nread) Error("Internal problem with buffer handling. nread = %d offset = %d", nread, offset);
+
+      fileptr->bufferPtr += offset;
+      fileptr->bufferCnt -= (size_t) offset;
+    }
+
+  fileptr->bufferNumFill++;
+
+  return (unsigned char) *fileptr->bufferPtr;
+}
+
+static void
+file_copy_from_buffer(bfile_t *fileptr, void *ptr, size_t size)
+{
+  if (FileDebug) Message("size = %ld  Cnt = %ld", size, fileptr->bufferCnt);
+
+  if (fileptr->bufferCnt < size) Error("Buffer too small. bufferCnt = %d", fileptr->bufferCnt);
+
+  if (size == 1)
+    {
+      ((char *) ptr)[0] = fileptr->bufferPtr[0];
+
+      fileptr->bufferPtr++;
+      fileptr->bufferCnt--;
+    }
+  else
+    {
+      memcpy(ptr, fileptr->bufferPtr, size);
+
+      fileptr->bufferPtr += size;
+      fileptr->bufferCnt -= size;
+    }
+}
+
+static size_t
+file_read_from_buffer(bfile_t *fileptr, void *ptr, size_t size)
+{
+  size_t nread;
+  size_t offset = 0;
+
+  if (FileDebug) Message("size = %ld  Cnt = %ld", size, (long) fileptr->bufferCnt);
+
+  if (((long) fileptr->bufferCnt) < 0L) Error("Internal problem. bufferCnt = %ld", (long) fileptr->bufferCnt);
+
+  size_t rsize = size;
+
+  while (fileptr->bufferCnt < rsize)
+    {
+      nread = fileptr->bufferCnt;
+      // fprintf(stderr, "rsize = %d nread = %d\n", (int) rsize, (int) nread);
+      if (nread > (size_t) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread);
+      offset += nread;
+      rsize = (nread < rsize) ? rsize - nread : 0;
+
+      if (file_fill_buffer(fileptr) == EOF) break;
+    }
+
+  nread = size - offset;
+
+  if (fileptr->bufferCnt < nread) nread = fileptr->bufferCnt;
+
+  if (nread > (unsigned) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread);
+
+  return (nread + offset);
+}
+
+void
+fileSetBufferSize(int fileID, long buffersize)
+{
+#ifdef CDI
+  xassert(buffersize >= 0);
+#endif
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr) fileptr->bufferSize = (size_t) buffersize;
+}
+
+/*
+ *   Open a file. Returns file ID, or -1 on error
+ */
+int
+fileOpen(const char *filename, const char *mode)
+#ifdef CDI
+{
+  int (*myFileOpen)(const char *filename, const char *mode)
+      = (int (*)(const char *, const char *)) namespaceSwitchGet(NSSWITCH_FILE_OPEN).func;
+  return myFileOpen(filename, mode);
+}
+
+int
+fileOpen_serial(const char *filename, const char *mode)
+#endif
+{
+  FILE *fp = NULL;  // file pointer    (used for write)
+  int fd = -1;      // file descriptor (used for read)
+  int fileID = FILE_UNDEFID;
+  struct stat filestat;
+  bfile_t *fileptr = NULL;
+
+  FILE_INIT();
+
+  int fmode = tolower((int) mode[0]);
+
+  switch (fmode)
+    {
+    case 'r':
+      if (FileTypeRead == FILE_TYPE_FOPEN)
+        fp = fopen(filename, "rb");
+      else
+        fd = open(filename, O_RDONLY | O_BINARY);
+      break;
+    case 'x': fp = fopen(filename, "rb"); break;
+    case 'w':
+      if (FileTypeWrite == FILE_TYPE_FOPEN)
+        fp = fopen(filename, "wb");
+      else
+        fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY | FileFlagWrite, 0666);
+      break;
+    case 'a': fp = fopen(filename, "ab"); break;
+    default: Error("Mode %c unexpected!", fmode);
+    }
+
+  if (FileDebug && fp == NULL && fd == -1) Message("Open failed on %s mode %c errno %d", filename, fmode, errno);
+
+  if (fp)
+    {
+      if (stat(filename, &filestat) != 0) return fileID;
+
+      fileptr = file_new_entry();
+      if (fileptr)
+        {
+          fileID = fileptr->self;
+          fileptr->fp = fp;
+        }
+    }
+  else if (fd >= 0)
+    {
+      if (fstat(fd, &filestat) != 0) return fileID;
+
+      fileptr = file_new_entry();
+      if (fileptr)
+        {
+          fileID = fileptr->self;
+          fileptr->fd = fd;
+        }
+    }
+
+  if (fileID >= 0)
+    {
+      fileptr->mode = fmode;
+      fileptr->name = strdup(filename);
+
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+      fileptr->blockSize = (size_t) filestat.st_blksize;
+#else
+      fileptr->blockSize = (size_t) 4096;
+#endif
+
+      // clang-format off
+      if      (fmode == 'r') fileptr->type = FileTypeRead;
+      else if (fmode == 'w') fileptr->type = FileTypeWrite;
+      else                   fileptr->type = FILE_TYPE_FOPEN;
+      // clang-format on
+
+      if (fmode == 'r') fileptr->size = filestat.st_size;
+
+      // if (fileptr->type == FILE_TYPE_FOPEN) file_set_buffer(fileptr);
+      file_set_buffer(fileptr);
+
+      if (FileDebug) Message("File %s opened with ID %d", filename, fileID);
+    }
+
+  return fileID;
+}
+
+/*
+ *   Close a file.
+ */
+int
+fileClose(int fileID)
+#ifdef CDI
+{
+  int (*myFileClose)(int fileID) = (int (*)(int)) namespaceSwitchGet(NSSWITCH_FILE_CLOSE).func;
+  return myFileClose(fileID);
+}
+
+int
+fileClose_serial(int fileID)
+#endif
+{
+  double rout = 0;
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr == NULL)
+    {
+      file_pointer_info(__func__, fileID);
+      return 1;
+    }
+
+  const char *name = fileptr->name;
+
+  if (FileDebug) Message("fileID = %d  filename = %s", fileID, name);
+
+  if (FileInfo)
+    {
+      fprintf(stderr, "____________________________________________\n");
+      fprintf(stderr, " file ID          : %d\n", fileID);
+      fprintf(stderr, " file name        : %s\n", fileptr->name);
+      fprintf(stderr, " file type        : %d (%s)\n", fileptr->type, ftname[fileptr->type]);
+
+      if (fileptr->type == FILE_TYPE_FOPEN)
+        fprintf(stderr, " file pointer     : %p\n", (void *) fileptr->fp);
+      else
+        {
+          fprintf(stderr, " file descriptor  : %d\n", fileptr->fd);
+          fprintf(stderr, " file flag        : %d\n", FileFlagWrite);
+        }
+      fprintf(stderr, " file mode        : %c\n", fileptr->mode);
+
+      if (sizeof(off_t) > sizeof(long))
+        {
+#ifdef _WIN32
+          fprintf(stderr, " file size        : %I64d\n", (long long) fileptr->size);
+          if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position    : %I64d\n", (long long) fileptr->position);
+          fprintf(stderr, " bytes transfered : %I64d\n", (long long) fileptr->byteTrans);
+#else
+          fprintf(stderr, " file size        : %lld\n", (long long) fileptr->size);
+          if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position    : %lld\n", (long long) fileptr->position);
+          fprintf(stderr, " bytes transfered : %lld\n", (long long) fileptr->byteTrans);
+#endif
+        }
+      else
+        {
+          fprintf(stderr, " file size        : %ld\n", (long) fileptr->size);
+          if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position    : %ld\n", (long) fileptr->position);
+          fprintf(stderr, " bytes transfered : %ld\n", (long) fileptr->byteTrans);
+        }
+
+      if (fileptr->time_in_sec > 0) rout = (double) fileptr->byteTrans / (1024. * 1024. * fileptr->time_in_sec);
+
+      fprintf(stderr, " wall time [s]    : %.2f\n", fileptr->time_in_sec);
+      fprintf(stderr, " data rate [MB/s] : %.1f\n", rout);
+
+      fprintf(stderr, " file access      : %ld\n", fileptr->access);
+      if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN)
+        {
+          fprintf(stderr, " buffer type      : %d (%s)\n", fileptr->bufferType, fbtname[fileptr->bufferType]);
+          fprintf(stderr, " num buffer fill  : %ld\n", fileptr->bufferNumFill);
+        }
+      fprintf(stderr, " buffer size      : %lu\n", (unsigned long) fileptr->bufferSize);
+      fprintf(stderr, " block size       : %lu\n", (unsigned long) fileptr->blockSize);
+      fprintf(stderr, " page size        : %d\n", file_pagesize());
+      fprintf(stderr, "--------------------------------------------\n");
+    }
+
+  if (fileptr->type == FILE_TYPE_FOPEN)
+    {
+      if (fclose(fileptr->fp) == EOF) SysError("EOF returned for close of %s!", name);
+    }
+  else
+    {
+#ifdef HAVE_MMAP
+      if (fileptr->buffer && fileptr->mappedSize)
+        {
+          if (munmap(fileptr->buffer, fileptr->mappedSize) == -1) SysError("munmap error for close %s", fileptr->name);
+          fileptr->buffer = NULL;
+        }
+#endif
+      if (close(fileptr->fd) == -1) SysError("EOF returned for close of %s!", name);
+    }
+
+  if (fileptr->name) free((void *) fileptr->name);
+  if (fileptr->buffer) free((void *) fileptr->buffer);
+
+  file_delete_entry(fileptr);
+
+  return 0;
+}
+
+int
+filePtrGetc(void *vfileptr)
+{
+  int ivalue = EOF;
+
+  bfile_t *fileptr = (bfile_t *) vfileptr;
+  if (fileptr)
+    {
+      if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN)
+        {
+          int fillret = (fileptr->bufferCnt == 0) ? file_fill_buffer(fileptr) : 0;
+          if (fillret >= 0)
+            {
+              ivalue = (unsigned char) *fileptr->bufferPtr++;
+              fileptr->bufferCnt--;
+              fileptr->position++;
+
+              fileptr->byteTrans++;
+              fileptr->access++;
+            }
+        }
+      else
+        {
+          ivalue = fgetc(fileptr->fp);
+          if (ivalue >= 0)
+            {
+              fileptr->byteTrans++;
+              fileptr->access++;
+            }
+          else
+            fileptr->flag |= FILE_EOF;
+        }
+    }
+
+  return ivalue;
+}
+
+int
+fileGetc(int fileID)
+{
+  bfile_t *fileptr = file_to_pointer(fileID);
+  return filePtrGetc((void *) fileptr);
+}
+
+size_t
+filePtrRead(void *vfileptr, void *restrict ptr, size_t size)
+{
+  size_t nread = 0;
+
+  bfile_t *fileptr = (bfile_t *) vfileptr;
+  if (fileptr)
+    {
+      if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN)
+        {
+          nread = file_read_from_buffer(fileptr, ptr, size);
+        }
+      else
+        {
+          nread = fread(ptr, 1, size, fileptr->fp);
+          if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR;
+        }
+
+      fileptr->position += (off_t) nread;
+      fileptr->byteTrans += (off_t) nread;
+      fileptr->access++;
+    }
+
+  if (FileDebug) Message("size %ld  nread %ld", size, nread);
+
+  return nread;
+}
+
+size_t
+fileRead(int fileID, void *restrict ptr, size_t size)
+{
+  size_t nread = 0;
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      double t_begin = 0.0;
+
+      if (FileInfo) t_begin = file_time();
+
+      if (fileptr->type == FILE_TYPE_OPEN)
+        {
+          nread = file_read_from_buffer(fileptr, ptr, size);
+        }
+      else
+        {
+          nread = fread(ptr, 1, size, fileptr->fp);
+          if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR;
+        }
+
+      if (FileInfo) fileptr->time_in_sec += file_time() - t_begin;
+
+      fileptr->position += (off_t) nread;
+      fileptr->byteTrans += (off_t) nread;
+      fileptr->access++;
+    }
+
+  if (FileDebug) Message("size %ld  nread %ld", size, nread);
+
+  return nread;
+}
+
+size_t
+fileWrite(int fileID, const void *restrict ptr, size_t size)
+{
+  size_t nwrite = 0;
+
+  bfile_t *fileptr = file_to_pointer(fileID);
+  if (fileptr)
+    {
+      double t_begin = 0.0;
+
+      if (FileInfo) t_begin = file_time();
+
+      if (fileptr->type == FILE_TYPE_FOPEN)
+        {
+          nwrite = fwrite(ptr, 1, size, fileptr->fp);
+        }
+      else
+        {
+          ssize_t temp = write(fileptr->fd, ptr, size);
+          if (temp == -1) perror("error writing to file");
+          nwrite = (temp == -1) ? 0 : (size_t) temp;
+        }
+
+      if (FileInfo) fileptr->time_in_sec += file_time() - t_begin;
+
+      fileptr->position += (off_t) nwrite;
+      fileptr->byteTrans += (off_t) nwrite;
+      fileptr->access++;
+    }
+
+  return nwrite;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <float.h>
+#include <math.h>
+
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880168872420969808
+#endif
+
+static void
+cpledn(size_t kn, size_t kodd, const double *pfn, double pdx, int kflag, double *pw, double *pdxn, double *pxmod)
+{
+  // 1.0 Newton iteration step
+
+  double zdlx = pdx;
+  double zdlldn = 0.0;
+
+  size_t ik = 1;
+
+  if (kflag == 0)
+    {
+      double zdlk = 0.5 * pfn[0];
+      for (size_t jn = 2 - kodd; jn <= kn; jn += 2)
+        {
+          // normalised ordinary Legendre polynomial == \overbar{p_n}^0
+          zdlk = zdlk + pfn[ik] * cos((double) (jn) *zdlx);
+          // normalised derivative == d/d\theta(\overbar{p_n}^0)
+          zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx);
+          ik++;
+        }
+      // Newton method
+      double zdlmod = -(zdlk / zdlldn);
+      double zdlxn = zdlx + zdlmod;
+      *pdxn = zdlxn;
+      *pxmod = zdlmod;
+    }
+
+  // 2.0 Compute weights
+
+  if (kflag == 1)
+    {
+      for (size_t jn = 2 - kodd; jn <= kn; jn += 2)
+        {
+          // normalised derivative
+          zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx);
+          ik++;
+        }
+      *pw = (double) (2 * kn + 1) / (zdlldn * zdlldn);
+    }
+}
+
+static void
+gawl(double *pfn, double *pl, double *pw, size_t kn)
+{
+  double pmod = 0.0;
+  double zw = 0.0;
+  double zdlxn = 0.0;
+
+  // 1.0 Initizialization
+
+  int iflag = 0;
+  int itemax = 20;
+
+  size_t iodd = (kn % 2);
+
+  double zdlx = *pl;
+
+  // 2.0 Newton iteration
+
+  for (int jter = 1; jter <= itemax + 1; ++jter)
+    {
+      cpledn(kn, iodd, pfn, zdlx, iflag, &zw, &zdlxn, &pmod);
+      zdlx = zdlxn;
+      if (iflag == 1) break;
+      if (fabs(pmod) <= DBL_EPSILON * 1000.0) iflag = 1;
+    }
+
+  *pl = zdlxn;
+  *pw = zw;
+}
+
+static void
+gauaw(size_t kn, double *restrict pl, double *restrict pw)
+{
+  /*
+   * 1.0 Initialize Fourier coefficients for ordinary Legendre polynomials
+   *
+   * Belousov, Swarztrauber, and ECHAM use zfn(0,0) = sqrt(2)
+   * IFS normalisation chosen to be 0.5*Integral(Pnm**2) = 1 (zfn(0,0) = 2.0)
+   */
+  double *zfn = (double *) malloc((kn + 1) * (kn + 1) * sizeof(double));
+  double *zfnlat = (double *) malloc((kn / 2 + 1 + 1) * sizeof(double));
+
+  zfn[0] = M_SQRT2;
+  for (size_t jn = 1; jn <= kn; ++jn)
+    {
+      double zfnn = zfn[0];
+      for (size_t jgl = 1; jgl <= jn; ++jgl)
+        {
+          zfnn *= sqrt(1.0 - 0.25 / ((double) (jgl * jgl)));
+        }
+
+      zfn[jn * (kn + 1) + jn] = zfnn;
+
+      size_t iodd = jn % 2;
+      for (size_t jgl = 2; jgl <= jn - iodd; jgl += 2)
+        {
+          zfn[jn * (kn + 1) + jn - jgl] = zfn[jn * (kn + 1) + jn - jgl + 2] * ((double) ((jgl - 1) * (2 * jn - jgl + 2)))
+                                          / ((double) (jgl * (2 * jn - jgl + 1)));
+        }
+    }
+
+  // 2.0 Gaussian latitudes and weights
+
+  size_t iodd = kn % 2;
+  size_t ik = iodd;
+  for (size_t jgl = iodd; jgl <= kn; jgl += 2)
+    {
+      zfnlat[ik] = zfn[kn * (kn + 1) + jgl];
+      ik++;
+    }
+
+  // 2.1 Find first approximation of the roots of the Legendre polynomial of degree kn
+
+  size_t ins2 = kn / 2 + (kn % 2);
+
+  for (size_t jgl = 1; jgl <= ins2; ++jgl)
+    {
+      double z = ((double) (4 * jgl - 1)) * M_PI / ((double) (4 * kn + 2));
+      pl[jgl - 1] = z + 1.0 / (tan(z) * ((double) (8 * kn * kn)));
+    }
+
+  // 2.2 Computes roots and weights for transformed theta
+
+  for (size_t jgl = ins2; jgl >= 1; --jgl)
+    {
+      size_t jglm1 = jgl - 1;
+      gawl(zfnlat, &(pl[jglm1]), &(pw[jglm1]), kn);
+    }
+
+  // convert to physical latitude
+
+  for (size_t jgl = 0; jgl < ins2; ++jgl) pl[jgl] = cos(pl[jgl]);
+
+  for (size_t jgl = 1; jgl <= kn / 2; ++jgl)
+    {
+      size_t jglm1 = jgl - 1;
+      size_t isym = kn - jgl;
+      pl[isym] = -pl[jglm1];
+      pw[isym] = pw[jglm1];
+    }
+
+  free(zfnlat);
+  free(zfn);
+}
+
+void
+gaussianLatitudes(size_t nlats, double *latitudes, double *weights)
+{
+  gauaw(nlats, latitudes, weights);
+}
+
+bool
+isGaussianLatitudes(size_t nlats, const double *latitudes)
+{
+  bool is_gauss_lats = false;
+
+  if (nlats > 2)  // check if gaussian
+    {
+      size_t i;
+      double *yv = (double *) malloc(nlats * sizeof(double));
+      double *yw = (double *) malloc(nlats * sizeof(double));
+      gaussianLatitudes(nlats, yv, yw);
+      free(yw);
+
+      for (i = 0; i < nlats; i++) yv[i] = asin(yv[i]) / M_PI * 180.0;
+
+      for (i = 0; i < nlats; i++)
+        if (fabs(yv[i] - latitudes[i]) > ((yv[0] - yv[1]) / 500.0)) break;
+
+      if (i == nlats) is_gauss_lats = true;
+
+      // check S->N
+      if (is_gauss_lats == false)
+        {
+          for (i = 0; i < nlats; i++)
+            if (fabs(yv[i] - latitudes[nlats - i - 1]) > ((yv[0] - yv[1]) / 500.0)) break;
+
+          if (i == nlats) is_gauss_lats = true;
+        }
+
+      free(yv);
+    }
+
+  return is_gauss_lats;
+}
+#ifndef GET_NUM_MISSVALS_H
+#define GET_NUM_MISSVALS_H
+
+#include <stddef.h>
+
+size_t get_num_missvalsSP(size_t size, float *data, float missval);
+size_t get_num_missvalsDP(size_t size, double *data, double missval);
+size_t get_cplx_num_missvalsSP(size_t size, float *data, float missval);
+size_t get_cplx_num_missvalsDP(size_t size, double *data, double missval);
+
+#endif
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+size_t
+get_num_missvalsSP(size_t size, float *data, float missval)
+{
+  size_t numMissVals = 0;
+
+  if (DBL_IS_NAN(missval))
+    {
+      for (size_t i = 0; i < size; i++)
+        if (DBL_IS_EQUAL(data[i], missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+  else
+    {
+      for (size_t i = 0; i < size; i++)
+        if (IS_EQUAL(data[i], missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+
+  return numMissVals;
+}
+
+size_t
+get_num_missvalsDP(size_t size, double *data, double missval)
+{
+  size_t numMissVals = 0;
+
+  if (DBL_IS_NAN(missval))
+    {
+      for (size_t i = 0; i < size; i++)
+        if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+  else
+    {
+      for (size_t i = 0; i < size; i++)
+        if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+
+  return numMissVals;
+}
+
+size_t
+get_cplx_num_missvalsSP(size_t size, float *data, float missval)
+{
+  size_t numMissVals = 0;
+
+  if (DBL_IS_NAN(missval))
+    {
+      for (size_t i = 0; i < 2 * size; i += 2)
+        if (DBL_IS_EQUAL(data[i], missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+  else
+    {
+      for (size_t i = 0; i < 2 * size; i += 2)
+        if (IS_EQUAL(data[i], missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+
+  return numMissVals;
+}
+
+size_t
+get_cplx_num_missvalsDP(size_t size, double *data, double missval)
+{
+  size_t numMissVals = 0;
+
+  if (DBL_IS_NAN(missval))
+    {
+      for (size_t i = 0; i < 2 * size; i += 2)
+        if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+  else
+    {
+      for (size_t i = 0; i < 2 * size; i += 2)
+        if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval))
+          {
+            data[i] = missval;
+            numMissVals++;
+          }
+    }
+
+  return numMissVals;
+}
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+#include <grib_api.h>
+#endif
+
+#include <stdio.h>
+
+
+static char gribapi_libvers[64] = "";
+#ifdef HAVE_LIBGRIB_API
+static bool gribapi_libvers_init;
+#endif
+
+void
+gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version)
+{
+#ifdef HAVE_LIBGRIB_API
+  long version = grib_get_api_version();
+  (*major_version) = (int) (version / 10000);
+  (*minor_version) = (int) ((version - (*major_version) * 10000) / 100);
+  (*revision_version) = (int) (version - (*major_version) * 10000 - (*minor_version) * 100);
+#else
+  (*major_version) = 0;
+  (*minor_version) = 0;
+  (*revision_version) = 0;
+#endif
+}
+
+const char *
+gribapiLibraryVersionString(void)
+{
+#ifdef HAVE_LIBGRIB_API
+  if (!gribapi_libvers_init)
+    {
+      int major_version, minor_version, revision_version;
+      gribapiLibraryVersion(&major_version, &minor_version, &revision_version);
+
+      snprintf(gribapi_libvers, sizeof(gribapi_libvers), "%d.%d.%d", major_version, minor_version, revision_version);
+      gribapi_libvers_init = true;
+    }
+#endif
+
+  return gribapi_libvers;
+}
+
+void *
+gribHandleNew(int editionNumber)
+{
+#ifdef HAVE_LIBGRIB_API
+  grib_handle *gh = NULL;
+  const char *fname = (editionNumber == 1) ? CDI_GRIB1_Template : CDI_GRIB2_Template;
+  if (fname)
+    {
+      FILE *fp = fopen(fname, "r");
+      if (fp)
+        {
+          int error;
+          gh = grib_handle_new_from_file(NULL, fp, &error);
+          fclose(fp);
+          if (gh == NULL) Error("grib_handle_new_from_file failed!");
+        }
+      else
+        {
+          Error("Open failed on >%s<!", fname);
+        }
+    }
+
+  if (gh == NULL)
+    {
+      gh = grib_handle_new_from_samples(NULL, (editionNumber == 1) ? "GRIB1" : "GRIB2");
+      if (gh == NULL) Error("grib_handle_new_from_samples failed!");
+
+      if (editionNumber == 1) GRIB_CHECK(my_grib_set_long(gh, "deleteLocalDefinition", 1L), 0);
+      if (editionNumber == 2) GRIB_CHECK(my_grib_set_long(gh, "grib2LocalSectionPresent", 0L), 0);
+      if (editionNumber == 2) GRIB_CHECK(my_grib_set_long(gh, "numberOfValues", 0L), 0);
+    }
+
+  return gh;
+#else
+  (void) editionNumber;
+  return NULL;
+#endif
+}
+
+void
+gribHandleDelete(void *gh)
+{
+#ifdef HAVE_LIBGRIB_API
+  grib_handle_delete((struct grib_handle *) gh);
+#else
+  (void) gh;
+#endif
+}
+
+void
+gribContainersNew(stream_t *streamptr)
+{
+  const int editionNumber = (streamptr->filetype == CDI_FILETYPE_GRB) ? 1 : 2;
+
+#ifdef HAVE_LIBCGRIBEX
+  if (editionNumber == 1 && !CDI_gribapi_grib1)
+    {
+    }
+  else
+#endif
+    {
+      const int nvars = streamptr->nvars;
+
+#ifdef GRIBCONTAINER2D
+      gribContainer_t **gribContainers;
+      gribContainers = (gribContainer_t **) Malloc(nvars * sizeof(gribContainer_t *));
+
+      for (int varID = 0; varID < nvars; ++varID)
+        {
+          const int nlevs = streamptr->vars[varID].nlevs;
+          gribContainers[varID] = (gribContainer_t *) Malloc(nlevs * sizeof(gribContainer_t));
+
+          for (int levelID = 0; levelID < nlevs; ++levelID)
+            {
+              gribContainers[varID][levelID].gribHandle = gribHandleNew(editionNumber);
+              gribContainers[varID][levelID].init = false;
+            }
+        }
+
+      streamptr->gribContainers = (void *) gribContainers;
+#else
+    gribContainer_t *gribContainers = (gribContainer_t *) Malloc((size_t) nvars * sizeof(gribContainer_t));
+
+    for (int varID = 0; varID < nvars; ++varID)
+      {
+        gribContainers[varID].gribHandle = gribHandleNew(editionNumber);
+        gribContainers[varID].init = false;
+      }
+
+    streamptr->gribContainers = (void *) gribContainers;
+#endif
+    }
+}
+
+void
+gribContainersDelete(stream_t *streamptr)
+{
+  if (streamptr->gribContainers)
+    {
+      const int nvars = streamptr->nvars;
+
+#ifdef GRIBCONTAINER2D
+      gribContainer_t **gribContainers = (gribContainer_t **) streamptr->gribContainers;
+
+      for (int varID = 0; varID < nvars; ++varID)
+        {
+          const int nlevs = streamptr->vars[varID].nlevs;
+          for (int levelID = 0; levelID < nlevs; ++levelID)
+            {
+              gribHandleDelete(gribContainers[varID][levelID].gribHandle);
+            }
+          Free(gribContainers[varID]);
+        }
+#else
+      gribContainer_t *gribContainers = (gribContainer_t *) streamptr->gribContainers;
+
+      for (int varID = 0; varID < nvars; ++varID)
+        {
+          gribHandleDelete(gribContainers[varID].gribHandle);
+        }
+#endif
+
+      Free(gribContainers);
+
+      streamptr->gribContainers = NULL;
+    }
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H
+#define INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H
+
+#ifdef HAVE_LIBGRIB_API
+
+
+#include <grib_api.h>
+
+#include <stdbool.h>
+
+char *gribCopyString(grib_handle *gribHandle, const char *key);
+bool gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue);
+
+bool gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue);
+long gribGetLong(grib_handle *gh, const char *key);
+long gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue);
+
+double gribGetDouble(grib_handle *gh, const char *key);
+double gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue);
+
+size_t gribGetArraySize(grib_handle *gribHandle, const char *key);
+void gribGetDoubleArray(grib_handle *gribHandle, const char *key,
+                        double *array);  // The caller is responsible to ensure a sufficiently large buffer.
+void gribGetLongArray(grib_handle *gribHandle, const char *key,
+                      long *array);  // The caller is responsible to ensure a sufficiently large buffer.
+
+long gribEditionNumber(grib_handle *gh);
+char *gribMakeTimeString(grib_handle *gh, CdiTimeType timeType);  // Returns NULL if timeType is kCdiTimeType_endTime and the field
+                                                                  // does not have an integration period (statistical data).
+int gribapiTimeIsFC(grib_handle *gh);
+int gribapiGetTsteptype(grib_handle *gh);
+int gribGetDatatype(grib_handle *gribHandle);
+int gribapiGetParam(grib_handle *gh);
+int gribapiGetGridType(grib_handle *gh);
+bool gribapiGetGrid(grib_handle *gh, grid_t *grid);
+size_t gribapiGetGridsize(grib_handle *gh);
+
+#ifdef HIRLAM_EXTENSIONS
+void gribapiSetDataTimeRangeIndicator(grib_handle *gh, int timeRangeIndicator);
+void gribapiGetDataTimeRangeIndicator(grib_handle *gh, int *timeRangeIndicator);
+#endif  // #ifdef HIRLAM_EXTENSIONS
+
+extern struct cdiGribAPI_ts_str_map_elem
+{
+  long productionTemplate;
+  const char sname[8];
+} cdiGribAPI_ts_str_map[];
+
+#endif
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+
+
+
+#include <assert.h>
+#include <time.h>
+
+#define FAIL_ON_GRIB_ERROR(function, gribHandle, key, ...)                                                                 \
+  do                                                                                                                       \
+    {                                                                                                                      \
+      int errorCode = (int) function(gribHandle, key, __VA_ARGS__);                                                        \
+      if (errorCode)                                                                                                       \
+        {                                                                                                                  \
+          fprintf(stderr, "%s:%d: Error in function `%s`: `%s` returned error code %d for key \"%s\"", __FILE__, __LINE__, \
+                  __func__, #function, errorCode, key);                                                                    \
+          exit(errorCode);                                                                                                 \
+        }                                                                                                                  \
+    }                                                                                                                      \
+  while (0)
+
+// A simple wrapper for grib_get_string() that returns a newly allocated string.
+char *
+gribCopyString(grib_handle *gribHandle, const char *key)
+{
+  size_t length;
+#ifdef HAVE_GRIB_GET_LENGTH
+  if (!grib_get_length(gribHandle, key, &length))
+    {
+      char *result = (char *) Malloc(length);
+      if (!grib_get_string(gribHandle, key, result, &length))
+        result = (char *) Realloc(result, length);
+      else
+        {
+          Free(result);
+          result = NULL;
+        }
+      return result;
+    }
+  else
+    return NULL;
+#else
+  length = 1024; /* there's an implementation limit
+                  * that makes strings longer than
+                  * this unlikely in grib_api versions
+                  * not providing grib_get_length */
+  int rc;
+  char *result = (char *) Malloc(length);
+  while ((rc = grib_get_string(gribHandle, key, result, &length)) == GRIB_BUFFER_TOO_SMALL || rc == GRIB_ARRAY_TOO_SMALL)
+    {
+      if (length <= 1024UL * 1024UL)
+        {
+          length *= 2;
+          result = Realloc(result, length);
+        }
+      else
+        break;
+    }
+  if (!rc)
+    result = Realloc(result, length);
+  else
+    {
+      Free(result);
+      result = NULL;
+    }
+  return result;
+#endif
+}
+
+// A simple wrapper for grib_get_string() for the usecase that the result is only compared to a given constant string.
+// Returns true if the key exists and the value is equal to the given string.
+bool
+gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue)
+{
+  size_t expectedLength = strlen(expectedValue) + 1;
+#ifdef HAVE_GRIB_GET_LENGTH
+  size_t length;
+  if (grib_get_length(gribHandle, key, &length)) return false;
+  if (length != expectedLength) return false;
+  char *value = (char *) Malloc(length);
+  if (grib_get_string(gribHandle, key, value, &length)) return false;
+  int rc = str_is_equal(value, expectedValue);
+  Free(value);
+#else
+  char *value = gribCopyString(gribHandle, key);
+  int rc = value ? (strlen(value) + 1 == expectedLength ? str_is_equal(value, expectedValue) : false) : false;
+  Free(value);
+#endif
+  return rc;
+}
+
+// A simple wrapper for grib_get_long() for the usecase that the result is only compared to a given constant value.
+// Returns true if the key exists and the value is equal to the given one.
+bool
+gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue)
+{
+  long value;
+  if (grib_get_long(gribHandle, key, &value)) return false;
+  return value == expectedValue;
+}
+
+// A simple wrapper for grib_get_long() for the usecase that failure to fetch the value is fatal.
+long
+gribGetLong(grib_handle *gh, const char *key)
+{
+  long result;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, key, &result);
+  return result;
+}
+
+// A simple wrapper for grib_get_long() for the usecase that a default value is used in the case that the operation fails.
+long
+gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue)
+{
+  long result;
+  if (grib_get_long(gribHandle, key, &result) || result == GRIB_MISSING_LONG) result = defaultValue;
+  return result;
+}
+
+// A simple wrapper for grib_get_double() for the usecase that failure to fetch the value is fatal.
+double
+gribGetDouble(grib_handle *gh, const char *key)
+{
+  double result;
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, key, &result);
+  return result;
+}
+
+// A sample wrapper for grib_get_double() for the usecase that a default value is used in the case that the operation fails.
+double
+gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue)
+{
+  double result;
+  if (grib_get_double(gribHandle, key, &result) || IS_EQUAL(result, GRIB_MISSING_DOUBLE)) result = defaultValue;
+  return result;
+}
+
+// A simple wrapper for grib_get_size() for the usecase that failure to fetch the value is fatal.
+size_t
+gribGetArraySize(grib_handle *gribHandle, const char *key)
+{
+  size_t result;
+  FAIL_ON_GRIB_ERROR(grib_get_size, gribHandle, key, &result);
+  return result;
+}
+
+// A simple wrapper for grib_get_double_array() for the usecase that failure to fetch the data is fatal.
+void
+gribGetDoubleArray(grib_handle *gribHandle, const char *key, double *array)
+{
+  size_t valueCount = gribGetArraySize(gribHandle, key);
+  FAIL_ON_GRIB_ERROR(grib_get_double_array, gribHandle, key, array, &valueCount);
+}
+
+// A simple wrapper for grib_get_long_array() for the usecase that failure to fetch the data is fatal.
+void
+gribGetLongArray(grib_handle *gribHandle, const char *key, long *array)
+{
+  size_t valueCount = gribGetArraySize(gribHandle, key);
+  FAIL_ON_GRIB_ERROR(grib_get_long_array, gribHandle, key, array, &valueCount);
+}
+
+// We need the edition number so frequently, that it's convenient to give it its own function.
+long
+gribEditionNumber(grib_handle *gh)
+{
+  return gribGetLong(gh, "editionNumber");
+}
+
+// This return value of this should be passed to a call to resetTz(), it is a malloc'ed string with the content of the TZ
+// environment variable before the call (or NULL if that was not set).
+static char *
+setUtc(void)
+{
+  char *temp = getenv("TZ"), *result = NULL;
+  if (temp) result = strdup(temp);
+  setenv("TZ", "UTC", 1);
+  return result;
+}
+
+// Undoes the effect of setUtc(), pass to it the return value of the corresponding setUtc() call, it will free the string.
+static void
+resetTz(char *savedTz)
+{
+  if (savedTz)
+    {
+      setenv("TZ", savedTz, 1);
+      Free(savedTz);
+    }
+  else
+    {
+      unsetenv("TZ");
+    }
+}
+
+// This function uses the system functions to normalize the date representation according to the gregorian calendar.
+// Returns zero on success.
+static int
+normalizeDays(struct tm *me)
+{
+  char *savedTz = setUtc();  // Ensure that mktime() does not interprete the date according to our local time zone.
+
+  int result = (mktime(me) == (time_t) -1);  // This does all the heavy lifting.
+
+  resetTz(savedTz);
+  return result;
+}
+
+// Returns zero on success.
+static int
+addSecondsToDate(struct tm *me, long long amount)
+{
+  // It is irrelevant here whether days are zero or one based, the correction would have be undone again so that it is effectless.
+  long long seconds = ((me->tm_mday * 24ll + me->tm_hour) * 60 + me->tm_min) * 60
+                      + me->tm_sec;  // The portion of the date that uses fixed increments.
+  seconds += amount;
+  me->tm_mday = (int) (seconds / 24 / 60 / 60);
+  seconds -= (long long) me->tm_mday * 24 * 60 * 60;
+  me->tm_hour = (int) (seconds / 60 / 60);
+  seconds -= (long long) me->tm_hour * 60 * 60;
+  me->tm_min = (int) (seconds / 60);
+  seconds -= (long long) (me->tm_min * 60);
+  me->tm_sec = (int) seconds;
+  return normalizeDays(me);
+}
+
+static void
+addMonthsToDate(struct tm *me, long long amount)
+{
+  long long months = me->tm_year * 12ll + me->tm_mon;
+  months += amount;
+  me->tm_year = (int) (months / 12);
+  months -= (long long) me->tm_year * 12;
+  me->tm_mon = (int) months;
+}
+
+// unit is a value according to code table 4.4 of the GRIB2 specification, returns non-zero on error
+static int
+addToDate(struct tm *me, long long amount, long unit)
+{
+  switch (unit)
+    {
+    case 0: return addSecondsToDate(me, 60 * amount);            // minute
+    case 1: return addSecondsToDate(me, 60 * 60 * amount);       // hour
+    case 2: return addSecondsToDate(me, 24 * 60 * 60 * amount);  // day
+
+    case 3: addMonthsToDate(me, amount); return 0;             // month
+    case 4: addMonthsToDate(me, 12 * amount); return 0;        // year
+    case 5: addMonthsToDate(me, 10 * 12 * amount); return 0;   // decade
+    case 6: addMonthsToDate(me, 30 * 12 * amount); return 0;   // normal
+    case 7: addMonthsToDate(me, 100 * 12 * amount); return 0;  // century
+
+    case 10: return addSecondsToDate(me, 3 * 60 * 60 * amount);   // eighth of a day
+    case 11: return addSecondsToDate(me, 6 * 60 * 60 * amount);   // quarter day
+    case 12: return addSecondsToDate(me, 12 * 60 * 60 * amount);  // half day
+    case 13: return addSecondsToDate(me, amount);                 // second
+
+    default: return 1;  // reserved, unknown, or missing
+    }
+}
+
+static char *
+makeDateString(struct tm *me)
+{
+  enum
+  {
+    size = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1
+  };
+  char *result = (char *) Malloc(size);
+  assert(me->tm_year + 1900 < 10000 && me->tm_year + 1900 > -1000 && me->tm_mon >= 0 && me->tm_mon < 12 && me->tm_mday >= 1
+         && me->tm_mday <= 31 && me->tm_hour >= 0 && me->tm_hour <= 24 && me->tm_min >= 0 && me->tm_min < 60 && me->tm_sec >= 0
+         && me->tm_sec <= 60);
+  int year = me->tm_year + 1900;
+  if (year > 10000)
+    year = 9999;
+  else if (year < -999)
+    year = -999;
+  snprintf(result, size, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, (me->tm_mon + 1) & 31, me->tm_mday & 31, me->tm_hour & 31,
+           me->tm_min & 63, me->tm_sec & 63);
+  return result;
+}
+
+// FIXME: This ignores any calendar definition that might be present.
+// XXX: Identification templates are not implemented in grib_api-1.12.3, so even if I implemented the other calendars now, it
+// wouldn't be possible to use them.
+static int
+getAvailabilityOfRelativeTimes(grib_handle *gh, bool *outHaveForecastTime, bool *outHaveTimeRange)
+{
+  switch (gribGetLong(gh, "productDefinitionTemplateNumber"))
+    {
+    case 20:
+    case 30:
+    case 31:
+    case 254:
+    case 311:
+    case 2000: *outHaveForecastTime = false, *outHaveTimeRange = false; return 0;
+
+    // case 55 and case 40455 are the same: 55 is the proposed standard value, 40455 is the value in the local use range that is
+    // used by the dwd until the standard is updated.
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 15:
+    case 32:
+    case 33:
+    case 40:
+    case 41:
+    case 44:
+    case 45:
+    case 48:
+    case 51:
+    case 53:
+    case 54:
+    case 55:
+    case 56:
+    case 57:
+    case 58:
+    case 60:
+    case 1000:
+    case 1002:
+    case 1100:
+    case 40033:
+    case 40455:
+    case 40456: *outHaveForecastTime = true, *outHaveTimeRange = false; return 0;
+
+    case 8:
+    case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 34:
+    case 42:
+    case 43:
+    case 46:
+    case 47:
+    case 61:
+    case 67:
+    case 68:
+    case 91:
+    case 1001:
+    case 1101:
+    case 40034: *outHaveForecastTime = true, *outHaveTimeRange = true; return 0;
+
+    default: return 1;
+    }
+}
+
+char *
+gribMakeTimeString(grib_handle *gh, CdiTimeType timeType)
+{
+  // Get the parts of the reference date.
+  struct tm date;
+  date.tm_mon = (int) gribGetLong(gh, "month") - 1;  // months are zero based in struct tm and one based in GRIB
+  date.tm_mday = (int) gribGetLong(gh, "day");
+  date.tm_hour = (int) gribGetLong(gh, "hour");
+  date.tm_min = (int) gribGetLong(gh, "minute");
+  date.tm_isdst = 0;
+
+  if (gribEditionNumber(gh) == 1)
+    {
+      date.tm_year = (int) gribGetLong(gh, "yearOfCentury");  // years are -1900 based both in struct tm and GRIB1
+    }
+  else
+    {
+      date.tm_year = (int) gribGetLong(gh, "year") - 1900;  // years are -1900 based in struct tm and zero based in GRIB2
+      date.tm_sec = (int) gribGetLong(gh, "second");
+
+      // If the start or end time are requested, we need to take the relative times into account.
+      if (timeType != kCdiTimeType_referenceTime)
+        {
+          // Determine whether we have a forecast time and a time range.
+          bool haveForecastTime, haveTimeRange;
+          if (getAvailabilityOfRelativeTimes(gh, &haveForecastTime, &haveTimeRange)) return NULL;
+          if (timeType == kCdiTimeType_endTime && !haveTimeRange)
+            return NULL;  // tell the caller that the requested time does not exist
+
+          // If we have relative times, apply the relative times to the date
+          if (haveForecastTime)
+            {
+              long offset = gribGetLongDefault(gh, "forecastTime", 0);
+              // if (stepUnits == indicatorOfUnitOfTimeRange) assert(startStep == forecastTime)
+              long offsetUnit = gribGetLongDefault(gh, "indicatorOfUnitOfTimeRange", 255);
+              if (addToDate(&date, offset, offsetUnit)) return NULL;
+              if (timeType == kCdiTimeType_endTime)
+                {
+                  assert(haveTimeRange);
+                  long range = gribGetLongDefault(gh, "lengthOfTimeRange", 0);
+                  // if (stepUnits == indicatorOfUnitForTimeRange) assert(endStep == startStep + lengthOfTimeRange)
+                  long rangeUnit = gribGetLongDefault(gh, "indicatorOfUnitForTimeRange", 255);
+                  if (addToDate(&date, range, rangeUnit)) return NULL;
+                }
+            }
+        }
+    }
+
+  // Bake the date into a string.
+  return makeDateString(&date);
+}
+
+int
+gribapiTimeIsFC(grib_handle *gh)
+{
+  if (gribEditionNumber(gh) <= 1) return true;
+
+  long sigofrtime;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "significanceOfReferenceTime", &sigofrtime);
+  return sigofrtime != 3;
+}
+
+struct cdiGribAPI_ts_str_map_elem cdiGribAPI_ts_str_map[] = {
+  // clang-format off
+  [0]             = {  0, "" },
+  [TSTEP_INSTANT] = {  0, "instant" },
+  [TSTEP_AVG]     = {  8, "avg" },
+  [TSTEP_ACCUM]   = {  8, "accum" },
+  [TSTEP_MAX]     = {  8, "max" },
+  [TSTEP_MIN]     = {  8, "min" },
+  [TSTEP_DIFF]    = {  8, "diff" },
+  [TSTEP_RMS]     = {  8, "rms" },
+  [TSTEP_SD]      = {  8, "sd" },
+  [TSTEP_COV]     = {  8, "cov" },
+  [TSTEP_RATIO]   = {  8, "ratio" },
+  [TSTEP_SUM]     = {  8, "sum" }
+  // clang-format on
+};
+
+// Fetches the value of the "stepType" key and converts it into a constant in the TSTEP_* range.
+int
+gribapiGetTsteptype(grib_handle *gh)
+{
+  size_t len = 256;
+  char stepType[256];
+  int tsteptype = TSTEP_INSTANT;
+  static bool lprint = true;
+
+  if (gribapiTimeIsFC(gh))
+    {
+      int status = grib_get_string(gh, "stepType", stepType, &len);
+      if (status == 0 && len > 1 && len < 256)
+        {
+          for (int i = TSTEP_INSTANT; i <= TSTEP_SUM; ++i)
+            if (strncmp(cdiGribAPI_ts_str_map[i].sname, stepType, len) == 0)
+              {
+                tsteptype = i;
+                goto tsteptypeFound;
+              }
+
+          if (lprint)
+            {
+              Message("Time stepType %s unsupported, set to instant!", stepType);
+              lprint = false;
+            }
+          // printf("stepType: %s %ld %d\n", stepType, len, tsteptype);
+        }
+
+      long typeOfStat;
+      status = grib_get_long(gh, "typeOfStatisticalProcessing", &typeOfStat);
+      if (status == 0)
+        {
+          switch (typeOfStat)
+            {
+            case 0: return TSTEP_AVG;
+            case 1: return TSTEP_ACCUM;
+            case 2: return TSTEP_MAX;
+            case 3: return TSTEP_MIN;
+            case 4: return TSTEP_DIFF;
+            case 5: return TSTEP_RMS;
+            case 6: return TSTEP_SD;
+            case 7: return TSTEP_COV;
+            case 9: return TSTEP_RATIO;
+            case 11: return TSTEP_SUM;
+            }
+        }
+
+#ifdef HIRLAM_EXTENSIONS
+      {
+        // Normaly cdo looks in grib for attribute called "stepType", see above.
+        // BUT NWP models such as Hirlam and Harmonie 37h1.2, use "timeRangeIndicator" instead!
+        // Where for example:       0: for instanteneous fields; 4: for accumulated fields
+        //  0:   Forecast product valid at reference time + P1
+        //  2:   Product with a valid time ranging between reference time + P1 and reference time + P2
+        //  4:   Accumulation (reference time + P1 to reference time + P2)
+        //  5:   Difference(reference time + P2 minus reference time + P1) product considered valid at reference time + P2
+        // More details on WMO standards:
+        //               http://www.wmo.int/pages/prog/www/WDM/Guides/Guide-binary-2.html
+        // tsteptype = TSTEP_INSTANT;  // default value for any case
+        long timeRangeIND = 0;  // typically 0: for instanteneous fields; 4: for accumulated fields
+        int rc = grib_get_long(gh, "timeRangeIndicator", &timeRangeIND);
+        if (rc != 0)
+          {
+            // if ( lprint )
+            Warning("Could not get 'stepType' either 'timeRangeIndicator'. Using default!");
+            return tsteptype;
+          }
+        extern int cdiGribUseTimeRangeIndicator;
+        cdiGribUseTimeRangeIndicator = 1;
+        switch (timeRangeIND)
+          {
+          case 0: tsteptype = TSTEP_INSTANT; break;
+          case 2:
+            tsteptype = TSTEP_INSTANT2;
+            strcpy(stepType, "instant2");
+            break;  // was incorrectly set before into accum
+          case 4: tsteptype = TSTEP_ACCUM; break;
+          case 5: tsteptype = TSTEP_DIFF; break;
+          default:
+            if (lprint)
+              {
+                if (CDI_Debug)
+                  Warning("timeRangeIND = %d;  stepType= %s; tsteptype=%d unsupported timeRangeIND at the moment, set to instant!",
+                          timeRangeIND, stepType, tsteptype);
+                lprint = false;
+              }
+            break;
+          }
+        if (CDI_Debug) Warning("timeRangeIND = %d;  stepType= %s; tsteptype=%d", timeRangeIND, stepType, tsteptype);
+      }
+#endif  // HIRLAM_EXTENSIONS
+    }
+
+tsteptypeFound:
+  return tsteptype;
+}
+
+int
+gribGetDatatype(grib_handle *gribHandle)
+{
+  int datatype;
+  if (gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee"))
+    {
+      datatype = gribCheckLong(gribHandle, "precision", 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
+    }
+  else
+    {
+      long bitsPerValue;
+      datatype = (!grib_get_long(gribHandle, "bitsPerValue", &bitsPerValue) && bitsPerValue > 0 && bitsPerValue <= 32)
+                     ? (int) bitsPerValue
+                     : CDI_DATATYPE_PACK;
+    }
+  return datatype;
+}
+
+int
+gribapiGetParam(grib_handle *gh)
+{
+  long pdis, pcat, pnum;
+  if (gribEditionNumber(gh) <= 1)
+    {
+      pdis = 255;
+      FAIL_ON_GRIB_ERROR(grib_get_long, gh, "table2Version", &pcat);
+      FAIL_ON_GRIB_ERROR(grib_get_long, gh, "indicatorOfParameter", &pnum);
+    }
+  else
+    {
+      FAIL_ON_GRIB_ERROR(grib_get_long, gh, "discipline", &pdis);
+      if (grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0;
+      if (grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0;
+    }
+  return cdiEncodeParam((int) pnum, (int) pcat, (int) pdis);
+}
+
+static bool
+has_ni(grib_handle *gh)
+{
+  return (gribGetLong(gh, "Ni") != (long) GRIB_MISSING_LONG);
+}
+
+int
+gribapiGetGridType(grib_handle *gh)
+{
+  long gridDefinitionTemplateNumber = gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1);
+  switch (gridDefinitionTemplateNumber)
+    {
+    case GRIB2_GTYPE_LATLON: return has_ni(gh) ? GRID_LONLAT : GRID_GENERIC;
+    case GRIB2_GTYPE_GAUSSIAN: return has_ni(gh) ? GRID_GAUSSIAN : GRID_GAUSSIAN_REDUCED;
+    case GRIB2_GTYPE_LATLON_ROT: return GRID_PROJECTION;
+    case GRIB2_GTYPE_LCC: return CDI_PROJ_LCC;
+    case GRIB2_GTYPE_STERE: return CDI_PROJ_STERE;
+    case GRIB2_GTYPE_SPECTRAL: return GRID_SPECTRAL;
+    case GRIB2_GTYPE_GME: return GRID_GME;
+    case GRIB2_GTYPE_UNSTRUCTURED: return GRID_UNSTRUCTURED;
+    case GRIB2_GTYPE_HEALPIX: return CDI_PROJ_HEALPIX;
+    default:
+      {
+        static bool lwarn = true;
+        if (lwarn)
+          {
+            lwarn = false;
+            char mesg[256];
+            size_t len = sizeof(mesg);
+            if (grib_get_string(gh, "gridType", mesg, &len) != 0) mesg[0] = 0;
+            Warning("gridDefinitionTemplateNumber %d unsupported (gridType=%s)!", gridDefinitionTemplateNumber, mesg);
+          }
+      }
+    }
+
+  return GRID_GENERIC;
+}
+
+static int
+gribapiGetIsRotated(grib_handle *gh)
+{
+  return gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1) == GRIB2_GTYPE_LATLON_ROT;
+}
+
+size_t
+gribapiGetGridsize(grib_handle *gh)
+{
+  size_t gridsize;
+  FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &gridsize);
+  return gridsize;
+}
+
+static void
+gribapiGetGridGaussianReduced(grib_handle *gh, grid_t *grid, long editionNumber, size_t numberOfPoints)
+{
+  long lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar);
+  grid->np = (int) lpar;
+
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar);
+  size_t nlat = (size_t) lpar;
+
+  grid->size = numberOfPoints;
+
+  grid->reducedPointsSize = (int) nlat;
+  grid->reducedPoints = (int *) Malloc(nlat * sizeof(int));
+  long *pl = (long *) Malloc(nlat * sizeof(long));
+  size_t dummy = nlat;
+  FAIL_ON_GRIB_ERROR(grib_get_long_array, gh, "pl", pl, &dummy);
+  for (size_t i = 0; i < nlat; ++i) grid->reducedPoints[i] = (int) pl[i];
+  Free(pl);
+
+  grid->y.size = nlat;
+  grid->x.inc = 0;
+  grid->y.inc = 0;
+  grid->x.flag = 0;
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last);
+
+  // FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc);
+  // if ( IS_EQUAL(grid->x.inc, GRIB_MISSING_DOUBLE) ) grid->x.inc = 0;
+
+  if (grid->x.last < grid->x.first)
+    {
+      if (grid->x.first >= 180.0)
+        grid->x.first -= 360.0;
+      else
+        grid->x.last += 360.0;
+    }
+
+  grid->x.flag = 2;
+
+  grid->y.flag = 0;
+  // if (IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0))
+  {
+    if (grid->y.size > 1)
+      {
+        if (editionNumber <= 1)
+          {
+          }
+      }
+    grid->y.flag = 2;
+  }
+}
+
+static void
+gribapiGetGridRegular(grib_handle *gh, grid_t *grid, long editionNumber, int gridtype, size_t numberOfPoints)
+{
+  long lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ni", &lpar);
+  size_t nlon = (size_t) lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar);
+  size_t nlat = (size_t) lpar;
+
+  if (gridtype == GRID_GAUSSIAN)
+    {
+      FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar);
+      grid->np = (int) lpar;
+    }
+
+  if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat);
+
+  grid->size = numberOfPoints;
+  grid->x.size = nlon;
+  grid->y.size = nlat;
+  grid->x.inc = 0;
+  grid->y.inc = 0;
+  grid->x.flag = 0;
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last);
+  if (nlon > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc);
+  if (gridtype == GRID_LONLAT && nlat > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "jDirectionIncrementInDegrees", &grid->y.inc);
+
+  long iscan = 0, jscan = 0;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "iScansNegatively", &iscan);
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "jScansPositively", &jscan);
+  if (iscan) grid->x.inc = -grid->x.inc;
+  if (!jscan) grid->y.inc = -grid->y.inc;
+
+  if (grid->x.inc < -999 || grid->x.inc > 999) grid->x.inc = 0;
+  if (grid->y.inc < -999 || grid->y.inc > 999) grid->y.inc = 0;
+
+  // if ( IS_NOT_EQUAL(grid->x.first, 0) || IS_NOT_EQUAL(grid->x.last, 0) )
+  {
+    if (grid->x.size > 1)
+      {
+        // if ( editionNumber <= 1 )
+        {
+          if (grid->x.last < grid->x.first)
+            {
+              if (grid->x.first >= 180)
+                grid->x.first -= 360;
+              else
+                grid->x.last += 360;
+            }
+
+          // correct xinc if necessary
+          if (IS_EQUAL(grid->x.first, 0) && grid->x.last > 354 && grid->x.last < 360)
+            {
+              double xinc = 360. / (double) grid->x.size;
+              if (fabs(grid->x.inc - xinc) > 0.0)
+                {
+                  grid->x.inc = xinc;
+                  if (CDI_Debug) Message("set xinc to %g", grid->x.inc);
+                }
+            }
+        }
+      }
+    grid->x.flag = 2;
+  }
+
+  grid->y.flag = 0;
+  // if ( IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0) )
+  {
+    if (grid->y.size > 1)
+      {
+        if (editionNumber <= 1)
+          {
+          }
+      }
+    grid->y.flag = 2;
+  }
+}
+
+static void
+gribapiGetGridProj(grib_handle *gh, grid_t *grid, size_t numberOfPoints)
+{
+  long lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nx", &lpar);
+  size_t nlon = (size_t) lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ny", &lpar);
+  size_t nlat = (size_t) lpar;
+
+  if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat);
+
+  grid->size = numberOfPoints;
+  grid->x.size = nlon;
+  grid->y.size = nlat;
+
+  double xinc, yinc;
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DxInMetres", &xinc);
+  FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DyInMetres", &yinc);
+
+  grid->x.first = 0;
+  grid->x.last = 0;
+  grid->x.inc = xinc;
+  grid->y.first = 0;
+  grid->y.last = 0;
+  grid->y.inc = yinc;
+  grid->x.flag = 2;
+  grid->y.flag = 2;
+}
+
+static void
+gribapiGetGridHealpix(grib_handle *gh, grid_t *grid, size_t numberOfPoints)
+{
+  (void) gh;
+  grid->size = numberOfPoints;
+}
+
+static void
+gribapiGetGridSpectral(grib_handle *gh, grid_t *grid, size_t datasize)
+{
+  size_t len = 256;
+  char typeOfPacking[256];
+  FAIL_ON_GRIB_ERROR(grib_get_string, gh, "packingType", typeOfPacking, &len);
+  grid->lcomplex = 0;
+  if (strncmp(typeOfPacking, "spectral_complex", len) == 0) grid->lcomplex = 1;
+
+  grid->size = datasize;
+
+  long lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "J", &lpar);
+  grid->trunc = (int) lpar;
+}
+
+static void
+gribapiGetGridGME(grib_handle *gh, grid_t *grid, size_t numberOfPoints)
+{
+  grid->size = numberOfPoints;
+
+  long lpar;
+  if (grib_get_long(gh, "nd", &lpar) == 0) grid->gme.nd = (int) lpar;
+  if (grib_get_long(gh, "Ni", &lpar) == 0) grid->gme.ni = (int) lpar;
+  if (grib_get_long(gh, "n2", &lpar) == 0) grid->gme.ni2 = (int) lpar;
+  if (grib_get_long(gh, "n3", &lpar) == 0) grid->gme.ni3 = (int) lpar;
+}
+
+static void
+gribapiGetGridUnstructured(grib_handle *gh, grid_t *grid, size_t numberOfPoints)
+{
+  unsigned char uuid[CDI_UUID_SIZE];
+  /*
+    char reference_link[8192];
+    size_t len = sizeof(reference_link);
+    reference_link[0] = 0;
+  */
+  grid->size = numberOfPoints;
+
+  long lpar;
+  if (grib_get_long(gh, "numberOfGridUsed", &lpar) == 0)
+    {
+      cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, (int) lpar);
+      if (grib_get_long(gh, "numberOfGridInReference", &lpar) == 0)
+        cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, (int) lpar);
+      /*
+        if ( grib_get_string(gh, "gridDescriptionFile", reference_link, &len) == 0 )
+        {
+        if ( strncmp(reference_link, "file://", 7) == 0 )
+        grid->reference = strdup(reference_link);
+        }
+      */
+      size_t len = (size_t) CDI_UUID_SIZE;
+      if (grib_get_bytes(gh, "uuidOfHGrid", uuid, &len) == 0) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid, CDI_UUID_SIZE);
+    }
+}
+
+static void
+gribapiGetGridGeneric(grib_handle *gh, grid_t *grid, size_t numberOfPoints)
+{
+  long lpar;
+  size_t nlon = (grib_get_long(gh, "Ni", &lpar) == 0) ? (size_t) lpar : 0;
+  size_t nlat = (grib_get_long(gh, "Nj", &lpar) == 0) ? (size_t) lpar : 0;
+
+  grid->size = numberOfPoints;
+
+  bool lgeneric = (nlon > 0 && nlat > 0 && nlon * nlat == numberOfPoints);
+  grid->x.size = lgeneric ? nlon : 0;
+  grid->y.size = lgeneric ? nlat : 0;
+}
+
+// TODO: Simplify by use of the convenience functions (gribGetLong(), gribGetLongDefault(), etc.).
+bool
+gribapiGetGrid(grib_handle *gh, grid_t *grid)
+{
+  bool uvRelativeToGrid = false;
+  long editionNumber = gribEditionNumber(gh);
+  int gridtype = gribapiGetGridType(gh);
+  int projtype = (gridtype == GRID_PROJECTION && gribapiGetIsRotated(gh)) ? CDI_PROJ_RLL : CDI_UNDEFID;
+  if (gridtype == CDI_PROJ_LCC || gridtype == CDI_PROJ_STERE || gridtype == CDI_PROJ_HEALPIX)
+    {
+      projtype = gridtype;
+      gridtype = GRID_PROJECTION;
+    }
+  /*
+  if ( streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED )
+    {
+      gridtype = GRID_GAUSSIAN;
+      ISEC2_NumLon = 2*ISEC2_NumLat;
+      ISEC4_NumValues = ISEC2_NumLon*ISEC2_NumLat;
+    }
+  */
+  grid_init(grid);
+  cdiGridTypeInit(grid, gridtype, 0);
+
+  size_t datasize;
+  FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &datasize);
+  long lpar;
+  FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfPoints", &lpar);
+  size_t numberOfPoints = (size_t) lpar;
+
+  if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL)
+    {
+      gribapiGetGridRegular(gh, grid, editionNumber, gridtype, numberOfPoints);
+    }
+  else if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      gribapiGetGridGaussianReduced(gh, grid, editionNumber, numberOfPoints);
+    }
+  else if (projtype == CDI_PROJ_LCC)
+    {
+      gribapiGetGridProj(gh, grid, numberOfPoints);
+    }
+  else if (projtype == CDI_PROJ_STERE)
+    {
+      gribapiGetGridProj(gh, grid, numberOfPoints);
+    }
+  else if (projtype == CDI_PROJ_HEALPIX)
+    {
+      gribapiGetGridHealpix(gh, grid, numberOfPoints);
+    }
+  else if (gridtype == GRID_SPECTRAL)
+    {
+      gribapiGetGridSpectral(gh, grid, datasize);
+    }
+  else if (gridtype == GRID_GME)
+    {
+      gribapiGetGridGME(gh, grid, numberOfPoints);
+    }
+  else if (gridtype == GRID_UNSTRUCTURED)
+    {
+      gribapiGetGridUnstructured(gh, grid, numberOfPoints);
+    }
+  else if (gridtype == GRID_GENERIC)
+    {
+      gribapiGetGridGeneric(gh, grid, numberOfPoints);
+    }
+  else
+    {
+      Error("Unsupported grid type: %s", gridNamePtr(gridtype));
+    }
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || projtype == CDI_PROJ_RLL || projtype == CDI_PROJ_LCC
+      || projtype == CDI_PROJ_HEALPIX)
+    {
+      long temp = 0;
+      GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &temp), 0);
+      assert(temp == 0 || temp == 1);
+      uvRelativeToGrid = (bool) temp;
+    }
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || (gridtype == GRID_PROJECTION && projtype != CDI_PROJ_HEALPIX))
+    {
+      long iScansNegatively, jScansPositively, jPointsAreConsecutive;
+      GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0);
+      GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0);
+      GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0);
+
+      int scanningMode = (int) (128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive);
+      cdiDefVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE, scanningMode);
+      /* scanningMode  = 128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive;
+                   64  = 128 * 0                + 64 *        1         + 32 * 0
+                   00  = 128 * 0                + 64 *        0         + 32 * 0
+                   96  = 128 * 0                + 64 *        1         + 32 * 1
+         Default / implicit scanning mode is 64:
+                            i and j scan positively, i points are consecutive (row-major)        */
+#ifdef HIRLAM_EXTENSIONS
+      if (cdiDebugExt >= 30 && edititionnumber <= 1)
+        {
+          //  indicatorOfParameter=33,indicatorOfTypeOfLevel=105,level
+          long paramId, levelTypeId, levelId;
+          GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", &paramId), 0);
+          GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0);
+          GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0);
+          Message("(param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d -> bits:(%1d.%1d.%1d)*32;  uvRelativeToGrid = %02d",
+                  (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, jPointsAreConsecutive, jScansPositively,
+                  iScansNegatively, uvRelativeToGrid);
+        }
+#endif  // HIRLAM_EXTENSIONS
+    }
+
+  grid->type = gridtype;
+  grid->projtype = projtype;
+
+  return uvRelativeToGrid;
+}
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDI_UUID_H
+#define CDI_UUID_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+// clang-format off
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+  uuidNumHexChars = 36,
+};
+
+static inline
+int cdiUUIDIsNull(const unsigned char uuid[])
+{
+  int isNull = 1;
+  for (size_t i = 0; i < CDI_UUID_SIZE; ++i) isNull &= (uuid[i] == 0);
+  return isNull;
+}
+
+void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]);
+
+int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]);
+int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]);
+
+#ifdef __cplusplus
+}
+#endif
+// clang-format on
+
+#endif
+#ifndef RESOURCE_UNPACK_H
+#define RESOURCE_UNPACK_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+enum
+{
+  GRID = 1,
+  ZAXIS = 2,
+  TAXIS = 3,
+  INSTITUTE = 4,
+  MODEL = 5,
+  STREAM = 6,
+  VLIST = 7,
+  DIST_GRID = 8,
+  RESH_DELETE,
+  START = 55555555,
+  END = 99999999
+};
+
+typedef void (*cdiPostResUpdateHook)(int resH, int resType);
+
+int reshUnpackResources(char *unpackBuffer, int unpackBufferSize, void *context, cdiPostResUpdateHook postHook);
+
+extern int (*reshDistGridUnpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context,
+                                 int force_id);
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef VLIST_H
+#define VLIST_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef ERROR_H
+#endif
+
+#include <stdbool.h>
+#include <stddef.h> /* size_t */
+
+#ifndef CDI_LIMITS_H
+#endif
+
+#define VALIDMISS 1.e+303
+
+
+typedef struct
+{
+  bool flag;
+  int index;
+  int mlevelID;
+  int flevelID;
+} levinfo_t;
+
+#define DEFAULT_LEVINFO(levID) \
+  (levinfo_t) { 0, -1, levID, levID }
+/*
+#define DEFAULT_LEVINFO(levID) \
+  (levinfo_t){ .flag = 0, .index = -1, .flevelID = levID, .mlevelID = levID}
+*/
+typedef struct
+{
+  int ens_index;
+  int ens_count;
+  int forecast_init_type;
+} ensinfo_t;
+
+typedef struct
+{
+  bool isUsed;
+  bool flag;
+  bool lvalidrange;
+  signed char xyz;   /* order of spatial dimensions,
+                      * a permutation of 123 */
+  bool missvalused;  // true if missval is defined
+  int mvarID;
+  int fvarID;
+  int param;
+  int gridID;
+  int zaxisID;
+  int timetype;   // TIME_*
+  int tsteptype;  // TSTEP_*
+  int datatype;   // CDI_DATATYPE_PACKX for GRIB data, else CDI_DATATYPE_FLT32 or CDI_DATATYPE_FLT64
+  int instID;
+  int modelID;
+  int tableID;
+  int timave;
+  int nsb;  // Number of significant bits
+  double missval;
+  double validrange[2];
+  levinfo_t *levinfo;
+  int comptype;   // compression type
+  int complevel;  // compression level
+  cdi_keys_t keys;
+  cdi_atts_t atts;
+  int subtypeID;  // subtype ID for tile-related meta-data, currently for GRIB-API only.
+
+  int opt_grib_nentries;                // current no. key-value pairs
+  int opt_grib_kvpair_size;             // current allocated size
+  opt_key_val_pair_t *opt_grib_kvpair;  // (optional) list of keyword/value pairs
+} var_t;
+
+typedef struct
+{
+  // set when a vlist is passed to streamDefVlist() to safeguard against modifications of the wrong vlist object
+  bool immutable;
+  // set if this vlist has been created by CDI itself, and must not be destroyed by the user, consequently
+  bool internal;
+  int self;
+  int nvars;  // number of variables
+  int ngrids;
+  int nzaxis;
+  int nsubtypes;  // no. of variable subtypes (e.g. sets of tiles)
+  long ntsteps;
+  int taxisID;
+  int tableID;
+  int instID;
+  int modelID;
+  int varsAllocated;
+  int gridIDs[MAX_GRIDS_PS];
+  int zaxisIDs[MAX_ZAXES_PS];
+  int subtypeIDs[MAX_SUBTYPES_PS];
+  var_t *vars;
+  cdi_keys_t keys;
+  cdi_atts_t atts;
+} vlist_t;
+
+vlist_t *vlist_to_pointer(int vlistID);
+void cdiVlistMakeInternal(int vlistID);
+void cdiVlistMakeImmutable(int vlistID);
+void cdiVlistDestroy_(int vlistID, bool assertInternal);
+int vlistInqVarMissvalUsed(int vlistID, int varID);
+int vlistHasTime(int vlistID);
+
+int vlistUnpack(char *buffer, int bufferSize, int *pos, int originNamespace, void *context, int force_id);
+
+/*      vlistDefVarValidrange: Define the valid range of a Variable */
+void vlistDefVarValidrange(int vlistID, int varID, const double *validrange);
+
+/*      vlistInqVarValidrange: Get the valid range of a Variable */
+int vlistInqVarValidrange(int vlistID, int varID, double *validrange);
+
+void vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3]);
+
+void resize_opt_grib_entries(var_t *var, int nentries);
+
+static inline void
+vlistAdd2GridIDs(vlist_t *vlistptr, int gridID)
+{
+  int index, ngrids = vlistptr->ngrids;
+  for (index = 0; index < ngrids; index++)
+    {
+      if (vlistptr->gridIDs[index] == gridID) break;
+      //      if ( gridIsEqual(vlistptr->gridIDs[index], gridID) ) break;
+    }
+
+  if (index == ngrids)
+    {
+      if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded: more than %d grids.", MAX_GRIDS_PS);
+      vlistptr->gridIDs[ngrids] = gridID;
+      ++(vlistptr->ngrids);
+    }
+}
+
+static inline void
+vlistAdd2ZaxisIDs(vlist_t *vlistptr, int zaxisID)
+{
+  int index, nzaxis = vlistptr->nzaxis;
+  for (index = 0; index < nzaxis; index++)
+    if (zaxisID == vlistptr->zaxisIDs[index]) break;
+
+  if (index == nzaxis)
+    {
+      if (nzaxis >= MAX_ZAXES_PS) Error("Internal limit exceeded: more than %d zaxis.", MAX_ZAXES_PS);
+      vlistptr->zaxisIDs[nzaxis] = zaxisID;
+      ++(vlistptr->nzaxis);
+    }
+}
+
+static inline void
+vlistAdd2SubtypeIDs(vlist_t *vlistptr, int subtypeID)
+{
+  if (subtypeID == CDI_UNDEFID) return;
+
+  int index, nsubs = vlistptr->nsubtypes;
+  for (index = 0; index < nsubs; index++)
+    if (vlistptr->subtypeIDs[index] == subtypeID) break;
+
+  if (index == nsubs)
+    {
+      if (nsubs >= MAX_SUBTYPES_PS) Error("Internal limit exceeded: more than %d subs.", MAX_SUBTYPES_PS);
+      vlistptr->subtypeIDs[nsubs] = subtypeID;
+      ++(vlistptr->nsubtypes);
+    }
+}
+
+#ifdef HAVE_LIBGRIB_API
+extern int cdiNAdditionalGRIBKeys;
+extern char *cdiAdditionalGRIBKeys[];
+#endif
+
+extern const resOps vlistOps;
+
+#endif /* VLIST_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <assert.h>
+#include <string.h>
+
+
+int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL;
+int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL;
+int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL;
+int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL;
+
+// the value in the second pair of brackets must match the length of the longest string (including terminating NUL)
+static const char Grids[][17] = {
+  /*  0 */ "undefined",
+  /*  1 */ "generic",
+  /*  2 */ "gaussian",
+  /*  3 */ "gaussian_reduced",
+  /*  4 */ "lonlat",
+  /*  5 */ "spectral",
+  /*  6 */ "fourier",
+  /*  7 */ "gme",
+  /*  8 */ "trajectory",
+  /*  9 */ "unstructured",
+  /* 10 */ "curvilinear",
+  /* 11 */ "lcc",
+  /* 12 */ "projection",
+  /* 13 */ "characterXY",
+};
+
+// must match table below
+enum xystdname_idx
+{
+  grid_xystdname_grid_latlon,
+  grid_xystdname_latlon,
+  grid_xystdname_projection,
+  grid_xystdname_char,
+};
+static const char xystdname_tab[][2][24] = {
+  [grid_xystdname_grid_latlon] = { "grid_longitude", "grid_latitude" },
+  [grid_xystdname_latlon] = { "longitude", "latitude" },
+  [grid_xystdname_projection] = { "projection_x_coordinate", "projection_y_coordinate" },
+  [grid_xystdname_char] = { "region", "region" },
+};
+
+static int gridCompareP(void *gridptr1, void *gridptr2);
+static void gridDestroyP(void *gridptr);
+static void gridPrintP(void *gridptr, FILE *fp);
+static int gridGetPackSize(void *gridptr, void *context);
+static void gridPack(void *gridptr, void *buff, int size, int *position, void *context);
+static int gridTxCode(void *gridptr);
+
+static const resOps gridOps = { gridCompareP, gridDestroyP, gridPrintP, gridGetPackSize, gridPack, gridTxCode };
+
+grid_t *
+grid_to_pointer(int gridID)
+{
+  return (grid_t *) reshGetVal(gridID, &gridOps);
+}
+
+#define gridMark4Update(gridID) reshSetStatus(gridID, &gridOps, RESH_DESYNC_IN_USE)
+
+static inline bool
+grid_is_irregular(int gridType)
+{
+  return (gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR);
+}
+
+static bool
+cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int attlen, double *attflt)
+{
+  bool status = true;
+
+  if (atttype == CDI_DATATYPE_INT32)
+    {
+      int attint = 0;
+      int *pattint = attlen > 1 ? (int *) Malloc((size_t) attlen * sizeof(int)) : &attint;
+      cdiInqAttInt(gridID, CDI_GLOBAL, attname, attlen, pattint);
+      for (int i = 0; i < attlen; ++i) attflt[i] = (double) pattint[i];
+      if (attlen > 1) Free(pattint);
+    }
+  else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64)
+    {
+      cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt);
+    }
+  else
+    {
+      status = false;
+    }
+
+  return status;
+}
+
+static void
+grid_axis_init(struct gridaxis_t *axisptr)
+{
+  axisptr->size = 0;
+  axisptr->vals = NULL;
+  axisptr->bounds = NULL;
+  axisptr->flag = 0;
+  axisptr->first = 0.0;
+  axisptr->last = 0.0;
+  axisptr->inc = 0.0;
+#ifndef USE_MPI
+  axisptr->clength = 0;
+  axisptr->cvals = NULL;
+#endif
+  cdiInitKeys(&axisptr->keys);
+}
+
+enum cdiApplyRet
+cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data)
+{
+  return cdiResHFilterApply(&gridOps, func, data);
+}
+
+void
+grid_init(grid_t *gridptr)
+{
+  gridptr->self = CDI_UNDEFID;
+  gridptr->type = CDI_UNDEFID;
+  gridptr->datatype = CDI_UNDEFID;
+  gridptr->proj = CDI_UNDEFID;
+  gridptr->projtype = CDI_UNDEFID;
+  gridptr->mask = NULL;
+  gridptr->mask_gme = NULL;
+  gridptr->size = 0;
+
+  grid_axis_init(&gridptr->x);
+  grid_axis_init(&gridptr->y);
+
+  gridptr->area = NULL;
+  gridptr->reducedPoints = NULL;
+  gridptr->reducedPointsSize = 0;
+
+  gridptr->gme.nd = 0;
+  gridptr->gme.ni = 0;
+  gridptr->gme.ni2 = 0;
+  gridptr->gme.ni3 = 0;
+
+  gridptr->trunc = 0;
+  gridptr->nvertex = 0;
+  gridptr->np = 0;
+  gridptr->isCyclic = CDI_UNDEFID;
+
+  gridptr->lcomplex = false;
+  gridptr->hasdims = true;
+  gridptr->name = NULL;
+  gridptr->vtable = &cdiGridVtable;
+
+  cdiInitKeys(&gridptr->keys);
+  gridptr->atts.nalloc = MAX_ATTRIBUTES;
+  gridptr->atts.nelems = 0;
+
+  cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64);
+#ifdef HIRLAM_EXTENSIONS
+  cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_SCANNINGMODE, 64);
+#endif
+
+  gridptr->extraData = NULL;
+}
+
+static void
+grid_free_components(grid_t *gridptr)
+{
+  void *p2free[] = { gridptr->mask,     gridptr->mask_gme, gridptr->x.vals,        gridptr->y.vals,
+#ifndef USE_MPI
+                     gridptr->x.cvals,  gridptr->y.cvals,
+#endif
+                     gridptr->x.bounds, gridptr->y.bounds, gridptr->reducedPoints, gridptr->area,   gridptr->name };
+
+  for (size_t i = 0; i < sizeof(p2free) / sizeof(p2free[0]); ++i)
+    if (p2free[i]) Free(p2free[i]);
+
+  cdiDeleteVarKeys(&(gridptr->x.keys));
+  cdiDeleteVarKeys(&(gridptr->y.keys));
+  cdiDeleteVarKeys(&(gridptr->keys));
+  /* 12 pio tests fail
+  int gridID = gridptr->self;
+  if (gridID != CDI_UNDEFID) cdiDeleteAtts(gridID, CDI_GLOBAL);
+  */
+}
+
+void
+grid_free(grid_t *gridptr)
+{
+  if (gridptr)
+    {
+      grid_free_components(gridptr);
+      grid_init(gridptr);
+    }
+}
+
+static grid_t *
+gridNewEntry(cdiResH resH)
+{
+  grid_t *gridptr = (grid_t *) Malloc(sizeof(grid_t));
+  grid_init(gridptr);
+
+  if (resH == CDI_UNDEFID)
+    gridptr->self = reshPut(gridptr, &gridOps);
+  else
+    {
+      gridptr->self = resH;
+      reshReplace(resH, gridptr, &gridOps);
+    }
+
+  return gridptr;
+}
+
+static void
+gridInit(void)
+{
+  static bool gridInitialized = false;
+  if (gridInitialized) return;
+  gridInitialized = true;
+}
+
+static void
+grid_copy_base_scalar_fields(grid_t *gridptrOrig, grid_t *gridptrDup)
+{
+  memcpy(gridptrDup, gridptrOrig, sizeof(grid_t));
+  gridptrDup->self = CDI_UNDEFID;
+  cdiInitKeys(&gridptrDup->keys);
+  cdiCopyVarKeys(&gridptrOrig->keys, &gridptrDup->keys);
+  cdiInitKeys(&gridptrDup->x.keys);
+  cdiCopyVarKeys(&gridptrOrig->x.keys, &gridptrDup->x.keys);
+  cdiInitKeys(&gridptrDup->y.keys);
+  cdiCopyVarKeys(&gridptrOrig->y.keys, &gridptrDup->y.keys);
+}
+
+static grid_t *
+grid_copy_base(grid_t *gridptrOrig)
+{
+  grid_t *gridptrDup = (grid_t *) Malloc(sizeof(*gridptrDup));
+  gridptrOrig->vtable->copyScalarFields(gridptrOrig, gridptrDup);
+  gridptrOrig->vtable->copyArrayFields(gridptrOrig, gridptrDup);
+  return gridptrDup;
+}
+
+unsigned
+cdiGridCount(void)
+{
+  return reshCountType(&gridOps);
+}
+
+static inline void
+gridaxisSetKey(struct gridaxis_t *axisptr, int key, const char *name)
+{
+  if (find_key(&axisptr->keys, key) == NULL)
+    cdiDefVarKeyBytes(&axisptr->keys, key, (const unsigned char *) name, (int) strlen(name) + 1);
+}
+
+void
+cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size)
+{
+  gridptr->type = gridtype;
+  gridptr->size = size;
+
+  // clang-format off
+  if      (gridtype == GRID_LONLAT)           gridptr->nvertex = 2;
+  else if (gridtype == GRID_GAUSSIAN)         gridptr->nvertex = 2;
+  else if (gridtype == GRID_GAUSSIAN_REDUCED) gridptr->nvertex = 2;
+  else if (gridtype == GRID_CURVILINEAR)      gridptr->nvertex = 4;
+  else if (gridtype == GRID_UNSTRUCTURED)     gridptr->x.size = size;
+  // clang-format on
+
+  switch (gridtype)
+    {
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_GAUSSIAN_REDUCED:
+    case GRID_TRAJECTORY:
+    case GRID_CURVILINEAR:
+    case GRID_UNSTRUCTURED:
+    case GRID_GME:
+      {
+        if (gridtype == GRID_TRAJECTORY)
+          {
+            gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "tlon");
+            gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "tlat");
+          }
+        else
+          {
+            gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "lon");
+            gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "lat");
+          }
+
+        gridaxisSetKey(&gridptr->x, CDI_KEY_LONGNAME, "longitude");
+        gridaxisSetKey(&gridptr->y, CDI_KEY_LONGNAME, "latitude");
+
+        gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees_east");
+        gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees_north");
+
+        gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][0]);
+        gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][1]);
+
+        break;
+      }
+#ifndef USE_MPI
+    case GRID_CHARXY:
+      {
+        if (gridptr->x.cvals) gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][0]);
+        if (gridptr->y.cvals) gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][1]);
+
+        break;
+      }
+#endif
+    case GRID_GENERIC:
+    case GRID_PROJECTION:
+      {
+        gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "x");
+        gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "y");
+        if (gridtype == GRID_PROJECTION)
+          {
+            gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]);
+            gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]);
+            gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m");
+            gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m");
+          }
+        break;
+      }
+    }
+}
+
+// used also in CDO
+void
+gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *restrict xvals)
+{
+  if (fabs(xinc) <= 0 && xsize > 1)
+    {
+      if (xfirst >= xlast)
+        {
+          while (xfirst >= xlast) xlast += 360;
+          xinc = (xlast - xfirst) / (double) xsize;
+        }
+      else
+        {
+          xinc = (xlast - xfirst) / (double) (xsize - 1);
+        }
+    }
+
+  for (size_t i = 0; i < xsize; ++i) xvals[i] = xfirst + (double) i * xinc;
+}
+
+static void
+calc_gaussgrid(double *restrict yvals, size_t ysize, double yfirst, double ylast)
+{
+  double *restrict yw = (double *) Malloc(ysize * sizeof(double));
+  gaussianLatitudes(ysize, yvals, yw);
+  Free(yw);
+  for (size_t i = 0; i < ysize; i++) yvals[i] = asin(yvals[i]) / M_PI * 180.0;
+
+  if (yfirst < ylast && yfirst > -90.0 && ylast < 90.0)
+    {
+      size_t yhsize = ysize / 2;
+      for (size_t i = 0; i < yhsize; i++)
+        {
+          const double ytmp = yvals[i];
+          yvals[i] = yvals[ysize - i - 1];
+          yvals[ysize - i - 1] = ytmp;
+        }
+    }
+}
+
+static void
+gridGenYvalsGaussian(size_t ysize, double yfirst, double ylast, double *restrict yvals)
+{
+  const double deleps = 0.002;
+
+  calc_gaussgrid(yvals, ysize, yfirst, ylast);
+
+  if (!(IS_EQUAL(yfirst, 0) && IS_EQUAL(ylast, 0)))
+    if (fabs(yvals[0] - yfirst) > deleps || fabs(yvals[ysize - 1] - ylast) > deleps)
+      {
+        bool lfound = false;
+        long ny = (long) (180. / (fabs(ylast - yfirst) / (double) (ysize - 1)) + 0.5);
+        ny -= ny % 2;
+        if (ny > 0 && (size_t) ny > ysize && ny < 4096)
+          {
+            double *ytmp = (double *) Malloc((size_t) ny * sizeof(double));
+            calc_gaussgrid(ytmp, (size_t) ny, yfirst, ylast);
+
+            size_t nstart = (size_t) ny - ysize;
+            for (size_t i = 0; i < ((size_t) ny - ysize); i++)
+              if (fabs(ytmp[i] - yfirst) < deleps)
+                {
+                  nstart = i;
+                  break;
+                }
+
+            lfound = (nstart + ysize - 1) < (size_t) ny && fabs(ytmp[nstart + ysize - 1] - ylast) < deleps;
+            if (lfound)
+              {
+                for (size_t i = 0; i < ysize; i++) yvals[i] = ytmp[i + nstart];
+              }
+
+            if (ytmp) Free(ytmp);
+          }
+
+        if (!lfound)
+          {
+            Warning("Cannot calculate gaussian latitudes for lat1 = %g latn = %g!", yfirst, ylast);
+            for (size_t i = 0; i < ysize; i++) yvals[i] = 0;
+            yvals[0] = yfirst;
+            yvals[ysize - 1] = ylast;
+          }
+      }
+}
+
+static void
+gridGenYvalsRegular(size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
+{
+  if (fabs(yinc) <= 0 && ysize > 1)
+    {
+      if (IS_EQUAL(yfirst, ylast) && IS_NOT_EQUAL(yfirst, 0)) ylast *= -1;
+
+      if (yfirst > ylast)
+        yinc = (yfirst - ylast) / (double) (ysize - 1);
+      else if (yfirst < ylast)
+        yinc = (ylast - yfirst) / (double) (ysize - 1);
+      else
+        {
+          if (ysize % 2 != 0)
+            {
+              yinc = 180.0 / (double) (ysize - 1);
+              yfirst = -90;
+            }
+          else
+            {
+              yinc = 180.0 / (double) ysize;
+              yfirst = -90 + yinc / 2;
+            }
+        }
+    }
+
+  if (yfirst > ylast && yinc > 0) yinc = -yinc;
+
+  for (size_t i = 0; i < ysize; i++) yvals[i] = yfirst + (double) i * yinc;
+}
+
+// used also in CDO
+void
+gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals)
+{
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      if (ysize > 2)
+        {
+          gridGenYvalsGaussian(ysize, yfirst, ylast, yvals);
+        }
+      else
+        {
+          yvals[0] = yfirst;
+          yvals[ysize - 1] = ylast;
+        }
+    }
+  // else if (gridtype == GRID_LONLAT || gridtype == GRID_GENERIC)
+  else
+    {
+      gridGenYvalsRegular(ysize, yfirst, ylast, yinc, yvals);
+    }
+  /*
+    else
+    Error("unable to calculate values for %s grid!", gridNamePtr(gridtype));
+  */
+}
+
+/*
+@Function  gridCreate
+@Title     Create a horizontal Grid
+
+@Prototype int gridCreate(int gridtype, SizeType size)
+@Parameter
+    @Item  gridtype  The type of the grid, one of the set of predefined CDI grid types.
+                     The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT},
+                     @func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL},
+                     @func{GRID_GME}, @func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}.
+    @Item  size      Number of gridpoints.
+
+@Description
+The function @func{gridCreate} creates a horizontal Grid.
+
+@Result
+@func{gridCreate} returns an identifier to the Grid.
+
+@Example
+Here is an example using @func{gridCreate} to create a regular lon/lat Grid:
+
+@Source
+   ...
+#define  nlon  12
+#define  nlat   6
+   ...
+double lons[nlon] = {0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330};
+double lats[nlat] = {-75, -45, -15, 15, 45, 75};
+int gridID;
+   ...
+gridID = gridCreate(GRID_LONLAT, nlon*nlat);
+gridDefXsize(gridID, nlon);
+gridDefYsize(gridID, nlat);
+gridDefXvals(gridID, lons);
+gridDefYvals(gridID, lats);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+gridCreate(int gridtype, SizeType size)
+{
+  if (CDI_Debug) Message("gridtype=%s  size=%zu", gridNamePtr(gridtype), (size_t) size);
+
+  xassert(size);
+  gridInit();
+
+  grid_t *gridptr = gridNewEntry(CDI_UNDEFID);
+  if (!gridptr) Error("No memory");
+
+  int gridID = gridptr->self;
+
+  if (CDI_Debug) Message("gridID: %d", gridID);
+
+  cdiGridTypeInit(gridptr, gridtype, (size_t) size);
+
+  return gridID;
+}
+
+static void
+gridDestroyKernel(grid_t *gridptr)
+{
+  xassert(gridptr);
+
+  grid_free_components(gridptr);
+  Free(gridptr);
+}
+
+/*
+@Function  gridDestroy
+@Title     Destroy a horizontal Grid
+
+@Prototype void gridDestroy(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+
+@EndFunction
+*/
+void
+gridDestroy(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->destroy(gridptr);
+  reshRemove(gridID, &gridOps);
+}
+
+static void
+gridDestroyP(void *gridptr)
+{
+  ((grid_t *) gridptr)->vtable->destroy((grid_t *) gridptr);
+}
+
+const char *
+gridNamePtr(int gridtype)
+{
+  int size = (int) (sizeof(Grids) / sizeof(Grids[0]));
+
+  const char *name = (gridtype >= 0 && gridtype < size) ? Grids[gridtype] : Grids[GRID_GENERIC];
+
+  return name;
+}
+
+void
+gridName(int gridtype, char *gridname)
+{
+  strcpy(gridname, gridNamePtr(gridtype));
+}
+
+/*
+@Function  gridDefXname
+@Title     Define the name of a X-axis
+
+@Prototype void gridDefXname(int gridID, const char *name)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  name     Name of the X-axis.
+
+@Description
+The function @func{gridDefXname} defines the name of a X-axis.
+
+@EndFunction
+*/
+void
+gridDefXname(int gridID, const char *name)
+{
+  (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name);
+}
+
+/*
+@Function  gridDefXlongname
+@Title     Define the longname of a X-axis
+
+@Prototype void gridDefXlongname(int gridID, const char *longname)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  longname Longname of the X-axis.
+
+@Description
+The function @func{gridDefXlongname} defines the longname of a X-axis.
+
+@EndFunction
+*/
+void
+gridDefXlongname(int gridID, const char *longname)
+{
+  (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname);
+}
+
+/*
+@Function  gridDefXunits
+@Title     Define the units of a X-axis
+
+@Prototype void gridDefXunits(int gridID, const char *units)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  units    Units of the X-axis.
+
+@Description
+The function @func{gridDefXunits} defines the units of a X-axis.
+
+@EndFunction
+*/
+void
+gridDefXunits(int gridID, const char *units)
+{
+  (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units);
+}
+
+/*
+@Function  gridDefYname
+@Title     Define the name of a Y-axis
+
+@Prototype void gridDefYname(int gridID, const char *name)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  name     Name of the Y-axis.
+
+@Description
+The function @func{gridDefYname} defines the name of a Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYname(int gridID, const char *name)
+{
+  (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name);
+}
+
+/*
+@Function  gridDefYlongname
+@Title     Define the longname of a Y-axis
+
+@Prototype void gridDefYlongname(int gridID, const char *longname)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  longname Longname of the Y-axis.
+
+@Description
+The function @func{gridDefYlongname} defines the longname of a Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYlongname(int gridID, const char *longname)
+{
+  (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname);
+}
+
+/*
+@Function  gridDefYunits
+@Title     Define the units of a Y-axis
+
+@Prototype void gridDefYunits(int gridID, const char *units)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  units    Units of the Y-axis.
+
+@Description
+The function @func{gridDefYunits} defines the units of a Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYunits(int gridID, const char *units)
+{
+  (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units);
+}
+
+/*
+@Function  gridInqXname
+@Title     Get the name of a X-axis
+
+@Prototype void gridInqXname(int gridID, char *name)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  name     Name of the X-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqXname} returns the name of a X-axis.
+
+@Result
+@func{gridInqXname} returns the name of the X-axis to the parameter name.
+
+@EndFunction
+*/
+void
+gridInqXname(int gridID, char *name)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name, &length);
+}
+
+/*
+@Function  gridInqXlongname
+@Title     Get the longname of a X-axis
+
+@Prototype void gridInqXlongname(int gridID, char *longname)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  longname Longname of the X-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqXlongname} returns the longname of a X-axis.
+
+@Result
+@func{gridInqXlongname} returns the longname of the X-axis to the parameter longname.
+
+@EndFunction
+*/
+void
+gridInqXlongname(int gridID, char *longname)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname, &length);
+}
+
+/*
+@Function  gridInqXunits
+@Title     Get the units of a X-axis
+
+@Prototype void gridInqXunits(int gridID, char *units)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  units    Units of the X-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqXunits} returns the units of a X-axis.
+
+@Result
+@func{gridInqXunits} returns the units of the X-axis to the parameter units.
+
+@EndFunction
+*/
+void
+gridInqXunits(int gridID, char *units)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units, &length);
+}
+
+/*
+@Function  gridInqYname
+@Title     Get the name of a Y-axis
+
+@Prototype void gridInqYname(int gridID, char *name)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  name     Name of the Y-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqYname} returns the name of a Y-axis.
+
+@Result
+@func{gridInqYname} returns the name of the Y-axis to the parameter name.
+
+@EndFunction
+*/
+void
+gridInqYname(int gridID, char *name)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name, &length);
+}
+
+/*
+@Function  gridInqYlongname
+@Title     Get the longname of a Y-axis
+
+@Prototype void gridInqYlongname(int gridID, char *longname)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  longname Longname of the Y-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqYlongname} returns the longname of a Y-axis.
+
+@Result
+@func{gridInqYlongname} returns the longname of the Y-axis to the parameter longname.
+
+@EndFunction
+*/
+void
+gridInqYlongname(int gridID, char *longname)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname, &length);
+}
+
+/*
+@Function  gridInqYunits
+@Title     Get the units of a Y-axis
+
+@Prototype void gridInqYunits(int gridID, char *units)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  units    Units of the Y-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{gridInqYunits} returns the units of a Y-axis.
+
+@Result
+@func{gridInqYunits} returns the units of the Y-axis to the parameter units.
+
+@EndFunction
+*/
+void
+gridInqYunits(int gridID, char *units)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units, &length);
+}
+
+void
+gridDefProj(int gridID, int projID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->proj = projID;
+
+  if (gridptr->type == GRID_CURVILINEAR)
+    {
+      grid_t *projptr = grid_to_pointer(projID);
+      const char *xdimname = cdiInqVarKeyStringPtr(&gridptr->x.keys, CDI_KEY_DIMNAME);
+      const char *ydimname = cdiInqVarKeyStringPtr(&gridptr->y.keys, CDI_KEY_DIMNAME);
+      if (xdimname && find_key(&projptr->x.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_XAXIS, CDI_KEY_NAME, xdimname);
+      if (ydimname && find_key(&projptr->y.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_YAXIS, CDI_KEY_NAME, ydimname);
+    }
+}
+
+int
+gridInqProj(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->proj;
+}
+
+int
+gridInqProjType(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  int projtype = gridptr->projtype;
+  if (projtype == -1)
+    {
+      char gmapname[CDI_MAX_NAME];
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length);
+      if (gmapname[0])
+        {
+          // clang-format off
+          if      (str_is_equal(gmapname, "rotated_latitude_longitude"))   projtype = CDI_PROJ_RLL;
+          else if (str_is_equal(gmapname, "lambert_azimuthal_equal_area")) projtype = CDI_PROJ_LAEA;
+          else if (str_is_equal(gmapname, "lambert_conformal_conic"))      projtype = CDI_PROJ_LCC;
+          else if (str_is_equal(gmapname, "sinusoidal"))                   projtype = CDI_PROJ_SINU;
+          else if (str_is_equal(gmapname, "polar_stereographic"))          projtype = CDI_PROJ_STERE;
+          else if (str_is_equal(gmapname, "healpix"))                      projtype = CDI_PROJ_HEALPIX;
+          // clang-format on
+          gridptr->projtype = projtype;
+        }
+    }
+
+  return projtype;
+}
+
+void
+gridVerifyProj(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  int projtype = gridInqProjType(gridID);
+  if (projtype == CDI_PROJ_RLL)
+    {
+      gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]);
+      gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]);
+      gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees");
+      gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees");
+    }
+  else if (projtype == CDI_PROJ_LCC)
+    {
+      gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]);
+      gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]);
+      gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m");
+      gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m");
+    }
+}
+
+/*
+@Function  gridInqType
+@Title     Get the type of a Grid
+
+@Prototype int gridInqType(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqType} returns the type of a Grid.
+
+@Result
+@func{gridInqType} returns the type of the grid,
+one of the set of predefined CDI grid types.
+The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT},
+@func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL}, @func{GRID_GME},
+@func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}.
+
+@EndFunction
+*/
+int
+gridInqType(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->type;
+}
+
+/*
+@Function  gridInqSize
+@Title     Get the size of a Grid
+
+@Prototype SizeType gridInqSize(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqSize} returns the size of a Grid.
+
+@Result
+@func{gridInqSize} returns the number of grid points of a Grid.
+
+@EndFunction
+*/
+SizeType
+gridInqSize(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  size_t size = gridptr->size;
+  if (size == 0)
+    {
+      size_t xsize = gridptr->x.size;
+      size_t ysize = gridptr->y.size;
+
+      size = ysize ? xsize * ysize : xsize;
+
+      gridptr->size = size;
+    }
+
+  return (SizeType) size;
+}
+
+static int
+nsp2trunc(size_t nsp)
+{
+  /*  nsp = (trunc+1)*(trunc+1)              */
+  /*      => trunc^2 + 3*trunc - (x-2) = 0   */
+  /*                                         */
+  /*  with:  y^2 + p*y + q = 0               */
+  /*         y = -p/2 +- sqrt((p/2)^2 - q)   */
+  /*         p = 3 and q = - (x-2)           */
+  int trunc = (int) (sqrt((double) nsp * 4 + 1.) - 3) / 2;
+  return trunc;
+}
+
+int
+gridInqTrunc(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->trunc == 0)
+    {
+      if (gridptr->type == GRID_SPECTRAL) gridptr->trunc = nsp2trunc(gridptr->size);
+      /*
+      else if      ( gridptr->type == GRID_GAUSSIAN )
+        gridptr->trunc = nlat2trunc(gridptr->y.size);
+      */
+    }
+
+  return gridptr->trunc;
+}
+
+void
+gridDefTrunc(int gridID, int trunc)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->trunc != trunc)
+    {
+      gridMark4Update(gridID);
+      gridptr->trunc = trunc;
+    }
+}
+
+/*
+@Function  gridDefXsize
+@Title     Define the number of values of a X-axis
+
+@Prototype void gridDefXsize(int gridID, SizeType xsize)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  xsize    Number of values of a X-axis.
+
+@Description
+The function @func{gridDefXsize} defines the number of values of a X-axis.
+
+@EndFunction
+*/
+void
+gridDefXsize(int gridID, SizeType xsize)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  SizeType gridSize = gridInqSize(gridID);
+  if (xsize > gridSize) Error("xsize %lld is greater then gridsize %lld", (long long) xsize, (long long) gridSize);
+
+  int gridType = gridInqType(gridID);
+  if (gridType == GRID_UNSTRUCTURED && xsize != gridSize)
+    Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize,
+          gridNamePtr(gridType));
+  if (gridType == GRID_GAUSSIAN_REDUCED && xsize != 2 && xsize != gridSize)
+    Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize,
+          gridNamePtr(gridType));
+
+  if (gridptr->x.size != (size_t) xsize)
+    {
+      gridMark4Update(gridID);
+      gridptr->x.size = (size_t) xsize;
+    }
+
+  if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION)
+    {
+      size_t axisproduct = gridptr->x.size * gridptr->y.size;
+      if (axisproduct > 0 && axisproduct != (size_t) gridSize)
+        Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size,
+              (size_t) gridSize);
+    }
+}
+
+void
+gridDefDatatype(int gridID, int datatype)
+{
+  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype);
+}
+
+int
+gridInqDatatype(int gridID)
+{
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  return datatype;
+}
+
+/*
+@Function  gridInqXsize
+@Title     Get the number of values of a X-axis
+
+@Prototype SizeType gridInqXsize(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqXsize} returns the number of values of a X-axis.
+
+@Result
+@func{gridInqXsize} returns the number of values of a X-axis.
+
+@EndFunction
+*/
+SizeType
+gridInqXsize(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return (SizeType) gridptr->x.size;
+}
+
+/*
+@Function  gridDefYsize
+@Title     Define the number of values of a Y-axis
+
+@Prototype void gridDefYsize(int gridID, SizeType ysize)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  ysize    Number of values of a Y-axis.
+
+@Description
+The function @func{gridDefYsize} defines the number of values of a Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYsize(int gridID, SizeType ysize)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  SizeType gridSize = gridInqSize(gridID);
+
+  if (ysize > gridSize) Error("ysize %lld is greater then gridsize %lld", (long long) ysize, (long long) gridSize);
+
+  int gridType = gridInqType(gridID);
+  if (gridType == GRID_UNSTRUCTURED && ysize != gridSize)
+    Error("ysize %lld must be equal gridsize %lld for gridtype: %s", (long long) ysize, (long long) gridSize,
+          gridNamePtr(gridType));
+
+  if (gridptr->y.size != (size_t) ysize)
+    {
+      gridMark4Update(gridID);
+      gridptr->y.size = (size_t) ysize;
+    }
+
+  if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION)
+    {
+      size_t axisproduct = gridptr->x.size * gridptr->y.size;
+      if (axisproduct > 0 && axisproduct != (size_t) gridSize)
+        Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size,
+              (size_t) gridSize);
+    }
+}
+
+/*
+@Function  gridInqYsize
+@Title     Get the number of values of a Y-axis
+
+@Prototype SizeType gridInqYsize(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqYsize} returns the number of values of a Y-axis.
+
+@Result
+@func{gridInqYsize} returns the number of values of a Y-axis.
+
+@EndFunction
+*/
+SizeType
+gridInqYsize(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return (SizeType) gridptr->y.size;
+}
+
+/*
+@Function  gridDefNP
+@Title     Define the number of parallels between a pole and the equator
+
+@Prototype void gridDefNP(int gridID, int np)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  np       Number of parallels between a pole and the equator.
+
+@Description
+The function @func{gridDefNP} defines the number of parallels between a pole and the equator
+of a Gaussian grid.
+
+@EndFunction
+*/
+void
+gridDefNP(int gridID, int np)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->np != np)
+    {
+      gridMark4Update(gridID);
+      gridptr->np = np;
+    }
+}
+
+/*
+@Function  gridInqNP
+@Title     Get the number of parallels between a pole and the equator
+
+@Prototype int gridInqNP(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqNP} returns the number of parallels between a pole and the equator
+of a Gaussian grid.
+
+@Result
+@func{gridInqNP} returns the number of parallels between a pole and the equator.
+
+@EndFunction
+*/
+int
+gridInqNP(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->np;
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[])
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  gridptr->reducedPoints = (int *) Malloc((size_t) reducedPointsSize * sizeof(int));
+  gridptr->reducedPointsSize = reducedPointsSize;
+  memcpy(gridptr->reducedPoints, reducedPoints, (size_t) reducedPointsSize * sizeof(int));
+  gridMark4Update(gridID);
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridInqReducedPoints(int gridID, int *reducedPoints)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->reducedPoints == 0) Error("undefined pointer!");
+
+  memcpy(reducedPoints, gridptr->reducedPoints, (size_t) gridptr->reducedPointsSize * sizeof(int));
+}
+
+static SizeType
+gridInqMaskSerialGeneric(grid_t *gridptr, mask_t **internalMask, int *restrict mask)
+{
+  size_t size = gridptr->size;
+
+  if (CDI_Debug && size == 0) Warning("Size undefined for gridID = %d", gridptr->self);
+
+  const mask_t *restrict mask_src = *internalMask;
+  if (mask_src)
+    {
+      if (mask && size > 0)
+        for (size_t i = 0; i < size; ++i) mask[i] = (int) mask_src[i];
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+static SizeType
+gridInqMaskSerial(grid_t *gridptr, int *mask)
+{
+  return gridInqMaskSerialGeneric(gridptr, &gridptr->mask, mask);
+}
+
+int
+gridInqMask(int gridID, int *mask)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqMask(gridptr, mask);
+}
+
+static void
+gridDefMaskSerial(grid_t *gridptr, const int *mask)
+{
+  size_t size = gridptr->size;
+  if (size == 0) Error("Size undefined for gridID = %d", gridptr->self);
+
+  if (mask == NULL)
+    {
+      if (gridptr->mask)
+        {
+          Free(gridptr->mask);
+          gridptr->mask = NULL;
+        }
+    }
+  else
+    {
+      if (gridptr->mask == NULL)
+        gridptr->mask = (mask_t *) Malloc(size * sizeof(mask_t));
+      else if (CDI_Debug)
+        Warning("grid mask already defined!");
+
+      for (size_t i = 0; i < size; ++i) gridptr->mask[i] = (mask_t) (mask[i] != 0);
+    }
+}
+
+void
+gridDefMask(int gridID, const int *mask)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defMask(gridptr, mask);
+  gridMark4Update(gridID);
+}
+
+static int
+gridInqMaskGMESerial(grid_t *gridptr, int *mask_gme)
+{
+  return (int) gridInqMaskSerialGeneric(gridptr, &gridptr->mask_gme, mask_gme);
+}
+
+int
+gridInqMaskGME(int gridID, int *mask)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqMaskGME(gridptr, mask);
+}
+
+static void
+gridDefMaskGMESerial(grid_t *gridptr, const int *mask)
+{
+  size_t size = gridptr->size;
+  if (size == 0) Error("Size undefined for gridID = %d", gridptr->self);
+
+  if (gridptr->mask_gme == NULL)
+    gridptr->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t));
+  else if (CDI_Debug)
+    Warning("mask already defined!");
+
+  for (size_t i = 0; i < size; ++i) gridptr->mask_gme[i] = (mask_t) (mask[i] != 0);
+}
+
+void
+gridDefMaskGME(int gridID, const int *mask)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defMaskGME(gridptr, mask);
+  gridMark4Update(gridID);
+}
+
+static void
+copy_darray(size_t n, const double *restrict in, double *restrict out)
+{
+#ifdef _OPENMP
+#pragma omp parallel for if (n > 99999) default(shared) schedule(static)
+#endif
+  for (size_t i = 0; i < n; ++i) out[i] = in[i];
+}
+
+static SizeType
+gridInqXValsSerial(grid_t *gridptr, double *xvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->x.size;
+
+  if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self);
+
+  if (gridptr->x.vals)
+    {
+      if (size && xvals)
+        {
+          const double *gridptr_xvals = gridptr->vtable->inqXValsPtr(gridptr);
+          copy_darray(size, gridptr_xvals, xvals);
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+static SizeType
+gridInqXValsPartSerial(grid_t *gridptr, int start, SizeType length, double *xvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->x.size;
+
+  if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self);
+
+  if (gridptr->x.vals)
+    {
+      if (size && xvals && (size_t) length <= size)
+        {
+          const double *gridptr_xvals = gridptr->vtable->inqXValsPtr(gridptr);
+          memcpy(xvals, gridptr_xvals + start, (size_t) length * sizeof(double));
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+#ifndef USE_MPI
+static SizeType
+gridInqXCvalsSerial(grid_t *gridptr, char **xcvals)
+{
+  if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'.");
+
+  size_t size = gridptr->x.size;
+  size_t maxclength = 0;
+
+  const char **gridptr_xcvals = gridptr->vtable->inqXCvalsPtr(gridptr);
+  if (gridptr_xcvals && size && xcvals)
+    {
+      maxclength = (size_t) gridptr->x.clength;
+      for (size_t i = 0; i < size; i++) memcpy(xcvals[i], gridptr_xcvals[i], maxclength * sizeof(char));
+    }
+
+  return (SizeType) maxclength;
+}
+
+static int
+gridInqXIscSerial(grid_t *gridptr)
+{
+  /*
+  if ( gridptr->type != GRID_CHARXY )
+    Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'.");
+  */
+  return gridptr->x.clength;
+}
+#endif
+
+/*
+@Function  gridInqXvals
+@Title     Get all values of a X-axis
+
+@Prototype SizeType gridInqXvals(int gridID, double *xvals)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  xvals    Pointer to the location into which the X-values are read.
+                    The caller must allocate space for the returned values.
+
+@Description
+The function @func{gridInqXvals} returns all values of the X-axis.
+
+@Result
+Upon successful completion @func{gridInqXvals} returns the number of values and
+the values are stored in @func{xvals}.
+Otherwise, 0 is returned and @func{xvals} is empty.
+
+@EndFunction
+*/
+SizeType
+gridInqXvals(int gridID, double *xvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXVals(gridptr, xvals);
+}
+
+SizeType
+gridInqXvalsPart(int gridID, int start, SizeType length, double *xvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXValsPart(gridptr, start, length, xvals);
+}
+
+SizeType
+gridInqXCvals(int gridID, char **xcvals)
+{
+#ifndef USE_MPI
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXCvals(gridptr, xcvals);
+#else
+  (void) gridID;
+  (void) xcvals;
+  return 0;
+#endif
+}
+
+int
+gridInqXIsc(int gridID)
+{
+#ifndef USE_MPI
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXIsc(gridptr);
+#else
+  (void) gridID;
+  return 0;
+#endif
+}
+
+static void
+gridDefXValsSerial(grid_t *gridptr, const double *xvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->x.size;
+
+  if (size == 0) Error("Size undefined for gridID = %d", gridptr->self);
+
+  if (gridptr->x.vals && CDI_Debug) Warning("values already defined!");
+  gridptr->x.vals = (double *) Realloc(gridptr->x.vals, size * sizeof(double));
+  copy_darray(size, xvals, gridptr->x.vals);
+}
+
+#ifndef USE_MPI
+static SizeType
+gridInqYCvalsSerial(grid_t *gridptr, char **ycvals)
+{
+  if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'.");
+
+  size_t size = gridptr->y.size;
+  size_t maxclength = 0;
+
+  const char **gridptr_ycvals = gridptr->vtable->inqYCvalsPtr(gridptr);
+  if (gridptr_ycvals && size && ycvals)
+    {
+      maxclength = (size_t) gridptr->y.clength;
+      for (size_t i = 0; i < size; i++) memcpy(ycvals[i], gridptr_ycvals[i], maxclength);
+    }
+
+  return (SizeType) maxclength;
+}
+
+static int
+gridInqYIscSerial(grid_t *gridptr)
+{
+  // if ( gridptr->type != GRID_CHARXY ) Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'.");
+  return gridptr->y.clength;
+}
+#endif
+
+/*
+@Function  gridDefXvals
+@Title     Define the values of a X-axis
+
+@Prototype void gridDefXvals(int gridID, const double *xvals)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  xvals    X-values of the grid.
+
+@Description
+The function @func{gridDefXvals} defines all values of the X-axis.
+
+@EndFunction
+*/
+void
+gridDefXvals(int gridID, const double *xvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defXVals(gridptr, xvals);
+  gridMark4Update(gridID);
+}
+
+static SizeType
+gridInqYValsSerial(grid_t *gridptr, double *yvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->y.size;
+
+  if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self);
+
+  if (gridptr->y.vals)
+    {
+      if (size && yvals)
+        {
+          const double *gridptr_yvals = gridptr->vtable->inqYValsPtr(gridptr);
+          copy_darray(size, gridptr_yvals, yvals);
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+static SizeType
+gridInqYValsPartSerial(grid_t *gridptr, int start, SizeType length, double *yvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->y.size;
+
+  if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self);
+
+  if (gridptr->y.vals)
+    {
+      if (size && yvals && (size_t) length <= size)
+        {
+          const double *gridptr_yvals = gridptr->vtable->inqYValsPtr(gridptr);
+          memcpy(yvals, gridptr_yvals + start, (size_t) length * sizeof(double));
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+/*
+@Function  gridInqYvals
+@Title     Get all values of a Y-axis
+
+@Prototype SizeType gridInqYvals(int gridID, double *yvals)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  yvals    Pointer to the location into which the Y-values are read.
+                    The caller must allocate space for the returned values.
+
+@Description
+The function @func{gridInqYvals} returns all values of the Y-axis.
+
+@Result
+Upon successful completion @func{gridInqYvals} returns the number of values and
+the values are stored in @func{yvals}.
+Otherwise, 0 is returned and @func{yvals} is empty.
+
+@EndFunction
+*/
+SizeType
+gridInqYvals(int gridID, double *yvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYVals(gridptr, yvals);
+}
+
+SizeType
+gridInqYvalsPart(int gridID, int start, SizeType size, double *yvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYValsPart(gridptr, start, size, yvals);
+}
+
+SizeType
+gridInqYCvals(int gridID, char **ycvals)
+{
+#ifndef USE_MPI
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYCvals(gridptr, ycvals);
+#else
+  (void) gridID;
+  (void) ycvals;
+  return 0;
+#endif
+}
+
+int
+gridInqYIsc(int gridID)
+{
+#ifndef USE_MPI
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYIsc(gridptr);
+#else
+  (void) gridID;
+  return 0;
+#endif
+}
+
+static void
+gridDefYValsSerial(grid_t *gridptr, const double *yvals)
+{
+  int gridtype = gridptr->type;
+  size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->y.size;
+
+  if (size == 0) Error("Size undefined for gridID = %d!", gridptr->self);
+
+  if (gridptr->y.vals && CDI_Debug) Warning("Values already defined!");
+
+  gridptr->y.vals = (double *) Realloc(gridptr->y.vals, size * sizeof(double));
+  copy_darray(size, yvals, gridptr->y.vals);
+}
+
+/*
+@Function  gridDefYvals
+@Title     Define the values of a Y-axis
+
+@Prototype void gridDefYvals(int gridID, const double *yvals)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  yvals    Y-values of the grid.
+
+@Description
+The function @func{gridDefYvals} defines all values of the Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYvals(int gridID, const double *yvals)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defYVals(gridptr, yvals);
+  gridMark4Update(gridID);
+}
+
+static double
+gridInqXValSerial(grid_t *gridptr, SizeType index)
+{
+  const double xval = gridptr->x.vals ? gridptr->x.vals[index] : 0;
+  return xval;
+}
+
+double
+gridInqXval(int gridID, SizeType index)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXVal(gridptr, index);
+}
+
+static double
+gridInqYValSerial(grid_t *gridptr, SizeType index)
+{
+  const double yval = gridptr->y.vals ? gridptr->y.vals[index] : 0;
+  return yval;
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+double
+gridInqYval(int gridID, SizeType index)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYVal(gridptr, index);
+}
+
+static double
+grid_calc_increment(size_t size, const double *vals)
+{
+  if (size > 1)
+    {
+      double inc = (vals[size - 1] - vals[0]) / (double) (size - 1);
+      const double abs_inc = fabs(inc);
+      for (size_t i = 1; i < size; ++i)
+        if (fabs(fabs(vals[i - 1] - vals[i]) - abs_inc) > 0.01 * abs_inc)
+          {
+            inc = 0.0;
+            break;
+          }
+
+      return inc;
+    }
+
+  return 0.0;
+}
+
+static double
+grid_calc_increment_in_meter(size_t size, const double *vals)
+{
+  if (size > 1)
+    {
+      const double inc = (vals[size - 1] - vals[0]) / (double) (size - 1);
+      return round(fabs(inc));
+    }
+
+  return 0.0;
+}
+
+static double
+gridInqXIncBase(grid_t *gridptr)
+{
+  if (fabs(gridptr->x.inc) <= 0 && gridptr->x.vals)
+    {
+      size_t xsize = gridptr->x.size;
+      if (xsize > 1)
+        {
+          const double *xvals = gridptr->vtable->inqXValsPtr(gridptr);
+          gridptr->x.inc = grid_calc_increment(xsize, xvals);
+        }
+    }
+
+  return gridptr->x.inc;
+}
+
+double
+gridInqXincInMeter(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  const double *xvals = gridptr->vtable->inqXValsPtr(gridptr);
+
+  if (fabs(gridptr->x.inc) <= 0 && xvals)
+    {
+      size_t xsize = gridptr->x.size;
+      if (xsize > 1) gridptr->x.inc = grid_calc_increment_in_meter(xsize, xvals);
+    }
+
+  return gridptr->x.inc;
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+double
+gridInqXinc(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXInc(gridptr);
+}
+
+static double
+gridInqYIncBase(grid_t *gridptr)
+{
+  if (fabs(gridptr->y.inc) <= 0 && gridptr->y.vals)
+    {
+      size_t ysize = gridptr->y.size;
+      if (ysize > 1)
+        {
+          const double *yvals = gridptr->vtable->inqYValsPtr(gridptr);
+          gridptr->y.inc = grid_calc_increment(ysize, yvals);
+        }
+    }
+
+  return gridptr->y.inc;
+}
+
+double
+gridInqYincInMeter(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  const double *yvals = gridptr->vtable->inqYValsPtr(gridptr);
+
+  if (fabs(gridptr->y.inc) <= 0 && yvals)
+    {
+      size_t ysize = gridptr->y.size;
+      if (ysize > 1) gridptr->y.inc = grid_calc_increment_in_meter(ysize, yvals);
+    }
+
+  return gridptr->y.inc;
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+double
+gridInqYinc(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYInc(gridptr);
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle)
+{
+  *xpole = 0;
+  *ypole = 0;
+  *angle = 0;
+
+  static const char projection[] = "rotated_latitude_longitude";
+  char name[CDI_MAX_NAME + 1];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, name, &length);
+  if (name[0] && str_is_equal(name, projection))
+    {
+      int atttype, attlen;
+
+      int natts, nfound = 0;
+      cdiInqNatts(gridID, CDI_GLOBAL, &natts);
+
+      for (int iatt = 0; iatt < natts; ++iatt)
+        {
+          cdiInqAtt(gridID, CDI_GLOBAL, iatt, name, &atttype, &attlen);
+          if (attlen == 1)
+            {
+              double *attflt;
+              // clang-format off
+              if      (str_is_equal(name, "grid_north_pole_longitude")) attflt = xpole;
+              else if (str_is_equal(name, "grid_north_pole_latitude") ) attflt = ypole;
+              else if (str_is_equal(name, "north_pole_grid_longitude")) attflt = angle;
+              else continue;
+              // clang-format on
+              bool valid = cdiInqAttConvertedToFloat(gridID, atttype, name, attlen, attflt);
+              if ((nfound += valid) == 3) return;
+            }
+        }
+    }
+  else
+    Warning("%s mapping parameter missing!", projection);
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridDefParamRLL(int gridID, double xpole, double ypole, double angle)
+{
+  cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees");
+  cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees");
+
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "rotated_pole");
+
+  const char *gmapname = "rotated_latitude_longitude";
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname);
+  cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_longitude", CDI_DATATYPE_FLT64, 1, &xpole);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_latitude", CDI_DATATYPE_FLT64, 1, &ypole);
+  if (IS_NOT_EQUAL(angle, 0)) cdiDefAttFlt(gridID, CDI_GLOBAL, "north_pole_grid_longitude", CDI_DATATYPE_FLT64, 1, &angle);
+
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->projtype = CDI_PROJ_RLL;
+
+  gridVerifyProj(gridID);
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  *nd = gridptr->gme.nd;
+  *ni = gridptr->gme.ni;
+  *ni2 = gridptr->gme.ni2;
+  *ni3 = gridptr->gme.ni3;
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->gme.nd != nd)
+    {
+      gridptr->gme.nd = nd;
+      gridptr->gme.ni = ni;
+      gridptr->gme.ni2 = ni2;
+      gridptr->gme.ni3 = ni3;
+      gridMark4Update(gridID);
+    }
+}
+
+/*
+@Function
+@Title
+
+@Prototype
+@Parameter
+    @Item  Grid identifier
+
+@EndFunction
+*/
+void
+gridChangeType(int gridID, int gridtype)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (CDI_Debug) Message("Changed grid type from %s to %s", gridNamePtr(gridptr->type), gridNamePtr(gridtype));
+
+  if (gridptr->type != gridtype)
+    {
+      gridptr->type = gridtype;
+      gridMark4Update(gridID);
+    }
+}
+
+static void
+grid_check_cyclic(grid_t *gridptr)
+{
+  gridptr->isCyclic = 0;
+  enum
+  {
+    numVertices = 4
+  };
+  size_t xsize = gridptr->x.size, ysize = gridptr->y.size;
+  const double *xvals = gridptr->vtable->inqXValsPtr(gridptr), *yvals = gridptr->vtable->inqYValsPtr(gridptr),
+               (*xbounds)[numVertices] = (const double(*)[numVertices]) gridptr->vtable->inqXBoundsPtr(gridptr);
+
+  if (gridptr->type == GRID_GAUSSIAN || gridptr->type == GRID_LONLAT)
+    {
+      if (xvals && xsize > 1)
+        {
+          double xval1 = xvals[0];
+          double xval2 = xvals[1];
+          double xvaln = xvals[xsize - 1];
+          if (xval2 < xval1) xval2 += 360;
+          if (xvaln < xval1) xvaln += 360;
+
+          if (IS_NOT_EQUAL(xval1, xvaln))
+            {
+              double xinc = xval2 - xval1;
+              if (IS_EQUAL(xinc, 0)) xinc = (xvaln - xval1) / (double) (xsize - 1);
+
+              const double x0 = xvaln + xinc - 360;
+
+              if (fabs(x0 - xval1) < 0.01 * xinc) gridptr->isCyclic = 1;
+            }
+        }
+    }
+  else if (gridptr->type == GRID_CURVILINEAR)
+    {
+      bool lcheck = true;
+      if (yvals && xvals)
+        {
+          if ((fabs(yvals[0] - yvals[xsize - 1]) > fabs(yvals[0] - yvals[xsize * ysize - xsize]))
+              && (fabs(yvals[xsize * ysize - xsize] - yvals[xsize * ysize - 1])
+                  > fabs(yvals[xsize - 1] - yvals[xsize * ysize - 1])))
+            lcheck = false;
+        }
+      else
+        lcheck = false;
+
+      if (lcheck && xvals && xsize > 1)
+        {
+          size_t nc = 0;
+          for (size_t j = 0; j < ysize; ++j)
+            {
+              size_t i1 = j * xsize, i2 = j * xsize + 1, in = j * xsize + (xsize - 1);
+              double val1 = xvals[i1], val2 = xvals[i2], valn = xvals[in];
+              double xinc = fabs(val2 - val1);
+
+              if (val1 < 1 && valn > 300) val1 += 360;
+              if (valn < 1 && val1 > 300) valn += 360;
+              if (val1 < -179 && valn > 120) val1 += 360;
+              if (valn < -179 && val1 > 120) valn += 360;
+              if (fabs(valn - val1) > 180) val1 += 360;
+
+              double x0 = valn + copysign(xinc, val1 - valn);
+
+              nc += fabs(x0 - val1) < 0.5 * xinc;
+            }
+          gridptr->isCyclic = nc > ysize / 2;
+        }
+
+      if (lcheck && xbounds && xsize > 1)
+        {
+          bool isCyclic = true;
+          for (size_t j = 0; j < ysize; ++j)
+            {
+              size_t i1 = j * xsize, i2 = j * xsize + (xsize - 1);
+              for (size_t k1 = 0; k1 < numVertices; ++k1)
+                {
+                  double val1 = xbounds[i1][k1];
+                  for (size_t k2 = 0; k2 < numVertices; ++k2)
+                    {
+                      double val2 = xbounds[i2][k2];
+
+                      if (val1 < 1 && val2 > 300) val1 += 360;
+                      if (val2 < 1 && val1 > 300) val2 += 360;
+                      if (val1 < -179 && val2 > 120) val1 += 360;
+                      if (val2 < -179 && val1 > 120) val2 += 360;
+                      if (fabs(val2 - val1) > 180) val1 += 360;
+
+                      if (fabs(val1 - val2) < 0.001) goto foundCloseVertices;
+                    }
+                }
+              // all vertices more than 0.001 degrees apart
+              isCyclic = false;
+              break;
+            foundCloseVertices:;
+            }
+          gridptr->isCyclic = isCyclic;
+        }
+    }
+}
+
+int
+gridIsCircular(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->isCyclic == CDI_UNDEFID) grid_check_cyclic(gridptr);
+
+  return gridptr->isCyclic;
+}
+
+static bool
+compareXYvals(grid_t *gridRef, grid_t *gridTest)
+{
+  bool differ = false;
+  int gridtype = gridTest->type;
+
+  size_t xsizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->x.size;
+  size_t xsizeRef = (size_t) gridRef->vtable->inqXVals(gridRef, NULL);
+  if (xsizeTest != xsizeRef) return true;
+
+  if (xsizeTest > 0)
+    {
+      const double *xvalsRef = gridRef->vtable->inqXValsPtr(gridRef);
+      const double *xvalsTest = gridTest->vtable->inqXValsPtr(gridTest);
+      if (!xvalsTest) return true;
+
+      for (size_t i = 0; i < xsizeTest; ++i)
+        if (fabs(xvalsTest[i] - xvalsRef[i]) > 1.e-10) return true;
+    }
+
+  size_t ysizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->y.size;
+  size_t ysizeRef = (size_t) gridRef->vtable->inqYVals(gridRef, NULL);
+  if (ysizeTest != ysizeRef) return true;
+
+  if (ysizeTest > 0)
+    {
+      const double *yvalsRef = gridRef->vtable->inqYValsPtr(gridRef);
+      const double *yvalsTest = gridTest->vtable->inqYValsPtr(gridTest);
+      if (!yvalsTest) return true;
+
+      for (size_t i = 0; i < ysizeTest; ++i)
+        if (fabs(yvalsTest[i] - yvalsRef[i]) > 1.e-10) return true;
+    }
+
+  return differ;
+}
+
+static bool
+compareXYvals2(grid_t *gridRef, grid_t *gridTest)
+{
+  size_t gridsize = gridTest->size;
+  bool differ = ((gridTest->x.vals == NULL) ^ (gridRef->x.vals == NULL)) || ((gridTest->y.vals == NULL) ^ (gridRef->y.vals == NULL))
+                || ((gridTest->x.bounds == NULL) ^ (gridRef->x.bounds == NULL))
+                || ((gridTest->y.bounds == NULL) ^ (gridRef->y.bounds == NULL));
+
+  typedef double (*inqVal)(grid_t * grid, SizeType index);
+  inqVal inqXValRef = gridRef->vtable->inqXVal, inqYValRef = gridRef->vtable->inqYVal, inqXValTest = gridTest->vtable->inqXVal,
+         inqYValTest = gridTest->vtable->inqYVal;
+
+  if (!differ && gridTest->x.vals)
+    differ = fabs(inqXValTest(gridTest, 0) - inqXValRef(gridRef, 0)) > 1.e-9
+             || fabs(inqXValTest(gridTest, (SizeType) (gridsize - 1)) - inqXValRef(gridRef, (SizeType) (gridsize - 1))) > 1.e-9;
+
+  if (!differ && gridTest->y.vals)
+    differ = fabs(inqYValTest(gridTest, 0) - inqYValRef(gridRef, 0)) > 1.e-9
+             || fabs(inqYValTest(gridTest, (SizeType) gridsize - 1) - inqYValRef(gridRef, (SizeType) gridsize - 1)) > 1.e-9;
+
+  return differ;
+}
+
+static bool
+compare_bounds(const grid_t *grid, const grid_t *gridRef)
+{
+  bool differ = false;
+
+  if ((grid->x.bounds && !gridRef->x.bounds) || (!grid->x.bounds && gridRef->x.bounds) || (grid->y.bounds && !gridRef->y.bounds)
+      || (!grid->y.bounds && gridRef->y.bounds))
+    differ = true;
+
+  return differ;
+}
+
+static bool
+compare_lonlat(int gridID, const grid_t *grid, const grid_t *gridRef)
+{
+  bool differ = false;
+  /*
+    printf("gridID      %d\n", gridID);
+    printf("grid.xdef   %d\n", grid->x.flag);
+    printf("grid.ydef   %d\n", grid->y.flag);
+    printf("grid.xsize  %zu\n", grid->x.size);
+    printf("grid.ysize  %zu\n", grid->y.size);
+    printf("grid.xfirst %f\n", grid->x.first);
+    printf("grid.yfirst %f\n", grid->y.first);
+    printf("grid.xfirst %f\n", gridInqXval(gridID, 0));
+    printf("grid.yfirst %f\n", gridInqYval(gridID, 0));
+    printf("grid.xinc   %f\n", grid->x.inc);
+    printf("grid.yinc   %f\n", grid->y.inc);
+    printf("grid.xinc   %f\n", gridInqXinc(gridID));
+    printf("grid.yinc   %f\n", gridInqYinc(gridID));
+  */
+  if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size)
+    {
+      if (grid->x.flag == 2 && grid->y.flag == 2)
+        {
+          if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0))
+              && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0) && IS_EQUAL(grid->y.inc, 0))
+              && IS_NOT_EQUAL(grid->x.first, grid->x.last) && IS_NOT_EQUAL(grid->y.first, grid->y.last))
+            {
+              if (IS_NOT_EQUAL(grid->x.first, gridInqXval(gridID, 0)) || IS_NOT_EQUAL(grid->y.first, gridInqYval(gridID, 0)))
+                {
+                  differ = true;
+                }
+              if (!differ && fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000))
+                {
+                  differ = true;
+                }
+              if (!differ && fabs(grid->y.inc) > 0 && fabs(fabs(grid->y.inc) - fabs(gridRef->y.inc)) > fabs(grid->y.inc / 1000))
+                {
+                  differ = true;
+                }
+            }
+        }
+      else if (grid->x.vals && grid->y.vals)
+        differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid);
+
+      if (!differ) differ = compare_bounds(grid, gridRef);
+    }
+  else
+    differ = true;
+
+  return differ;
+}
+
+static bool
+compare_projection(int gridID, const grid_t *grid, const grid_t *gridRef)
+{
+  bool differ = compare_lonlat(gridID, grid, gridRef);
+
+  if (!differ)
+    {
+      // printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys,
+      // CDI_KEY_GRIDMAP_VARNAME)); printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME),
+      // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME));
+      // if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys,
+      // CDI_KEY_GRIDMAP_VARNAME))) return true; if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME),
+      // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME))) return true;
+    }
+
+  return differ;
+}
+
+static bool
+compare_generic(const grid_t *grid, const grid_t *gridRef)
+{
+  bool differ = false;
+
+  if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size)
+    {
+      if (grid->x.flag == 1 && grid->y.flag == 1 && grid->x.vals && grid->y.vals)
+        differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid);
+    }
+  else if ((grid->y.size == 0 || grid->y.size == 1) && grid->x.size == gridRef->x.size * gridRef->y.size)
+    {
+    }
+  else
+    differ = true;
+
+  return differ;
+}
+
+static bool
+compare_gaussian(int gridID, const grid_t *grid, const grid_t *gridRef)
+{
+  const double cmp_eps = 0.0015;
+  bool differ = false;
+
+  if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size)
+    {
+      if (grid->x.flag == 2 && grid->y.flag == 2)
+        {
+          if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0))
+              && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0)))
+            if (fabs(grid->x.first - gridInqXval(gridID, 0)) > cmp_eps || fabs(grid->y.first - gridInqYval(gridID, 0)) > cmp_eps
+                || (fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000)))
+              {
+                differ = true;
+              }
+        }
+      else if (grid->x.vals && grid->y.vals)
+        differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid);
+
+      if (!differ) differ = compare_bounds(grid, gridRef);
+    }
+  else
+    differ = true;
+
+  return differ;
+}
+
+static bool
+compare_curvilinear(const grid_t *grid, const grid_t *gridRef)
+{
+  bool differ = false;
+
+  /*
+    printf("gridID      %d\n", gridID);
+    printf("grid.xsize  %d\n", grid->x.size);
+    printf("grid.ysize  %d\n", grid->y.size);
+    printf("grid.xfirst %f\n", grid->x.vals[0]);
+    printf("grid.yfirst %f\n", grid->y.vals[0]);
+    printf("grid xfirst %f\n", gridInqXval(gridID, 0));
+    printf("grid yfirst %f\n", gridInqYval(gridID, 0));
+    printf("grid.xlast  %f\n", grid->x.vals[grid->size-1]);
+    printf("grid.ylast  %f\n", grid->y.vals[grid->size-1]);
+    printf("grid xlast  %f\n", gridInqXval(gridID, grid->size-1));
+    printf("grid ylast  %f\n", gridInqYval(gridID, grid->size-1));
+    printf("grid.nv     %d\n", grid->nvertex);
+    printf("grid nv     %d\n", gridInqNvertex(gridID));
+  */
+  if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size)
+    differ = gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid);
+
+  return differ;
+}
+
+static bool
+compare_unstructured(const grid_t *grid, const grid_t *gridRef, bool compareCoord)
+{
+  bool differ = false;
+
+  unsigned char uuid1[CDI_UUID_SIZE] = { 0 };
+  unsigned char uuid2[CDI_UUID_SIZE] = { 0 };
+  int length = CDI_UUID_SIZE;
+  cdiInqVarKeyBytes(&gridRef->keys, CDI_KEY_UUID, uuid1, &length);
+  length = CDI_UUID_SIZE;
+  cdiInqVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid2, &length);
+  differ = ((!cdiUUIDIsNull(uuid1) || !cdiUUIDIsNull(uuid2)) && memcmp(uuid1, uuid2, CDI_UUID_SIZE));
+  if (!differ)
+    {
+      int numberA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED);
+      int numberB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDUSED);
+      int positionA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE);
+      int positionB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE);
+      if (compareCoord)
+        {
+          differ = (grid->nvertex != gridRef->nvertex || (numberA > 0 && positionA != positionB)
+                    || gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid));
+        }
+      else
+        {
+          if (((grid->x.vals == NULL) ^ (gridRef->x.vals == NULL)) && ((grid->y.vals == NULL) ^ (gridRef->y.vals == NULL)))
+            {
+              int nvertexA = grid->nvertex, nvertexB = gridRef->nvertex;
+              differ = (nvertexA && nvertexB && (nvertexA != nvertexB))
+                       || ((numberA && numberB && (numberA != numberB)) || (numberA && numberB && positionA != positionB));
+            }
+          else
+            {
+              differ = (grid->nvertex != gridRef->nvertex || numberA != numberB || (numberA > 0 && positionA != positionB)
+                        || gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid));
+            }
+        }
+    }
+
+  return differ;
+}
+
+static bool
+gridCompare(int gridID, const grid_t *grid, bool compareCoord)
+{
+  bool differ = true;
+  const grid_t *gridRef = grid_to_pointer(gridID);
+
+  if (grid->type == gridRef->type || grid->type == GRID_GENERIC)
+    {
+      if (grid->size == gridRef->size)
+        {
+          differ = false;
+          if (grid->type == GRID_LONLAT)
+            {
+              differ = compare_lonlat(gridID, grid, gridRef);
+            }
+          else if (grid->type == GRID_PROJECTION)
+            {
+              differ = compare_projection(gridID, grid, gridRef);
+            }
+          else if (grid->type == GRID_GENERIC)
+            {
+              differ = compare_generic(grid, gridRef);
+            }
+          else if (grid->type == GRID_GAUSSIAN)
+            {
+              differ = compare_gaussian(gridID, grid, gridRef);
+            }
+          else if (grid->type == GRID_CURVILINEAR)
+            {
+              differ = compare_curvilinear(grid, gridRef);
+            }
+          else if (grid->type == GRID_UNSTRUCTURED)
+            {
+              differ = compare_unstructured(grid, gridRef, compareCoord);
+            }
+        }
+    }
+
+  int scanningModeA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE);
+  int scanningModeB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_SCANNINGMODE);
+  if (scanningModeA != scanningModeB)
+    {
+      // often grid definition may differ in UV-relativeToGrid
+      differ = true;
+#ifdef HIRLAM_EXTENSIONS
+      if (cdiDebugExt >= 200)
+        printf("gridCompare(gridID=%d): Differs: scanningModeA [%d] != scanningModeB(gridID) [%d]\n", gridID, scanningModeA,
+               scanningModeB);
+#endif  // HIRLAM_EXTENSIONS
+    }
+
+  return differ;
+}
+
+int
+cmp_key_int(const cdi_keys_t *keysp1, const cdi_keys_t *keysp2, int key)
+{
+  int v1 = cdiInqVarKeyInt(keysp1, key);
+  int v2 = cdiInqVarKeyInt(keysp2, key);
+  return (v1 != v2);
+}
+
+int
+gridCompareP(void *gridptr1, void *gridptr2)
+{
+  grid_t *g1 = (grid_t *) gridptr1;
+  grid_t *g2 = (grid_t *) gridptr2;
+  enum
+  {
+    equal = 0,
+    differ = -1
+  };
+
+  xassert(g1);
+  xassert(g2);
+
+  if (cdiInqVarKeyInt(&g1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&g2->keys, CDI_KEY_DATATYPE)) return differ;
+  if (g1->type != g2->type) return differ;
+  if (g1->isCyclic != g2->isCyclic) return differ;
+  if (g1->x.flag != g2->x.flag) return differ;
+  if (g1->y.flag != g2->y.flag) return differ;
+  if (g1->gme.nd != g2->gme.nd) return differ;
+  if (g1->gme.ni != g2->gme.ni) return differ;
+  if (g1->gme.ni2 != g2->gme.ni2) return differ;
+  if (g1->gme.ni3 != g2->gme.ni3) return differ;
+  if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDUSED)) return differ;
+  if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE)) return differ;
+  if (g1->trunc != g2->trunc) return differ;
+  if (g1->nvertex != g2->nvertex) return differ;
+  if (g1->reducedPointsSize != g2->reducedPointsSize) return differ;
+  if (g1->size != g2->size) return differ;
+  if (g1->x.size != g2->x.size) return differ;
+  if (g1->y.size != g2->y.size) return differ;
+  if (g1->lcomplex != g2->lcomplex) return differ;
+
+  if (IS_NOT_EQUAL(g1->x.first, g2->x.first)) return differ;
+  if (IS_NOT_EQUAL(g1->y.first, g2->y.first)) return differ;
+  if (IS_NOT_EQUAL(g1->x.last, g2->x.last)) return differ;
+  if (IS_NOT_EQUAL(g1->y.last, g2->y.last)) return differ;
+  if (IS_NOT_EQUAL(g1->x.inc, g2->x.inc)) return differ;
+  if (IS_NOT_EQUAL(g1->y.inc, g2->y.inc)) return differ;
+  if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_SCANNINGMODE)) return differ;
+
+  bool isIrregular = grid_is_irregular(g1->type);
+  {
+    const double *restrict g1_xvals = g1->vtable->inqXValsPtr(g1), *restrict g2_xvals = g2->vtable->inqXValsPtr(g2);
+    if ((g1_xvals != NULL) ^ (g2_xvals != NULL)) return differ;
+    if (g1_xvals)
+      {
+        size_t size = isIrregular ? g1->size : g1->x.size;
+        xassert(size);
+        for (size_t i = 0; i < size; i++)
+          if (IS_NOT_EQUAL(g1_xvals[i], g2_xvals[i])) return differ;
+      }
+  }
+
+  {
+    const double *restrict g1_yvals = g1->vtable->inqYValsPtr(g1), *restrict g2_yvals = g2->vtable->inqYValsPtr(g2);
+    if ((g1_yvals != NULL) ^ (g2_yvals != NULL)) return differ;
+    if (g1_yvals)
+      {
+        size_t size = isIrregular ? g1->size : g1->y.size;
+        xassert(size);
+        for (size_t i = 0; i < size; i++)
+          if (IS_NOT_EQUAL(g1_yvals[i], g2_yvals[i])) return differ;
+      }
+  }
+
+  {
+    const double *restrict g1_area = g1->vtable->inqAreaPtr(g1), *restrict g2_area = g2->vtable->inqAreaPtr(g2);
+    if ((g1_area != NULL) ^ (g2_area != NULL)) return differ;
+    if (g1_area)
+      {
+        size_t size = g1->size;
+        xassert(size);
+
+        for (size_t i = 0; i < size; i++)
+          if (IS_NOT_EQUAL(g1_area[i], g2_area[i])) return differ;
+      }
+  }
+
+  {
+    const double *restrict g1_xbounds = g1->vtable->inqXBoundsPtr(g1), *restrict g2_xbounds = g2->vtable->inqXBoundsPtr(g2);
+    if ((g1_xbounds != NULL) ^ (g2_xbounds != NULL)) return differ;
+    if (g1_xbounds)
+      {
+        xassert(g1->nvertex);
+        size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->x.size);
+        xassert(size);
+
+        for (size_t i = 0; i < size; i++)
+          if (IS_NOT_EQUAL(g1_xbounds[i], g2_xbounds[i])) return differ;
+      }
+  }
+
+  {
+    const double *restrict g1_ybounds = g1->vtable->inqYBoundsPtr(g1), *restrict g2_ybounds = g2->vtable->inqYBoundsPtr(g2);
+    if ((g1_ybounds != NULL) ^ (g2_ybounds != NULL)) return differ;
+    if (g1_ybounds)
+      {
+        xassert(g1->nvertex);
+        size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->y.size);
+        xassert(size);
+
+        for (size_t i = 0; i < size; i++)
+          if (IS_NOT_EQUAL(g1_ybounds[i], g2_ybounds[i])) return differ;
+      }
+  }
+
+  if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_NAME))) return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_NAME))) return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_LONGNAME)))
+    return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_LONGNAME)))
+    return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_UNITS))) return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_UNITS))) return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_STDNAME)))
+    return differ;
+  if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_STDNAME)))
+    return differ;
+
+  if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_REFERENCEURI), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_REFERENCEURI)))
+    return differ;
+
+  if (g1->mask)
+    {
+      xassert(g1->size);
+      if (!g2->mask) return differ;
+      if (memcmp(g1->mask, g2->mask, g1->size * sizeof(mask_t))) return differ;
+    }
+  else if (g2->mask)
+    return differ;
+
+  if (g1->mask_gme)
+    {
+      xassert(g1->size);
+      if (!g2->mask_gme) return differ;
+      if (memcmp(g1->mask_gme, g2->mask_gme, g1->size * sizeof(mask_t))) return differ;
+    }
+  else if (g2->mask_gme)
+    return differ;
+
+  unsigned char uuid1[CDI_UUID_SIZE] = { 0 };
+  unsigned char uuid2[CDI_UUID_SIZE] = { 0 };
+  int length = CDI_UUID_SIZE;
+  cdiInqVarKeyBytes(&g1->keys, CDI_KEY_UUID, uuid1, &length);
+  length = CDI_UUID_SIZE;
+  cdiInqVarKeyBytes(&g2->keys, CDI_KEY_UUID, uuid2, &length);
+  if (memcmp(uuid1, uuid2, CDI_UUID_SIZE)) return differ;
+
+  return equal;
+}
+
+static void
+grid_complete(grid_t *grid)
+{
+  int gridID = grid->self;
+
+  if (grid->datatype != CDI_UNDEFID) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid->datatype);
+
+  int gridtype = grid->type;
+  switch (gridtype)
+    {
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_UNSTRUCTURED:
+    case GRID_CURVILINEAR:
+    case GRID_GENERIC:
+    case GRID_PROJECTION:
+    case GRID_CHARXY:
+      {
+        if (grid->x.size > 0) gridDefXsize(gridID, (SizeType) grid->x.size);
+        if (grid->y.size > 0) gridDefYsize(gridID, (SizeType) grid->y.size);
+
+        if (gridtype == GRID_GAUSSIAN) gridDefNP(gridID, grid->np);
+
+        if (grid->nvertex > 0) gridDefNvertex(gridID, grid->nvertex);
+
+        if (grid->x.flag == 2)
+          {
+            assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR);
+            double *xvals = (double *) Malloc(grid->x.size * sizeof(double));
+            gridGenXvals(grid->x.size, grid->x.first, grid->x.last, grid->x.inc, xvals);
+            grid->x.vals = xvals;
+            // gridDefXinc(gridID, grid->x.inc);
+          }
+
+        if (grid->y.flag == 2)
+          {
+            assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR);
+            double *yvals = (double *) Malloc(grid->y.size * sizeof(double));
+            gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals);
+            grid->y.vals = yvals;
+            // gridDefYinc(gridID, grid->y.inc);
+          }
+
+        if (grid->projtype == CDI_PROJ_RLL)
+          {
+            const char *name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_NAME);
+            if (name[0] == 0 || name[0] == 'x') cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "rlon");
+            name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_NAME);
+            if (name[0] == 0 || name[0] == 'y') cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "rlat");
+            name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_LONGNAME);
+            if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "longitude in rotated pole grid");
+            name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_LONGNAME);
+            if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "latitude in rotated pole grid");
+            name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_UNITS);
+            if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees");
+            name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_UNITS);
+            if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees");
+            cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]);
+            cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]);
+          }
+
+        if (gridtype == GRID_UNSTRUCTURED)
+          {
+            int number = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED);
+            if (number > 0)
+              {
+                cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number);
+                int position = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE);
+                if (position > 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position);
+              }
+          }
+
+        break;
+      }
+    case GRID_GAUSSIAN_REDUCED:
+      {
+        gridDefNP(gridID, grid->np);
+        gridDefYsize(gridID, (SizeType) grid->y.size);
+        if (grid->x.flag == 2)
+          {
+            double xvals[2] = { grid->x.first, grid->x.last };
+            gridDefXsize(gridID, 2);
+            gridDefXvals(gridID, xvals);
+          }
+
+        if (grid->y.flag == 2)
+          {
+            double *yvals = (double *) Malloc(grid->y.size * sizeof(double));
+            gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals);
+            grid->y.vals = yvals;
+            // gridDefYinc(gridID, grid->y.inc);
+          }
+        break;
+      }
+    case GRID_SPECTRAL:
+      {
+        gridDefTrunc(gridID, grid->trunc);
+        if (grid->lcomplex) gridDefComplexPacking(gridID, 1);
+        break;
+      }
+    case GRID_FOURIER:
+      {
+        gridDefTrunc(gridID, grid->trunc);
+        break;
+      }
+    case GRID_GME:
+      {
+        gridDefParamGME(gridID, grid->gme.nd, grid->gme.ni, grid->gme.ni2, grid->gme.ni3);
+        break;
+      }
+      /*
+    case GRID_GENERIC:
+      {
+        if ( grid->x.size > 0 && grid->y.size > 0 )
+          {
+            gridDefXsize(gridID, grid->x.size);
+            gridDefYsize(gridID, grid->y.size);
+            if ( grid->x.vals ) gridDefXvals(gridID, grid->x.vals);
+            if ( grid->y.vals ) gridDefYvals(gridID, grid->y.vals);
+          }
+        break;
+      }
+      */
+    case GRID_TRAJECTORY:
+      {
+        gridDefXsize(gridID, 1);
+        gridDefYsize(gridID, 1);
+        break;
+      }
+    default:
+      {
+        Error("Gridtype %s unsupported!", gridNamePtr(gridtype));
+        break;
+      }
+    }
+}
+
+// Used only in iterator_grib.c
+int
+gridGenerate(const grid_t *grid)
+{
+  int gridtype = grid->type;
+  int gridID = gridCreate(gridtype, (SizeType) grid->size);
+  grid_t *restrict gridptr = grid_to_pointer(gridID);
+  cdiCopyVarKey(&grid->keys, CDI_KEY_DATATYPE, &gridptr->keys);
+  gridptr->x.size = grid->x.size;
+  gridptr->y.size = grid->y.size;
+  gridptr->np = grid->np;
+  gridptr->nvertex = grid->nvertex;
+  gridptr->x.flag = grid->x.flag;
+  int valdef_group1 = 0;
+  static const int valdef_group1_tab[]
+      = { GRID_LONLAT, GRID_GAUSSIAN, GRID_UNSTRUCTURED, GRID_CURVILINEAR, GRID_GENERIC, GRID_PROJECTION };
+  for (size_t i = 0; i < sizeof(valdef_group1_tab) / sizeof(valdef_group1_tab[0]); ++i)
+    valdef_group1 |= (gridtype == valdef_group1_tab[i]);
+  if (valdef_group1 && grid->x.flag == 1)
+    {
+      gridDefXvals(gridID, grid->x.vals);
+      if (grid->x.bounds) gridDefXbounds(gridID, grid->x.bounds);
+    }
+  gridptr->x.first = grid->x.first;
+  gridptr->x.last = grid->x.last;
+  gridptr->x.inc = grid->x.inc;
+  gridptr->y.flag = grid->y.flag;
+  if ((valdef_group1 || gridtype == GRID_GAUSSIAN_REDUCED) && grid->y.flag == 1)
+    {
+      gridDefYvals(gridID, grid->y.vals);
+      if (grid->y.bounds) gridDefYbounds(gridID, grid->y.bounds);
+    }
+  gridptr->y.first = grid->y.first;
+  gridptr->y.last = grid->y.last;
+  gridptr->y.inc = grid->y.inc;
+  if (valdef_group1 && grid->area) gridDefArea(gridID, grid->area);
+
+  cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, &gridptr->keys);
+  cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, &gridptr->keys);
+  cdiCopyVarKey(&grid->keys, CDI_KEY_REFERENCEURI, &gridptr->keys);
+
+  cdiCopyVarKey(&grid->keys, CDI_KEY_SCANNINGMODE, &gridptr->keys);
+
+  if (gridtype == GRID_PROJECTION) gridptr->name = strdup(grid->name);
+  if (gridtype == GRID_GAUSSIAN_REDUCED) gridDefReducedPoints(gridID, (int) grid->y.size, grid->reducedPoints);
+  gridptr->trunc = grid->trunc;
+  gridptr->lcomplex = grid->lcomplex;
+  gridptr->gme.nd = grid->gme.nd;
+  gridptr->gme.ni = grid->gme.ni;
+  gridptr->gme.ni2 = grid->gme.ni2;
+  gridptr->gme.ni3 = grid->gme.ni3;
+
+  grid_complete(gridptr);
+
+  cdiCopyVarKey(&grid->keys, CDI_KEY_UUID, &gridptr->keys);
+
+  return gridID;
+}
+
+static void
+grid_copy_base_array_fields(grid_t *gridptrOrig, grid_t *gridptrDup)
+{
+  size_t reducedPointsSize = gridptrOrig->reducedPointsSize > 0 ? (size_t) gridptrOrig->reducedPointsSize : (size_t) 0;
+  size_t gridsize = gridptrOrig->size;
+  int gridtype = gridptrOrig->type;
+  bool isIrregular = grid_is_irregular(gridtype);
+  if (reducedPointsSize)
+    {
+      gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int));
+      memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int));
+    }
+
+  if (gridptrOrig->x.vals != NULL)
+    {
+      size_t size = isIrregular ? gridsize : gridptrOrig->x.size;
+      gridptrDup->x.vals = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double));
+    }
+
+  if (gridptrOrig->y.vals != NULL)
+    {
+      size_t size = isIrregular ? gridsize : gridptrOrig->y.size;
+      gridptrDup->y.vals = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double));
+    }
+
+  if (gridptrOrig->x.bounds != NULL)
+    {
+      size_t size = (isIrregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex;
+      gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double));
+    }
+
+  if (gridptrOrig->y.bounds != NULL)
+    {
+      size_t size = (isIrregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex;
+      gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double));
+      memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double));
+    }
+
+  {
+    const double *gridptrOrig_area = gridptrOrig->vtable->inqAreaPtr(gridptrOrig);
+    if (gridptrOrig_area != NULL)
+      {
+        size_t size = gridsize;
+        gridptrDup->area = (double *) Malloc(size * sizeof(double));
+        memcpy(gridptrDup->area, gridptrOrig_area, size * sizeof(double));
+      }
+  }
+
+  if (gridptrOrig->mask != NULL)
+    {
+      size_t size = gridsize;
+      gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t));
+      memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t));
+    }
+
+  if (gridptrOrig->mask_gme != NULL)
+    {
+      size_t size = gridsize;
+      gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t));
+      memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t));
+    }
+}
+
+/*
+@Function  gridDuplicate
+@Title     Duplicate a horizontal Grid
+
+@Prototype int gridDuplicate(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridDuplicate} duplicates a horizontal Grid.
+
+@Result
+@func{gridDuplicate} returns an identifier to the duplicated Grid.
+
+@EndFunction
+*/
+int
+gridDuplicate(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  grid_t *gridptrnew = gridptr->vtable->copy(gridptr);
+  int gridIDnew = reshPut(gridptrnew, &gridOps);
+  gridptrnew->self = gridIDnew;
+  return gridIDnew;
+}
+
+void
+gridCompress(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  int gridtype = gridInqType(gridID);
+  if (gridtype == GRID_UNSTRUCTURED)
+    {
+      if (gridptr->mask_gme != NULL)
+        {
+          size_t gridsize = (size_t) gridInqSize(gridID);
+          size_t nv = (size_t) gridptr->nvertex;
+          double *restrict area = (double *) gridptr->vtable->inqAreaPtr(gridptr),
+                           *restrict xvals = (double *) gridptr->vtable->inqXValsPtr(gridptr),
+                           *restrict yvals = (double *) gridptr->vtable->inqYValsPtr(gridptr),
+                           *restrict xbounds = (double *) gridptr->vtable->inqXBoundsPtr(gridptr),
+                           *restrict ybounds = (double *) gridptr->vtable->inqYBoundsPtr(gridptr);
+          mask_t *restrict mask_gme = gridptr->mask_gme;
+          size_t *restrict selection = (size_t *) Malloc(gridsize * sizeof(selection[0]));
+          size_t nselect;
+          {
+            size_t j = 0;
+            for (size_t i = 0; i < gridsize; i++) selection[j] = i, j += (mask_gme[i] != 0);
+            nselect = j;
+          }
+          selection = (size_t *) Realloc(selection, nselect * sizeof(selection[0]));
+          if (xvals)
+            for (size_t i = 0; i < nselect; i++) xvals[i] = xvals[selection[i]];
+          if (yvals)
+            for (size_t i = 0; i < nselect; i++) yvals[i] = yvals[selection[i]];
+          if (area)
+            for (size_t i = 0; i < nselect; i++) area[i] = area[selection[i]];
+          if (xbounds)
+            for (size_t i = 0; i < nselect; i++)
+              for (size_t iv = 0; iv < nv; iv++) xbounds[i * nv + iv] = xbounds[selection[i] * nv + iv];
+          if (ybounds)
+            for (size_t i = 0; i < nselect; i++)
+              for (size_t iv = 0; iv < nv; iv++) ybounds[i * nv + iv] = ybounds[selection[i] * nv + iv];
+          Free(selection);
+
+          /* fprintf(stderr, "grid compress %d %d %d\n", i, j, gridsize); */
+          gridsize = nselect;
+          gridptr->size = gridsize;
+          gridptr->x.size = gridsize;
+          gridptr->y.size = gridsize;
+
+          double **resizeP[] = { &gridptr->x.vals, &gridptr->y.vals, &gridptr->area, &gridptr->x.bounds, &gridptr->y.bounds };
+          size_t newSize[] = { gridsize, gridsize, gridsize, nv * gridsize, nv * gridsize };
+          for (size_t i = 0; i < sizeof(resizeP) / sizeof(resizeP[0]); ++i)
+            if (*(resizeP[i])) *(resizeP[i]) = (double *) Realloc(*(resizeP[i]), newSize[i] * sizeof(double));
+
+          Free(gridptr->mask_gme);
+          gridptr->mask_gme = NULL;
+          gridMark4Update(gridID);
+        }
+    }
+  else
+    Warning("Unsupported grid type: %s", gridNamePtr(gridtype));
+}
+
+static void
+gridDefAreaSerial(grid_t *gridptr, const double *area)
+{
+  size_t size = gridptr->size;
+
+  if (size == 0) Error("size undefined for gridID = %d", gridptr->self);
+
+  if (gridptr->area == NULL)
+    gridptr->area = (double *) Malloc(size * sizeof(double));
+  else if (CDI_Debug)
+    Warning("values already defined!");
+
+  memcpy(gridptr->area, area, size * sizeof(double));
+}
+
+void
+gridDefArea(int gridID, const double *area)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defArea(gridptr, area);
+  gridMark4Update(gridID);
+}
+
+static void
+gridInqAreaSerial(grid_t *gridptr, double *area)
+{
+  if (gridptr->area) memcpy(area, gridptr->area, gridptr->size * sizeof(double));
+}
+
+void
+gridInqArea(int gridID, double *area)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->inqArea(gridptr, area);
+}
+
+static int
+gridInqPropPresenceBase(grid_t *gridptr, enum gridPropInq inq)
+{
+  bool present = false;
+  switch (inq)
+    {
+    case GRID_PROP_MASK: present = gridptr->mask != NULL; break;
+    case GRID_PROP_MASK_GME: present = gridptr->mask != NULL; break;
+    case GRID_PROP_AREA: present = gridptr->area != NULL; break;
+    case GRID_PROP_XVALS: present = gridptr->x.vals != NULL; break;
+    case GRID_PROP_YVALS: present = gridptr->y.vals != NULL; break;
+    case GRID_PROP_XBOUNDS: present = gridptr->x.bounds != NULL; break;
+    case GRID_PROP_YBOUNDS: present = gridptr->y.bounds != NULL; break;
+    }
+  return present;
+}
+
+int
+gridInqPropPresence(int gridID, enum gridPropInq inq)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqPropPresence(gridptr, inq);
+}
+
+int
+gridHasArea(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqPropPresence(gridptr, GRID_PROP_AREA);
+}
+
+static const double *
+gridInqAreaPtrBase(grid_t *gridptr)
+{
+  return gridptr->area;
+}
+
+const double *
+gridInqAreaPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqAreaPtr(gridptr);
+}
+
+void
+gridDefNvertex(int gridID, int nvertex)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  if (gridptr->nvertex != nvertex)
+    {
+      gridptr->nvertex = nvertex;
+      gridMark4Update(gridID);
+    }
+}
+
+int
+gridInqNvertex(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->nvertex;
+}
+
+static void
+gridDefBoundsGeneric(grid_t *gridptr, const double *bounds, size_t regularSize, double **field)
+{
+  bool isIrregular = grid_is_irregular(gridptr->type);
+  size_t nvertex = (size_t) gridptr->nvertex;
+  if (nvertex == 0)
+    {
+      Warning("nvertex undefined for gridID = %d. Cannot define bounds!", gridptr->self);
+      return;
+    }
+
+  size_t size = nvertex * (isIrregular ? gridptr->size : regularSize);
+  if (size == 0) Error("size undefined for gridID = %d", gridptr->self);
+
+  if (*field == NULL && size)
+    *field = (double *) Malloc(size * sizeof(double));
+  else if (CDI_Debug)
+    Warning("values already defined!");
+
+  copy_darray(size, bounds, *field);
+}
+
+static void
+gridDefXBoundsSerial(grid_t *gridptr, const double *xbounds)
+{
+  gridDefBoundsGeneric(gridptr, xbounds, gridptr->x.size, &gridptr->x.bounds);
+}
+
+/*
+@Function  gridDefXbounds
+@Title     Define the bounds of a X-axis
+
+@Prototype void gridDefXbounds(int gridID, const double *xbounds)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  xbounds  X-bounds of the grid.
+
+@Description
+The function @func{gridDefXbounds} defines all bounds of the X-axis.
+
+@EndFunction
+*/
+void
+gridDefXbounds(int gridID, const double *xbounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defXBounds(gridptr, xbounds);
+  gridMark4Update(gridID);
+}
+
+static SizeType
+gridInqXBoundsSerial(grid_t *gridptr, double *xbounds)
+{
+  size_t nvertex = (size_t) gridptr->nvertex;
+
+  bool isIrregular = grid_is_irregular(gridptr->type);
+  size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->x.size);
+
+  if (gridptr->x.bounds)
+    {
+      if (size && xbounds)
+        {
+          const double *gridptr_xbounds = gridptr->vtable->inqXBoundsPtr(gridptr);
+          copy_darray(size, gridptr_xbounds, xbounds);
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+/*
+@Function  gridInqXbounds
+@Title     Get the bounds of a X-axis
+
+@Prototype SizeType gridInqXbounds(int gridID, double *xbounds)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  xbounds  Pointer to the location into which the X-bounds are read.
+                    The caller must allocate space for the returned values.
+
+@Description
+The function @func{gridInqXbounds} returns the bounds of the X-axis.
+
+@Result
+Upon successful completion @func{gridInqXbounds} returns the number of bounds and
+the bounds are stored in @func{xbounds}.
+Otherwise, 0 is returned and @func{xbounds} is empty.
+
+@EndFunction
+*/
+SizeType
+gridInqXbounds(int gridID, double *xbounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXBounds(gridptr, xbounds);
+}
+
+static const double *
+gridInqXBoundsPtrSerial(grid_t *gridptr)
+{
+  return gridptr->x.bounds;
+}
+
+const double *
+gridInqXboundsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXBoundsPtr(gridptr);
+}
+
+static void
+gridDefYBoundsSerial(grid_t *gridptr, const double *ybounds)
+{
+  gridDefBoundsGeneric(gridptr, ybounds, gridptr->y.size, &gridptr->y.bounds);
+}
+
+//----------------------------------------------------------------------------
+// Parallel Version
+//----------------------------------------------------------------------------
+
+SizeType
+gridInqXboundsPart(int gridID, int start, SizeType size, double *xbounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  const double *gridptr_xbounds = gridptr->vtable->inqXBoundsPtr(gridptr);
+  if (gridptr_xbounds && size && xbounds) memcpy(xbounds, gridptr_xbounds + start, (size_t) size * sizeof(double));
+
+  return size;
+}
+
+SizeType
+gridInqYboundsPart(int gridID, int start, SizeType size, double *ybounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  const double *gridptr_ybounds = gridptr->vtable->inqYBoundsPtr(gridptr);
+  if (gridptr_ybounds && size && ybounds) memcpy(ybounds, gridptr_ybounds + start, (size_t) size * sizeof(double));
+
+  return size;
+}
+
+/*
+@Function  gridDefYbounds
+@Title     Define the bounds of a Y-axis
+
+@Prototype void gridDefYbounds(int gridID, const double *ybounds)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  ybounds  Y-bounds of the grid.
+
+@Description
+The function @func{gridDefYbounds} defines all bounds of the Y-axis.
+
+@EndFunction
+*/
+void
+gridDefYbounds(int gridID, const double *ybounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->vtable->defYBounds(gridptr, ybounds);
+  gridMark4Update(gridID);
+}
+
+static SizeType
+gridInqYBoundsSerial(grid_t *gridptr, double *ybounds)
+{
+  size_t nvertex = (size_t) gridptr->nvertex;
+
+  bool isIrregular = grid_is_irregular(gridptr->type);
+  size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->y.size);
+
+  if (gridptr->y.bounds)
+    {
+      if (size && ybounds)
+        {
+          const double *gridptr_ybounds = gridptr->vtable->inqYBoundsPtr(gridptr);
+          copy_darray(size, gridptr_ybounds, ybounds);
+        }
+    }
+  else
+    size = 0;
+
+  return (SizeType) size;
+}
+
+/*
+@Function  gridInqYbounds
+@Title     Get the bounds of a Y-axis
+
+@Prototype SizeType gridInqYbounds(int gridID, double *ybounds)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  ybounds  Pointer to the location into which the Y-bounds are read.
+                    The caller must allocate space for the returned values.
+
+@Description
+The function @func{gridInqYbounds} returns the bounds of the Y-axis.
+
+@Result
+Upon successful completion @func{gridInqYbounds} returns the number of bounds and
+the bounds are stored in @func{ybounds}.
+Otherwise, 0 is returned and @func{ybounds} is empty.
+
+@EndFunction
+*/
+SizeType
+gridInqYbounds(int gridID, double *ybounds)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYBounds(gridptr, ybounds);
+}
+
+static const double *
+gridInqYBoundsPtrSerial(grid_t *gridptr)
+{
+  return gridptr->y.bounds;
+}
+
+const double *
+gridInqYboundsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYBoundsPtr(gridptr);
+}
+
+static void
+printDblsPrefixAutoBrk(FILE *fp, int dig, const char prefix[], size_t nbyte0, size_t n, const double vals[])
+{
+  fputs(prefix, fp);
+  size_t nbyte = nbyte0;
+  for (size_t i = 0; i < n; i++)
+    {
+      if (nbyte > 80)
+        {
+          fprintf(fp, "\n%*s", (int) nbyte0, "");
+          nbyte = nbyte0;
+        }
+      nbyte += (size_t) fprintf(fp, "%.*g ", dig, vals[i]);
+    }
+  fputs("\n", fp);
+}
+
+static inline void *
+resizeBuffer(void **buf, size_t *bufSize, size_t reqSize)
+{
+  if (reqSize > *bufSize)
+    {
+      *buf = Realloc(*buf, reqSize);
+      *bufSize = reqSize;
+    }
+  return *buf;
+}
+
+static void
+gridPrintAttributes(FILE *fp, int gridID)
+{
+  int cdiID = gridID;
+  int varID = CDI_GLOBAL;
+  int atttype, attlen;
+  char attname[CDI_MAX_NAME + 1];
+  void *attBuf = NULL;
+  size_t attBufSize = 0;
+
+  int natts;
+  cdiInqNatts(cdiID, varID, &natts);
+
+  for (int iatt = 0; iatt < natts; ++iatt)
+    {
+      cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen);
+
+      if (attlen == 0) continue;
+
+      if (atttype == CDI_DATATYPE_TXT)
+        {
+          size_t attSize = (size_t) (attlen + 1) * sizeof(char);
+          char *atttxt = (char *) resizeBuffer(&attBuf, &attBufSize, attSize);
+          cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt);
+          atttxt[attlen] = 0;
+          fprintf(fp, "ATTR_TXT: %s = \"%s\"\n", attname, atttxt);
+        }
+      else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16
+               || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32)
+        {
+          size_t attSize = (size_t) attlen * sizeof(int);
+          int *attint = (int *) resizeBuffer(&attBuf, &attBufSize, attSize);
+          cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]);
+          if (attlen == 1)
+            fprintf(fp, "ATTR_INT: %s =", attname);
+          else
+            fprintf(fp, "ATTR_INT_%d: %s =", attlen, attname);
+          for (int i = 0; i < attlen; ++i) fprintf(fp, " %d", attint[i]);
+          fprintf(fp, "\n");
+        }
+      else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64)
+        {
+          size_t attSize = (size_t) attlen * sizeof(double);
+          double *attflt = (double *) resizeBuffer(&attBuf, &attBufSize, attSize);
+          int dig = (atttype == CDI_DATATYPE_FLT64) ? 15 : 7;
+          cdiInqAttFlt(cdiID, varID, attname, attlen, attflt);
+          if (attlen == 1)
+            fprintf(fp, "ATTR_FLT: %s =", attname);
+          else
+            fprintf(fp, "ATTR_FLT_%d: %s =", attlen, attname);
+          for (int i = 0; i < attlen; ++i) fprintf(fp, " %.*g", dig, attflt[i]);
+          fprintf(fp, "\n");
+        }
+    }
+
+  Free(attBuf);
+}
+
+static void
+gridPrintKernel(int gridID, int opt, FILE *fp)
+{
+  char attstr[CDI_MAX_NAME];
+  char attstr2[CDI_MAX_NAME];
+  size_t nxvals = (size_t) gridInqXvals(gridID, NULL);
+  size_t nyvals = (size_t) gridInqYvals(gridID, NULL);
+
+  int type = gridInqType(gridID);
+  size_t gridsize = (size_t) gridInqSize(gridID);
+  size_t xsize = (size_t) gridInqXsize(gridID);
+  size_t ysize = (size_t) gridInqYsize(gridID);
+  int nvertex = gridInqNvertex(gridID);
+  int datatype;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+
+  int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7;
+
+  fprintf(fp,
+          "gridtype  = %s\n"
+          "gridsize  = %zu\n",
+          gridNamePtr(type), gridsize);
+
+  if (type != GRID_GME)
+    {
+      if (type != GRID_UNSTRUCTURED && type != GRID_SPECTRAL && type != GRID_FOURIER)
+        {
+          if (xsize > 0) fprintf(fp, "xsize     = %zu\n", xsize);
+          if (ysize > 0) fprintf(fp, "ysize     = %zu\n", ysize);
+        }
+
+      if (nxvals > 0)
+        {
+          int length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, attstr, &length);
+          if (attstr[0]) fprintf(fp, "xname     = %s\n", attstr);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, attstr2, &length);
+          if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "xdimname  = %s\n", attstr2);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, attstr, &length);
+          if (attstr[0]) fprintf(fp, "xlongname = %s\n", attstr);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, attstr, &length);
+          if (attstr[0]) fprintf(fp, "xunits    = %s\n", attstr);
+        }
+
+      if (nyvals > 0)
+        {
+          int length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, attstr, &length);
+          if (attstr[0]) fprintf(fp, "yname     = %s\n", attstr);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, attstr2, &length);
+          if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "ydimname  = %s\n", attstr2);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, attstr, &length);
+          if (attstr[0]) fprintf(fp, "ylongname = %s\n", attstr);
+          length = CDI_MAX_NAME;
+          cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, attstr, &length);
+          if (attstr[0]) fprintf(fp, "yunits    = %s\n", attstr);
+        }
+
+      if (type == GRID_UNSTRUCTURED && nvertex > 0) fprintf(fp, "nvertex   = %d\n", nvertex);
+    }
+
+  switch (type)
+    {
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_GAUSSIAN_REDUCED:
+    case GRID_GENERIC:
+    case GRID_PROJECTION:
+    case GRID_CURVILINEAR:
+    case GRID_UNSTRUCTURED:
+    case GRID_CHARXY:
+      {
+        if (type == GRID_GAUSSIAN || type == GRID_GAUSSIAN_REDUCED) fprintf(fp, "np        = %d\n", gridInqNP(gridID));
+
+        if (type == GRID_UNSTRUCTURED)
+          {
+            int number = 0;
+            cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number);
+            if (number > 0)
+              {
+                fprintf(fp, "number    = %d\n", number);
+                int position = 0;
+                cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position);
+                if (position >= 0) fprintf(fp, "position  = %d\n", position);
+              }
+
+            int length;
+            if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length))
+              {
+                char reference_link[8192];
+                length = sizeof(reference_link);
+                cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference_link, &length);
+                fprintf(fp, "uri       = %s\n", reference_link);
+              }
+          }
+
+        if (nxvals > 0)
+          {
+            double xfirst = 0.0, xinc = 0.0;
+
+            if (type == GRID_LONLAT || type == GRID_GAUSSIAN || type == GRID_PROJECTION || type == GRID_GENERIC)
+              {
+                xfirst = gridInqXval(gridID, 0);
+                xinc = gridInqXinc(gridID);
+              }
+
+            if (IS_NOT_EQUAL(xinc, 0) && opt)
+              {
+                fprintf(fp,
+                        "xfirst    = %.*g\n"
+                        "xinc      = %.*g\n",
+                        dig, xfirst, dig, xinc);
+              }
+            else
+              {
+                double *xvals = (double *) Malloc(nxvals * sizeof(double));
+                gridInqXvals(gridID, xvals);
+                static const char prefix[] = "xvals     = ";
+                printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nxvals, xvals);
+                Free(xvals);
+              }
+          }
+
+        if (nyvals > 0)
+          {
+            double yfirst = 0.0, yinc = 0.0;
+
+            if (type == GRID_LONLAT || type == GRID_GENERIC || type == GRID_PROJECTION || type == GRID_GENERIC)
+              {
+                yfirst = gridInqYval(gridID, 0);
+                yinc = gridInqYinc(gridID);
+              }
+
+            if (IS_NOT_EQUAL(yinc, 0) && opt)
+              {
+                fprintf(fp,
+                        "yfirst    = %.*g\n"
+                        "yinc      = %.*g\n",
+                        dig, yfirst, dig, yinc);
+              }
+            else
+              {
+                double *yvals = (double *) Malloc(nyvals * sizeof(double));
+                gridInqYvals(gridID, yvals);
+                static const char prefix[] = "yvals     = ";
+                printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nyvals, yvals);
+                Free(yvals);
+              }
+          }
+
+        if (type == GRID_PROJECTION) gridPrintAttributes(fp, gridID);
+
+        break;
+      }
+    case GRID_SPECTRAL:
+      {
+        fprintf(fp,
+                "truncation = %d\n"
+                "complexpacking = %d\n",
+                gridInqTrunc(gridID), gridInqComplexPacking(gridID));
+        break;
+      }
+    case GRID_FOURIER:
+      {
+        fprintf(fp, "truncation = %d\n", gridInqTrunc(gridID));
+        break;
+      }
+    case GRID_GME:
+      {
+        int nd, ni, ni2, ni3;
+        gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3);
+        fprintf(fp, "ni        = %d\n", ni);
+        break;
+      }
+    default:
+      {
+        fprintf(stderr, "Unsupported grid type: %s\n", gridNamePtr(type));
+        break;
+      }
+    }
+}
+
+void
+gridPrintP(void *voidptr, FILE *fp)
+{
+  grid_t *gridptr = (grid_t *) voidptr;
+  int gridID = gridptr->self;
+
+  xassert(gridptr);
+
+  gridPrintKernel(gridID, 0, fp);
+
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+
+  fprintf(fp,
+          "datatype  = %d\n"
+          "nd        = %d\n"
+          "ni        = %d\n"
+          "ni2       = %d\n"
+          "ni3       = %d\n"
+          "trunc     = %d\n"
+          "lcomplex  = %d\n"
+          "reducedPointsSize   = %d\n",
+          datatype, gridptr->gme.nd, gridptr->gme.ni, gridptr->gme.ni2, gridptr->gme.ni3, gridptr->trunc, gridptr->lcomplex,
+          gridptr->reducedPointsSize);
+}
+
+static const double *
+gridInqXValsPtrSerial(grid_t *gridptr)
+{
+  return gridptr->x.vals;
+}
+
+#ifndef USE_MPI
+static const char **
+gridInqXCvalsPtrSerial(grid_t *gridptr)
+{
+  return (const char **) gridptr->x.cvals;
+}
+#endif
+
+const double *
+gridInqXvalsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXValsPtr(gridptr);
+}
+
+#ifndef USE_MPI
+const char **
+gridInqXCvalsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqXCvalsPtr(gridptr);
+}
+#endif
+
+static const double *
+gridInqYValsPtrSerial(grid_t *gridptr)
+{
+  return gridptr->y.vals;
+}
+
+#ifndef USE_MPI
+static const char **
+gridInqYCvalsPtrSerial(grid_t *gridptr)
+{
+  return (const char **) gridptr->y.cvals;
+}
+#endif
+
+const double *
+gridInqYvalsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYValsPtr(gridptr);
+}
+
+#ifndef USE_MPI
+const char **
+gridInqYCvalsPtr(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+  return gridptr->vtable->inqYCvalsPtr(gridptr);
+}
+#endif
+
+void
+gridProjParamsInit(struct CDI_GridProjParams *gpp)
+{
+  // clang-format off
+  gpp->mv      = CDI_Grid_Missval;   // Missing value
+  gpp->lon_0   = CDI_Grid_Missval;   // The East longitude of the meridian which is parallel to the Y-axis
+  gpp->lat_0   = CDI_Grid_Missval;   // Latitude of the projection origin
+  gpp->lat_1   = CDI_Grid_Missval;   // First latitude from the pole at which the secant cone cuts the sphere
+  gpp->lat_2   = CDI_Grid_Missval;   // Second latitude at which the secant cone cuts the sphere
+  gpp->a       = CDI_Grid_Missval;   // Semi-major axis or earth radius in metres (optional)
+  gpp->b       = CDI_Grid_Missval;   // Semi-minor axis in metres (optional)
+  gpp->rf      = CDI_Grid_Missval;   // Inverse flattening (1/f) (optional)
+  gpp->xval_0  = CDI_Grid_Missval;   // Longitude of the first grid point in degree (optional)
+  gpp->yval_0  = CDI_Grid_Missval;   // Latitude of the first grid point in degree (optional)
+  gpp->x_0     = CDI_Grid_Missval;   // False easting (optional)
+  gpp->y_0     = CDI_Grid_Missval;   // False northing (optional)
+  gpp->x_SP    = CDI_Grid_Missval;   // Longitude of southern pole
+  gpp->y_SP    = CDI_Grid_Missval;   // Latitude of southern pole
+  gpp->nside   = 0;                  // HEALPix number of points along a side (number of data points should be = 12 * nside * nside)
+  gpp->order   = -1;                 // HEALPix ordering convention (0:ring; 1:nested)
+  // clang-format on
+}
+
+static void
+gridDefParamsCommon(int gridID, struct CDI_GridProjParams gpp)
+{
+  if (IS_NOT_EQUAL(gpp.a, gpp.mv))
+    {
+      if (IS_NOT_EQUAL(gpp.b, gpp.mv))
+        {
+          cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_major_axis", CDI_DATATYPE_FLT64, 1, &gpp.a);
+          cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_minor_axis", CDI_DATATYPE_FLT64, 1, &gpp.b);
+        }
+      else
+        {
+          cdiDefAttFlt(gridID, CDI_GLOBAL, "earth_radius", CDI_DATATYPE_FLT64, 1, &gpp.a);
+        }
+    }
+  if (IS_NOT_EQUAL(gpp.rf, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "inverse_flattening", CDI_DATATYPE_FLT64, 1, &gpp.rf);
+  if (IS_NOT_EQUAL(gpp.x_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_easting", CDI_DATATYPE_FLT64, 1, &gpp.x_0);
+  if (IS_NOT_EQUAL(gpp.y_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_northing", CDI_DATATYPE_FLT64, 1, &gpp.y_0);
+  if (IS_NOT_EQUAL(gpp.xval_0, gpp.mv))
+    cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.xval_0);
+  if (IS_NOT_EQUAL(gpp.yval_0, gpp.mv))
+    cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.yval_0);
+  if (IS_NOT_EQUAL(gpp.x_SP, gpp.mv))
+    cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.x_SP);
+  if (IS_NOT_EQUAL(gpp.y_SP, gpp.mv))
+    cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.y_SP);
+}
+
+/*
+@Function  gridDefParamsLCC
+@Title     Define the parameters of a Lambert Conformal Conic grid
+
+@Prototype void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams)
+@Parameter
+    @Item  gridID          Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  gridProjParams  Grid projection parameters.
+
+@Description
+The function @func{gridDefParamsLCC} defines the parameters of a Lambert Conformal Conic grid.
+
+@EndFunction
+*/
+void
+gridDefParamsLCC(int gridID, struct CDI_GridProjParams gpp)
+{
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Lambert_Conformal");
+
+  const char *gmapname = "lambert_conformal_conic";
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname);
+  cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname);
+  int nlats = 0;
+  double lats[2];
+  lats[nlats++] = gpp.lat_1;
+  if (IS_NOT_EQUAL(gpp.lat_1, gpp.lat_2)) lats[nlats++] = gpp.lat_2;
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, nlats, lats);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "longitude_of_central_meridian", CDI_DATATYPE_FLT64, 1, &gpp.lon_0);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0);
+
+  gridDefParamsCommon(gridID, gpp);
+
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->projtype = CDI_PROJ_LCC;
+
+  if (gridptr->type != GRID_PROJECTION) gridptr->type = GRID_PROJECTION;
+
+  gridVerifyProj(gridID);
+}
+
+/*
+@Function  gridInqParamsLCC
+@Title     Get the parameter of a Lambert Conformal Conic grid
+
+@Prototype void gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp)
+@Parameter
+    @Item  gridID          Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  gridProjParams  Grid projection parameters.
+
+@Description
+The function @func{gridInqParamsLCC} returns the parameter of a Lambert Conformal Conic grid.
+
+@EndFunction
+*/
+int
+gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp)
+{
+  int status = -1;
+  if (gridInqType(gridID) != GRID_PROJECTION) return status;
+
+  gridProjParamsInit(gpp);
+
+  status = -2;
+  const char *projection = "lambert_conformal_conic";
+  char gmapname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length);
+  if (gmapname[0] && str_is_equal(gmapname, projection))
+    {
+      char attname[CDI_MAX_NAME + 1];
+
+      int natts;
+      cdiInqNatts(gridID, CDI_GLOBAL, &natts);
+
+      if (natts) status = 0;
+
+      for (int iatt = 0; iatt < natts; ++iatt)
+        {
+          int atttype, attlen;
+          cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen);
+          if (attlen > 2) continue;
+
+          double attflt[2];
+          if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt))
+            {
+              // clang-format off
+              if      (str_is_equal(attname, "earth_radius"))                       gpp->a      = attflt[0];
+              else if (str_is_equal(attname, "semi_major_axis"))                    gpp->a      = attflt[0];
+              else if (str_is_equal(attname, "semi_minor_axis"))                    gpp->b      = attflt[0];
+              else if (str_is_equal(attname, "inverse_flattening"))                 gpp->rf     = attflt[0];
+              else if (str_is_equal(attname, "longitude_of_central_meridian"))      gpp->lon_0  = attflt[0];
+              else if (str_is_equal(attname, "latitude_of_projection_origin"))      gpp->lat_0  = attflt[0];
+              else if (str_is_equal(attname, "false_easting"))                      gpp->x_0    = attflt[0];
+              else if (str_is_equal(attname, "false_northing"))                     gpp->y_0    = attflt[0];
+              else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0];
+              else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees"))  gpp->yval_0 = attflt[0];
+              else if (str_is_equal(attname, "longitudeOfSouthernPoleInDegrees"))   gpp->x_SP   = attflt[0];
+              else if (str_is_equal(attname, "latitudeOfSouthernPoleInDegrees"))    gpp->y_SP   = attflt[0];
+              else if (str_is_equal(attname, "standard_parallel"))
+                {
+                  gpp->lat_1 = attflt[0];
+                  gpp->lat_2 = (attlen == 2) ? attflt[1] : attflt[0];
+                }
+              // clang-format on
+            }
+        }
+    }
+
+  return status;
+}
+
+int
+gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp)
+{
+  static bool lwarn = true;
+
+  if (lwarn)
+    {
+      // lwarn = false;
+      const char *projection = "lambert_conformal_conic";
+      if (IS_EQUAL(gpp->lon_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitude_of_central_meridian");
+      if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_central_meridian");
+      if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel");
+      if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv)
+          && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)))
+        {
+          if (proj_lcc_to_lonlat_func)
+            {
+              gpp->xval_0 = -gpp->x_0;
+              gpp->yval_0 = -gpp->y_0;
+              proj_lcc_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0);
+            }
+          if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))
+            Warning("%s mapping parameter %s missing!", projection,
+                    "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees");
+        }
+    }
+
+  return 0;
+}
+
+int
+gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp)
+{
+  static bool lwarn = true;
+
+  if (lwarn)
+    {
+      // lwarn = false;
+      const char *projection = "polar_stereographic";
+      if (IS_EQUAL(gpp->lon_0, gpp->mv))
+        Warning("%s mapping parameter %s missing!", projection, "straight_vertical_longitude_from_pole");
+      if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_projection_origin");
+      if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel");
+      if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv)
+          && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)))
+        {
+          if (proj_stere_to_lonlat_func)
+            {
+              gpp->xval_0 = -gpp->x_0;
+              gpp->xval_0 = -gpp->y_0;
+              proj_stere_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0);
+            }
+          if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))
+            Warning("%s mapping parameter %s missing!", projection,
+                    "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees");
+        }
+    }
+
+  return 0;
+}
+
+int
+gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp)
+{
+  static bool lwarn = true;
+
+  if (lwarn)
+    {
+      lwarn = false;
+      const char *projection = "healpix";
+      if (IS_EQUAL(gpp->nside, -1)) Error("%s mapping parameter %s missing!", projection, "nside");
+      if (IS_EQUAL(gpp->order, -1)) Error("%s mapping parameter %s missing!", projection, "order");
+      if (gpp->nside == 0) Error("%s mapping parameter %s unsupported!", projection, "nside", gpp->nside);
+      if (gpp->order != 0 && gpp->order != 1) Error("%s mapping parameter %s=%d unsupported!", projection, "order", gpp->order);
+    }
+
+  return 0;
+}
+
+/*
+@Function  gridDefParamsSTERE
+@Title     Define the parameter of a Polar stereographic grid
+
+@Prototype void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams)
+@Parameter
+    @Item  gridID          Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  gridProjParams  Grid projection parameters.
+
+@Description
+The function @func{gridDefParamsSTERE} defines the parameter of a Polar stereographic grid.
+
+@EndFunction
+*/
+void
+gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gpp)
+{
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Polar_Stereographic");
+
+  const char *gmapname = "polar_stereographic";
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname);
+  cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, 1, &gpp.lat_1);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "straight_vertical_longitude_from_pole", CDI_DATATYPE_FLT64, 1, &gpp.lon_0);
+  cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0);
+
+  gridDefParamsCommon(gridID, gpp);
+
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->projtype = CDI_PROJ_STERE;
+
+  gridVerifyProj(gridID);
+}
+void
+gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gpp)
+{
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix");
+
+  const char *gmapname = "healpix";
+  cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname);
+  cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname);
+
+  cdiDefAttInt(gridID, CDI_GLOBAL, "healpix_nside", CDI_DATATYPE_INT32, 1, &gpp.nside);
+  const char *orderName = (gpp.order == 1) ? "nested" : "ring";
+  cdiDefAttTxt(gridID, CDI_GLOBAL, "healpix_order", (int) (strlen(orderName)), orderName);
+
+  // gridDefParamsCommon(gridID, gpp);
+
+  grid_t *gridptr = grid_to_pointer(gridID);
+  gridptr->projtype = CDI_PROJ_HEALPIX;
+
+  // gridVerifyProj(gridID);
+}
+
+/*
+@Function  gridInqParamsSTERE
+@Title     Get the parameter of a Polar stereographic grid
+
+@Prototype void gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp)
+@Parameter
+    @Item  gridID    Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+    @Item  gridProjParams  Grid projection parameters.
+
+@Description
+The function @func{gridInqParamsSTERE} returns the parameter of a Polar stereographic grid.
+
+@EndFunction
+*/
+int
+gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp)
+{
+  int status = -1;
+  if (gridInqType(gridID) != GRID_PROJECTION) return status;
+
+  gridProjParamsInit(gpp);
+
+  status = -2;
+  const char *projection = "polar_stereographic";
+  char gmapname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length);
+  if (gmapname[0] && str_is_equal(gmapname, projection))
+    {
+      int atttype, attlen;
+      char attname[CDI_MAX_NAME + 1];
+
+      int natts;
+      cdiInqNatts(gridID, CDI_GLOBAL, &natts);
+
+      if (natts) status = 0;
+
+      for (int iatt = 0; iatt < natts; ++iatt)
+        {
+          cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen);
+          if (attlen > 2) continue;
+
+          double attflt[2];
+          if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt))
+            {
+              // clang-format off
+              if      (str_is_equal(attname, "earth_radius"))                          gpp->a      = attflt[0];
+              else if (str_is_equal(attname, "semi_major_axis"))                       gpp->a      = attflt[0];
+              else if (str_is_equal(attname, "semi_minor_axis"))                       gpp->b      = attflt[0];
+              else if (str_is_equal(attname, "inverse_flattening"))                    gpp->rf     = attflt[0];
+              else if (str_is_equal(attname, "standard_parallel"))                     gpp->lat_1  = attflt[0];
+              else if (str_is_equal(attname, "straight_vertical_longitude_from_pole")) gpp->lon_0  = attflt[0];
+              else if (str_is_equal(attname, "latitude_of_projection_origin"))         gpp->lat_0  = attflt[0];
+              else if (str_is_equal(attname, "false_easting"))                         gpp->x_0    = attflt[0];
+              else if (str_is_equal(attname, "false_northing"))                        gpp->y_0    = attflt[0];
+              else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees"))    gpp->xval_0 = attflt[0];
+              else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees"))     gpp->yval_0 = attflt[0];
+              // clang-format on
+            }
+        }
+    }
+
+  return status;
+}
+
+int
+gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gpp)
+{
+  int status = -1;
+  if (gridInqType(gridID) != GRID_PROJECTION) return status;
+
+  gridProjParamsInit(gpp);
+
+  status = -2;
+  const char *projection = "healpix";
+  char gmapname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length);
+  if (gmapname[0] && str_is_equal(gmapname, projection))
+    {
+      int atttype, attlen;
+      char attname[CDI_MAX_NAME + 1];
+
+      int natts;
+      cdiInqNatts(gridID, CDI_GLOBAL, &natts);
+
+      if (natts) status = 0;
+
+      for (int iatt = 0; iatt < natts; ++iatt)
+        {
+          cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen);
+
+          if (atttype == CDI_DATATYPE_TXT)
+            {
+              char attstring[256];
+              if (cdiInqAttTxt(gridID, CDI_GLOBAL, attname, (int) sizeof(attstring), attstring) == 0)
+                {
+                  attstring[attlen] = 0;
+                  if (str_is_equal(attname, "healpix_order")) gpp->order = strStartsWith(attstring, "nest");
+                }
+            }
+          else
+            {
+              if (attlen > 2) continue;
+              double attflt[2];
+              if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt))
+                {
+                  // clang-format off
+                  if      (str_is_equal(attname, "earth_radius"))                          gpp->a      = attflt[0];
+                  else if (str_is_equal(attname, "semi_major_axis"))                       gpp->a      = attflt[0];
+                  else if (str_is_equal(attname, "semi_minor_axis"))                       gpp->b      = attflt[0];
+                  else if (str_is_equal(attname, "inverse_flattening"))                    gpp->rf     = attflt[0];
+                  else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees"))    gpp->xval_0 = attflt[0];
+                  else if (str_is_equal(attname, "healpix_nside"))                         gpp->nside  = (int) lround(attflt[0]);
+                  // clang-format on
+                }
+            }
+        }
+    }
+
+  return status;
+}
+
+void
+gridDefComplexPacking(int gridID, int lcomplex)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->lcomplex != lcomplex)
+    {
+      gridptr->lcomplex = lcomplex != 0;
+      gridMark4Update(gridID);
+    }
+}
+
+int
+gridInqComplexPacking(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  return (int) gridptr->lcomplex;
+}
+
+void
+gridDefHasDims(int gridID, int hasdims)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  if (gridptr->hasdims != (hasdims != 0))
+    {
+      gridptr->hasdims = hasdims != 0;
+      gridMark4Update(gridID);
+    }
+}
+
+int
+gridInqHasDims(int gridID)
+{
+  grid_t *gridptr = grid_to_pointer(gridID);
+
+  return (int) gridptr->hasdims;
+}
+
+/*
+@Function  gridDefNumber
+@Title     Define the reference number for an unstructured grid
+
+@Prototype void gridDefNumber(int gridID, int number)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  number   Reference number for an unstructured grid.
+
+@Description
+The function @func{gridDefNumber} defines the reference number for an unstructured grid.
+
+@EndFunction
+*/
+void
+gridDefNumber(int gridID, int number)
+{
+  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number);
+}
+
+/*
+@Function  gridInqNumber
+@Title     Get the reference number to an unstructured grid
+
+@Prototype int gridInqNumber(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqNumber} returns the reference number to an unstructured grid.
+
+@Result
+@func{gridInqNumber} returns the reference number to an unstructured grid.
+@EndFunction
+*/
+int
+gridInqNumber(int gridID)
+{
+  int number = 0;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number);
+  return number;
+}
+
+/*
+@Function  gridDefPosition
+@Title     Define the position of grid in the reference file
+
+@Prototype void gridDefPosition(int gridID, int position)
+@Parameter
+    @Item  gridID     Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  position   Position of grid in the reference file.
+
+@Description
+The function @func{gridDefPosition} defines the position of grid in the reference file.
+
+@EndFunction
+*/
+void
+gridDefPosition(int gridID, int position)
+{
+  cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position);
+}
+
+/*
+@Function  gridInqPosition
+@Title     Get the position of grid in the reference file
+
+@Prototype int gridInqPosition(int gridID)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqPosition} returns the position of grid in the reference file.
+
+@Result
+@func{gridInqPosition} returns the position of grid in the reference file.
+@EndFunction
+*/
+int
+gridInqPosition(int gridID)
+{
+  int position = 0;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position);
+  return position;
+}
+
+/*
+@Function  gridDefReference
+@Title     Define the reference URI for an unstructured grid
+
+@Prototype void gridDefReference(int gridID, const char *reference)
+@Parameter
+    @Item  gridID      Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  reference   Reference URI for an unstructured grid.
+
+@Description
+The function @func{gridDefReference} defines the reference URI for an unstructured grid.
+
+@EndFunction
+*/
+void
+gridDefReference(int gridID, const char *reference)
+{
+  if (reference)
+    {
+      cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference);
+      gridMark4Update(gridID);
+    }
+}
+
+/*
+@Function  gridInqReference
+@Title     Get the reference URI to an unstructured grid
+
+@Prototype char *gridInqReference(int gridID, char *reference)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqReference} returns the reference URI to an unstructured grid.
+
+@Result
+@func{gridInqReference} returns the reference URI to an unstructured grid.
+@EndFunction
+*/
+int
+gridInqReference(int gridID, char *reference)
+{
+  int length = 0;
+  if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length))
+    {
+      if (reference) cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length);
+    }
+
+  return length;
+}
+
+/*
+@Function  gridDefUUID
+@Title     Define the UUID for an unstructured grid
+
+@Prototype void gridDefUUID(int gridID, const char *uuid)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  uuid     UUID for an unstructured grid.
+
+@Description
+The function @func{gridDefUUID} defines the UUID for an unstructured grid.
+
+@EndFunction
+*/
+void
+gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE])
+{
+  cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE);
+
+  gridMark4Update(gridID);
+}
+
+/*
+@Function  gridInqUUID
+@Title     Get the UUID to an unstructured grid
+
+@Prototype void gridInqUUID(int gridID, char *uuid)
+@Parameter
+    @Item  gridID   Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}.
+
+@Description
+The function @func{gridInqUUID} returns the UUID to an unstructured grid.
+
+@Result
+@func{gridInqUUID} returns the UUID to an unstructured grid to the parameter uuid.
+@EndFunction
+*/
+void
+gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE])
+{
+  memset(uuid, 0, CDI_UUID_SIZE);
+  int length = CDI_UUID_SIZE;
+  cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+}
+
+void
+cdiGridGetIndexList(unsigned ngrids, int *gridIndexList)
+{
+  reshGetResHListOfType(ngrids, gridIndexList, &gridOps);
+}
+
+static int
+gridTxCode(void *voidP)
+{
+  grid_t *gridptr = (grid_t *) voidP;
+  return gridptr->vtable->txCode;
+}
+
+enum
+{
+  GRID_PACK_INT_IDX_SELF,
+  GRID_PACK_INT_IDX_TYPE,
+  GRID_PACK_INT_IDX_IS_CYCLIC,
+  GRID_PACK_INT_IDX_X_FLAG,
+  GRID_PACK_INT_IDX_Y_FLAG,
+  GRID_PACK_INT_IDX_GME_ND,
+  GRID_PACK_INT_IDX_GME_NI,
+  GRID_PACK_INT_IDX_GME_NI2,
+  GRID_PACK_INT_IDX_GME_NI3,
+  GRID_PACK_INT_IDX_TRUNC,
+  GRID_PACK_INT_IDX_NVERTEX,
+  GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE,
+  GRID_PACK_INT_IDX_SIZE,
+  GRID_PACK_INT_IDX_X_SIZE,
+  GRID_PACK_INT_IDX_Y_SIZE,
+  GRID_PACK_INT_IDX_LCOMPLEX,
+  GRID_PACK_INT_IDX_MEMBERMASK,
+  /*
+  GRID_PACK_INT_IDX_XTSTDNNAME,
+  GRID_PACK_INT_IDX_YTSTDNNAME,
+  GRID_PACK_INT_IDX_ISCANSNEGATIVELY,
+  GRID_PACK_INT_IDX_JSCANSPOSITIVELY,
+  GRID_PACK_INT_IDX_JPOINTSARECONSECUTIVE,
+  */
+  gridNint
+};
+
+enum
+{
+  GRID_PACK_DBL_IDX_X_FIRST,
+  GRID_PACK_DBL_IDX_Y_FIRST,
+  GRID_PACK_DBL_IDX_X_LAST,
+  GRID_PACK_DBL_IDX_Y_LAST,
+  GRID_PACK_DBL_IDX_X_INC,
+  GRID_PACK_DBL_IDX_Y_INC,
+  gridNdouble
+};
+
+enum
+{
+  gridHasMaskFlag = 1 << 0,
+  gridHasGMEMaskFlag = 1 << 1,
+  gridHasXValsFlag = 1 << 2,
+  gridHasYValsFlag = 1 << 3,
+  gridHasAreaFlag = 1 << 4,
+  gridHasXBoundsFlag = 1 << 5,
+  gridHasYBoundsFlag = 1 << 6,
+  gridHasReducedPointsFlag = 1 << 7,
+};
+
+static int
+gridGetComponentFlags(const grid_t *gridP)
+{
+  int flags = 0;
+  for (int prop = 0; prop < GRID_PROP_YBOUNDS + 1; ++prop)
+    flags |= (gridP->vtable->inqPropPresence((grid_t *) gridP, (enum gridPropInq) prop) << prop);
+  flags |= (gridHasReducedPointsFlag & (int) ((unsigned) (gridP->reducedPoints == NULL) - 1U));
+  return flags;
+}
+
+static int
+gridGetPackSize(void *voidP, void *context)
+{
+  grid_t *gridP = (grid_t *) voidP;
+  return gridP->vtable->getPackSize(gridP, context);
+}
+
+static int gridGetPackSizeScalars(grid_t *gridP, void *context);
+
+static int gridGetPackSizeArrays(grid_t *gridP, void *context);
+
+static int
+gridGetPackSizeBase(grid_t *gridP, void *context)
+{
+  return gridP->vtable->getPackSizeScalars(gridP, context) + gridP->vtable->getPackSizeArrays(gridP, context);
+}
+
+static int
+gridGetPackSizeScalars(grid_t *gridP, void *context)
+{
+  int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  packBuffSize += serializeGetSize(gridNint, CDI_DATATYPE_INT, context) + ui32PackSize;
+
+  packBuffSize += serializeGetSize(gridNdouble, CDI_DATATYPE_FLT64, context) + ui32PackSize;
+
+  packBuffSize += serializeKeysGetPackSize(&gridP->keys, context);
+  packBuffSize += serializeKeysGetPackSize(&gridP->x.keys, context);
+  packBuffSize += serializeKeysGetPackSize(&gridP->y.keys, context);
+
+  return packBuffSize;
+}
+
+static int
+gridGetPackSizeArrays(grid_t *gridP, void *context)
+{
+  int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+  size_t count;
+
+  if (gridP->reducedPoints)
+    {
+      xassert(gridP->reducedPointsSize);
+      packBuffSize += serializeGetSize(gridP->reducedPointsSize, CDI_DATATYPE_INT, context) + ui32PackSize;
+    }
+
+  if (gridP->vtable->inqXValsPtr(gridP))
+    {
+      if (gridP->type == GRID_UNSTRUCTURED || gridP->type == GRID_CURVILINEAR)
+        count = gridP->size;
+      else
+        count = gridP->x.size;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize;
+    }
+
+  if (gridP->vtable->inqYValsPtr(gridP))
+    {
+      if (gridP->type == GRID_UNSTRUCTURED || gridP->type == GRID_CURVILINEAR)
+        count = gridP->size;
+      else
+        count = gridP->y.size;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize;
+    }
+
+  if (gridP->vtable->inqAreaPtr(gridP))
+    {
+      count = gridP->size;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize;
+    }
+
+  if (gridP->x.bounds)
+    {
+      xassert(gridP->nvertex);
+      count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize;
+    }
+
+  if (gridP->y.bounds)
+    {
+      xassert(gridP->nvertex);
+      count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += (serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize);
+    }
+
+  if (gridP->mask)
+    {
+      count = gridP->size;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize;
+    }
+
+  if (gridP->mask_gme)
+    {
+      count = gridP->size;
+      xassert(count && count <= INT_MAX);
+      packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize;
+    }
+
+  return packBuffSize;
+}
+
+static grid_t *gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context,
+                                 int force_id, int *memberMaskP);
+
+static void gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos,
+                             int originNamespace, void *context);
+
+int
+gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id)
+{
+  gridInit();
+  int memberMask;
+  grid_t *gridP
+      = gridUnpackScalars(unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context, force_id, &memberMask);
+  gridP->vtable->unpackArrays(gridP, memberMask, unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context);
+  reshSetStatus(gridP->self, &gridOps, reshGetStatus(gridP->self, &gridOps) & ~RESH_SYNC_BIT);
+  return gridP->self;
+}
+
+static grid_t *
+gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id,
+                  int *memberMaskP)
+{
+  grid_t *gridP;
+  uint32_t d;
+  int memberMask;
+  {
+    int intBuffer[gridNint];
+    serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, gridNint, CDI_DATATYPE_INT, context);
+    serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+
+    xassert(cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer) == d);
+    int targetID = namespaceAdaptKey(intBuffer[0], originNamespace);
+    gridP = gridNewEntry(force_id ? targetID : CDI_UNDEFID);
+
+    xassert(!force_id || targetID == gridP->self);
+
+    gridP->type = intBuffer[GRID_PACK_INT_IDX_TYPE];
+    gridP->isCyclic = (signed char) intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC];
+    gridP->x.flag = (short) intBuffer[GRID_PACK_INT_IDX_X_FLAG];
+    gridP->y.flag = (short) intBuffer[GRID_PACK_INT_IDX_Y_FLAG];
+    gridP->gme.nd = intBuffer[GRID_PACK_INT_IDX_GME_ND];
+    gridP->gme.ni = intBuffer[GRID_PACK_INT_IDX_GME_NI];
+    gridP->gme.ni2 = intBuffer[GRID_PACK_INT_IDX_GME_NI2];
+    gridP->gme.ni3 = intBuffer[GRID_PACK_INT_IDX_GME_NI3];
+    gridP->trunc = intBuffer[GRID_PACK_INT_IDX_TRUNC];
+    gridP->nvertex = intBuffer[GRID_PACK_INT_IDX_NVERTEX];
+    gridP->reducedPointsSize = intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE];
+    /* FIXME: use int64_t for the following 3 */
+    gridP->size = (size_t) intBuffer[GRID_PACK_INT_IDX_SIZE];
+    gridP->x.size = (size_t) intBuffer[GRID_PACK_INT_IDX_X_SIZE];
+    gridP->y.size = (size_t) intBuffer[GRID_PACK_INT_IDX_Y_SIZE];
+    gridP->lcomplex = (bool) intBuffer[GRID_PACK_INT_IDX_LCOMPLEX];
+    memberMask = intBuffer[GRID_PACK_INT_IDX_MEMBERMASK];
+  }
+
+  {
+    double doubleBuffer[gridNdouble];
+    serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, context);
+    serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+    xassert(d == cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer));
+
+    gridP->x.first = doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST];
+    gridP->y.first = doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST];
+    gridP->x.last = doubleBuffer[GRID_PACK_DBL_IDX_X_LAST];
+    gridP->y.last = doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST];
+    gridP->x.inc = doubleBuffer[GRID_PACK_DBL_IDX_X_INC];
+    gridP->y.inc = doubleBuffer[GRID_PACK_DBL_IDX_Y_INC];
+  }
+
+  serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->keys, context);
+  serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->x.keys, context);
+  serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->y.keys, context);
+
+  *memberMaskP = memberMask;
+  return gridP;
+}
+
+static void
+gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace,
+                 void *context)
+{
+  UNUSED(originNamespace);
+  uint32_t d;
+
+  if (memberMask & gridHasReducedPointsFlag)
+    {
+      xassert(gridP->reducedPointsSize);
+      gridP->reducedPoints = (int *) Malloc((size_t) gridP->reducedPointsSize * sizeof(int));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->reducedPoints, gridP->reducedPointsSize,
+                      CDI_DATATYPE_INT, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_INT, gridP->reducedPointsSize, gridP->reducedPoints) == d);
+    }
+
+  bool isIrregular = grid_is_irregular(gridP->type);
+  if (memberMask & gridHasXValsFlag)
+    {
+      size_t size = isIrregular ? gridP->size : gridP->x.size;
+      xassert(size <= INT_MAX);
+      gridP->x.vals = (double *) Malloc(size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.vals, (int) size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.vals) == d);
+    }
+
+  if (memberMask & gridHasYValsFlag)
+    {
+      size_t size = isIrregular ? gridP->size : gridP->y.size;
+      xassert(size > 0 && size <= INT_MAX);
+      gridP->y.vals = (double *) Malloc(size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.vals, (int) size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.vals) == d);
+    }
+
+  if (memberMask & gridHasAreaFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size > 0 && size <= INT_MAX);
+      gridP->area = (double *) Malloc(size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->area, (int) size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area) == d);
+    }
+
+  if (memberMask & gridHasXBoundsFlag)
+    {
+      size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->x.size);
+      xassert(size > 0 && size <= INT_MAX);
+
+      gridP->x.bounds = (double *) Malloc(size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds) == d);
+    }
+
+  if (memberMask & gridHasYBoundsFlag)
+    {
+      size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->y.size);
+      xassert(size && size <= INT_MAX);
+      gridP->y.bounds = (double *) Malloc(size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds) == d);
+    }
+
+  if (memberMask & gridHasMaskFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size && size <= INT_MAX);
+      gridP->mask = (mask_t *) Malloc(size * sizeof(mask_t));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask, (int) size, CDI_DATATYPE_UCHAR, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask) == d);
+    }
+
+  if (memberMask & gridHasGMEMaskFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size && size <= INT_MAX);
+      gridP->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme) == d);
+    }
+}
+
+void
+gridPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  grid_t *gridP = (grid_t *) voidP;
+  gridP->vtable->pack(gridP, packBuffer, packBufferSize, packBufferPos, context);
+}
+
+static void
+gridPackBase(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  int memberMask = gridP->vtable->packScalars(gridP, packBuffer, packBufferSize, packBufferPos, context);
+  gridP->vtable->packArrays(gridP, memberMask, packBuffer, packBufferSize, packBufferPos, context);
+}
+
+static int
+gridPackScalars(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  uint32_t d;
+  int memberMask;
+
+  {
+    int intBuffer[gridNint];
+
+    intBuffer[GRID_PACK_INT_IDX_SELF] = gridP->self;
+    intBuffer[GRID_PACK_INT_IDX_TYPE] = gridP->type;
+    intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC] = gridP->isCyclic;
+    intBuffer[GRID_PACK_INT_IDX_X_FLAG] = gridP->x.flag;
+    intBuffer[GRID_PACK_INT_IDX_Y_FLAG] = gridP->y.flag;
+    intBuffer[GRID_PACK_INT_IDX_GME_ND] = gridP->gme.nd;
+    intBuffer[GRID_PACK_INT_IDX_GME_NI] = gridP->gme.ni;
+    intBuffer[GRID_PACK_INT_IDX_GME_NI2] = gridP->gme.ni2;
+    intBuffer[GRID_PACK_INT_IDX_GME_NI3] = gridP->gme.ni3;
+    intBuffer[GRID_PACK_INT_IDX_TRUNC] = gridP->trunc;
+    intBuffer[GRID_PACK_INT_IDX_NVERTEX] = gridP->nvertex;
+    intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE] = gridP->reducedPointsSize;
+    xassert(gridP->size <= INT_MAX && gridP->x.size <= INT_MAX && gridP->y.size <= INT_MAX);
+    intBuffer[GRID_PACK_INT_IDX_SIZE] = (int) gridP->size;
+    intBuffer[GRID_PACK_INT_IDX_X_SIZE] = (int) gridP->x.size;
+    intBuffer[GRID_PACK_INT_IDX_Y_SIZE] = (int) gridP->y.size;
+    intBuffer[GRID_PACK_INT_IDX_LCOMPLEX] = gridP->lcomplex;
+    intBuffer[GRID_PACK_INT_IDX_MEMBERMASK] = memberMask = gridGetComponentFlags(gridP);
+
+    serializePack(intBuffer, gridNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context);
+    d = cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer);
+    serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+  }
+
+  {
+    double doubleBuffer[gridNdouble];
+
+    doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST] = gridP->x.first;
+    doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST] = gridP->y.first;
+    doubleBuffer[GRID_PACK_DBL_IDX_X_LAST] = gridP->x.last;
+    doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST] = gridP->y.last;
+    doubleBuffer[GRID_PACK_DBL_IDX_X_INC] = gridP->x.inc;
+    doubleBuffer[GRID_PACK_DBL_IDX_Y_INC] = gridP->y.inc;
+
+    serializePack(doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+    d = cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer);
+    serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+  }
+
+  serializeKeysPack(&gridP->keys, packBuffer, packBufferSize, packBufferPos, context);
+  serializeKeysPack(&gridP->x.keys, packBuffer, packBufferSize, packBufferPos, context);
+  serializeKeysPack(&gridP->y.keys, packBuffer, packBufferSize, packBufferPos, context);
+
+  return memberMask;
+}
+
+static void
+gridPackArrays(grid_t *gridP, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  uint32_t d;
+  bool isIrregular = grid_is_irregular(gridP->type);
+
+  if (memberMask & gridHasReducedPointsFlag)
+    {
+      size_t size = (size_t) gridP->reducedPointsSize;
+      xassert(size > 0 && size <= INT_MAX);
+      serializePack(gridP->reducedPoints, (int) size, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_INT, (int) size, gridP->reducedPoints);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasXValsFlag)
+    {
+      size_t size = isIrregular ? gridP->size : gridP->x.size;
+      xassert(size && size <= INT_MAX);
+
+      const double *gridP_xvals = gridP->vtable->inqXValsPtr(gridP);
+      serializePack(gridP_xvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_xvals);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasYValsFlag)
+    {
+      size_t size = isIrregular ? gridP->size : gridP->y.size;
+      xassert(size && size <= INT_MAX);
+      const double *gridP_yvals = gridP->vtable->inqYValsPtr(gridP);
+      serializePack(gridP_yvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_yvals);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasAreaFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size && size <= INT_MAX);
+      serializePack(gridP->area, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasXBoundsFlag)
+    {
+      size_t size = (isIrregular ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex;
+      xassert(size && size <= INT_MAX);
+      serializePack(gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasYBoundsFlag)
+    {
+      size_t size = (isIrregular ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex;
+      xassert(size && size <= INT_MAX);
+      serializePack(gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasMaskFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size && size <= INT_MAX);
+      serializePack(gridP->mask, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & gridHasGMEMaskFlag)
+    {
+      size_t size = gridP->size;
+      xassert(size && size <= INT_MAX);
+      serializePack(gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+}
+
+struct gridCompareSearchState
+{
+  int resIDValue;
+  const grid_t *queryKey;
+};
+
+static enum cdiApplyRet
+gridCompareSearch(int id, void *res, void *data)
+{
+  struct gridCompareSearchState *state = (struct gridCompareSearchState *) data;
+  (void) res;
+  if (gridCompare(id, state->queryKey, true) == false)
+    {
+      state->resIDValue = id;
+      return CDI_APPLY_STOP;
+    }
+  else
+    return CDI_APPLY_GO_ON;
+}
+
+// Add grid (which must be Malloc'ed to vlist if not already found)
+struct addIfNewRes
+cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode)
+{
+  /*
+    mode: 0 search in vlist and grid table
+          1 search in grid table only
+          2 search in grid table only and don't store the grid in vlist
+   */
+  bool gridIsDefinedGlobal = false;
+  bool gridIsDefined = false;
+  int gridID = CDI_UNDEFID;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int ngrids = vlistptr->ngrids;
+
+  if (mode == 0)
+    for (int index = 0; index < ngrids; index++)
+      {
+        if ((gridID = vlistptr->gridIDs[index]) != CDI_UNDEFID)
+          {
+            if (gridCompare(gridID, grid, false) == false)
+              {
+                gridIsDefined = true;
+                break;
+              }
+          }
+        else
+          Error("Internal problem: undefined gridID in vlist %d, position %u!", vlistID, index);
+      }
+
+  if (!gridIsDefined)
+    {
+      struct gridCompareSearchState query;
+      query.queryKey = grid;  // = { .queryKey = grid };
+      if ((gridIsDefinedGlobal = (cdiGridApply(gridCompareSearch, &query) == CDI_APPLY_STOP))) gridID = query.resIDValue;
+
+      if (mode == 1 && gridIsDefinedGlobal)
+        for (int index = 0; index < ngrids; index++)
+          if (vlistptr->gridIDs[index] == gridID)
+            {
+              gridIsDefinedGlobal = false;
+              break;
+            }
+    }
+
+  if (!gridIsDefined)
+    {
+      if (!gridIsDefinedGlobal)
+        {
+          grid->self = gridID = reshPut(grid, &gridOps);
+          grid_complete(grid);
+        }
+      if (mode < 2)
+        {
+          if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded, MAX_GRIDS_PS=%d needs to be increased!", MAX_GRIDS_PS);
+          vlistptr->gridIDs[ngrids] = gridID;
+          vlistptr->ngrids++;
+        }
+    }
+
+  return (struct addIfNewRes){ .Id = gridID, .isNew = (!gridIsDefined && !gridIsDefinedGlobal) };
+}
+
+const struct gridVirtTable cdiGridVtable = {
+  .destroy = gridDestroyKernel,
+  .copy = grid_copy_base,
+  .copyScalarFields = grid_copy_base_scalar_fields,
+  .copyArrayFields = grid_copy_base_array_fields,
+  .defXVals = gridDefXValsSerial,
+  .defYVals = gridDefYValsSerial,
+  .defMask = gridDefMaskSerial,
+  .defMaskGME = gridDefMaskGMESerial,
+  .defXBounds = gridDefXBoundsSerial,
+  .defYBounds = gridDefYBoundsSerial,
+  .defArea = gridDefAreaSerial,
+  .inqXVal = gridInqXValSerial,
+  .inqYVal = gridInqYValSerial,
+  .inqXVals = gridInqXValsSerial,
+  .inqXValsPart = gridInqXValsPartSerial,
+  .inqYVals = gridInqYValsSerial,
+  .inqYValsPart = gridInqYValsPartSerial,
+  .inqXValsPtr = gridInqXValsPtrSerial,
+  .inqYValsPtr = gridInqYValsPtrSerial,
+#ifndef USE_MPI
+  .inqXIsc = gridInqXIscSerial,
+  .inqYIsc = gridInqYIscSerial,
+  .inqXCvals = gridInqXCvalsSerial,
+  .inqYCvals = gridInqYCvalsSerial,
+  .inqXCvalsPtr = gridInqXCvalsPtrSerial,
+  .inqYCvalsPtr = gridInqYCvalsPtrSerial,
+#endif
+  .inqXInc = gridInqXIncBase,
+  .inqYInc = gridInqYIncBase,
+  .compareXYFull = compareXYvals,
+  .compareXYAO = compareXYvals2,
+  .inqArea = gridInqAreaSerial,
+  .inqAreaPtr = gridInqAreaPtrBase,
+  .inqPropPresence = gridInqPropPresenceBase,
+  .inqMask = gridInqMaskSerial,
+  .inqMaskGME = gridInqMaskGMESerial,
+  .inqXBounds = gridInqXBoundsSerial,
+  .inqYBounds = gridInqYBoundsSerial,
+  .inqXBoundsPtr = gridInqXBoundsPtrSerial,
+  .inqYBoundsPtr = gridInqYBoundsPtrSerial,
+  .txCode = GRID,
+  .getPackSize = gridGetPackSizeBase,
+  .getPackSizeScalars = gridGetPackSizeScalars,
+  .getPackSizeArrays = gridGetPackSizeArrays,
+  .unpackScalars = gridUnpackScalars,
+  .unpackArrays = gridUnpackArrays,
+  .pack = gridPackBase,
+  .packScalars = gridPackScalars,
+  .packArrays = gridPackArrays,
+};
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+
+static int initIegLib = 0;
+static int iegDefaultDprec = 0;
+
+// A version string.
+#undef LIBVERSION
+#define LIBVERSION 2.0.0
+#define XSTRING(x) #x
+#define STRING(x) XSTRING(x)
+static const char ieg_libvers[] = STRING(LIBVERSION);
+
+const char *
+iegLibraryVersion(void)
+{
+  return ieg_libvers;
+}
+
+static int IEG_Debug = 0;  // If set to 1, debugging
+
+static void
+iegLibInit(void)
+{
+  const char *envName = "IEG_PRECISION";
+
+  char *envString = getenv(envName);
+  if (envString)
+    {
+      int nrun = (strlen(envString) == 2) ? 1 : 2;
+      int pos = 0;
+      while (nrun--)
+        {
+          switch (tolower((int) envString[pos]))
+            {
+            case 'r':
+              {
+                switch ((int) envString[pos + 1])
+                  {
+                  case '4': iegDefaultDprec = EXSE_PREC_FP32; break;
+                  case '8': iegDefaultDprec = EXSE_PREC_FP64; break;
+                  default: Warning("Invalid digit in %s: %s", envName, envString);
+                  }
+                break;
+              }
+            default:
+              {
+                Warning("Invalid character in %s: %s", envName, envString);
+                break;
+              }
+            }
+          pos += 2;
+        }
+    }
+
+  initIegLib = 1;
+}
+
+void
+iegDebug(int debug)
+{
+  if (debug) Message("debug level %d", debug);
+  IEG_Debug = debug;
+}
+
+static void
+iegInit(iegrec_t *iegp)
+{
+  iegp->checked = 0;
+  iegp->byteswap = 0;
+  iegp->dprec = 0;
+  iegp->refval = 0;
+  iegp->datasize = 0;
+  iegp->buffersize = 0;
+  iegp->buffer = NULL;
+}
+
+void
+iegInitMem(void *ieg)
+{
+  iegrec_t *iegp = (iegrec_t *) ieg;
+  memset(iegp->ipdb, 0, sizeof(iegp->ipdb));
+  memset(iegp->igdb, 0, sizeof(iegp->igdb));
+  memset(iegp->vct, 0, sizeof(iegp->vct));
+}
+
+void *
+iegNew(void)
+{
+  if (!initIegLib) iegLibInit();
+
+  iegrec_t *iegp = (iegrec_t *) Malloc(sizeof(iegrec_t));
+  iegInit(iegp);
+  iegInitMem(iegp);
+
+  return (void *) iegp;
+}
+
+void
+iegDelete(void *ieg)
+{
+  iegrec_t *iegp = (iegrec_t *) ieg;
+
+  if (iegp)
+    {
+      if (iegp->buffer) Free(iegp->buffer);
+      Free(iegp);
+    }
+}
+
+int
+iegCheckFiletype(int fileID, int *swap)
+{
+  size_t data = 0;
+  size_t dimx = 0, dimy = 0;
+  size_t fact = 0;
+  unsigned char buffer[1048], *pbuf;
+
+  if (fileRead(fileID, buffer, 4) != 4) return 0;
+
+  size_t blocklen = get_uint32(buffer);
+  size_t sblocklen = get_swap_uint32(buffer);
+
+  if (IEG_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen);
+
+  // clang-format off
+  if (blocklen == 636 || blocklen == 640)
+    {
+     *swap = 0;
+      fact = 4;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+(37+4)*4;    dimx = (size_t) get_uint32(pbuf);
+      pbuf = buffer+(37+5)*4;    dimy = (size_t) get_uint32(pbuf);
+      pbuf = buffer+blocklen+4;  data = (size_t) get_uint32(pbuf);
+    }
+  else if (blocklen == 1040 || blocklen == 1036)
+    {
+     *swap = 0;
+      fact = 8;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+(37+4)*4;    dimx = (size_t) get_uint32(pbuf);
+      pbuf = buffer+(37+5)*4;    dimy = (size_t) get_uint32(pbuf);
+      pbuf = buffer+blocklen+4;  data = (size_t) get_uint32(pbuf);
+    }
+  else if (sblocklen == 636 || sblocklen == 640)
+    {
+     *swap = 1;
+      fact = 4;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+(37+4)*4;     dimx = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+(37+5)*4;     dimy = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+sblocklen+4;  data = (size_t) get_swap_uint32(pbuf);
+    }
+  else if (sblocklen == 1040 || sblocklen == 1036)
+    {
+     *swap = 1;
+      fact = 8;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+(37+4)*4;     dimx = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+(37+5)*4;     dimy = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+sblocklen+4;  data = (size_t) get_swap_uint32(pbuf);
+    }
+  // clang-format on
+
+  fileRewind(fileID);
+
+  if (IEG_Debug) Message("swap = %d fact = %d", *swap, fact);
+  if (IEG_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data);
+
+  int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data);
+  return found;
+}
+
+void
+iegCopyMeta(void *dieg, void *sieg)
+{
+  iegrec_t *diegp = (iegrec_t *) dieg;
+  iegrec_t *siegp = (iegrec_t *) sieg;
+
+  // diegp->byteswap = siegp->byteswap;
+  diegp->dprec = siegp->dprec;
+  diegp->refval = siegp->refval;
+
+  memcpy(diegp->ipdb, siegp->ipdb, sizeof(siegp->ipdb));
+  memcpy(diegp->igdb, siegp->igdb, sizeof(siegp->igdb));
+  memcpy(diegp->vct, siegp->vct, sizeof(siegp->vct));
+}
+
+static int
+iegInqData(void *ieg, int prec, void *data)
+{
+  iegrec_t *iegp = (iegrec_t *) ieg;
+  int ierr = 0;
+  int byteswap = iegp->byteswap;
+  size_t datasize = iegp->datasize;
+  void *buffer = iegp->buffer;
+  int dprec = iegp->dprec;
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (byteswap) swap4byte(buffer, datasize);
+
+        if (dprec == prec)
+          memcpy(data, buffer, datasize * sizeof(float));
+        else
+          {
+            const float *restrict p = (float *) buffer;
+            double *restrict q = (double *) data;
+            for (size_t i = 0; i < datasize; i++) q[i] = p[i];
+          }
+
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (byteswap) swap8byte(buffer, datasize);
+
+        if (dprec == prec)
+          memcpy(data, buffer, datasize * sizeof(double));
+        else
+          {
+            const double *restrict p = (double *) buffer;
+            float *restrict q = (float *) data;
+            for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i];
+          }
+
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  return ierr;
+}
+
+int
+iegInqDataFP32(void *ieg, float *data)
+{
+  return iegInqData(ieg, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+iegInqDataFP64(void *ieg, double *data)
+{
+  return iegInqData(ieg, EXSE_PREC_FP64, (void *) data);
+}
+
+static int
+iegDefData(iegrec_t *iegp, int prec, const void *data)
+{
+  int dprec = iegDefaultDprec ? iegDefaultDprec : iegp->dprec;
+  iegp->dprec = dprec ? dprec : prec;
+
+  size_t datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb);
+  size_t blocklen = datasize * (size_t) dprec;
+
+  iegp->datasize = datasize;
+
+  if (iegp->buffersize != blocklen)
+    {
+      iegp->buffersize = blocklen;
+      iegp->buffer = Realloc(iegp->buffer, iegp->buffersize);
+    }
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (dprec == prec)
+          memcpy(iegp->buffer, data, datasize * sizeof(float));
+        else
+          {
+            const double *restrict p = (const double *) data;
+            float *restrict q = (float *) iegp->buffer;
+            for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i];
+          }
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (dprec == prec)
+          memcpy(iegp->buffer, data, datasize * sizeof(double));
+        else
+          {
+            const float *restrict p = (const float *) data;
+            double *restrict q = (double *) iegp->buffer;
+            for (size_t i = 0; i < datasize; i++) q[i] = p[i];
+          }
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  return 0;
+}
+
+int
+iegDefDataFP32(void *ieg, const float *data)
+{
+  return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+iegDefDataFP64(void *ieg, const double *data)
+{
+  return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP64, (void *) data);
+}
+
+int
+iegRead(int fileID, void *ieg)
+{
+  iegrec_t *iegp = (iegrec_t *) ieg;
+  union
+  {
+    double d[200];
+    float f[200];
+    int32_t i32[200];
+  } buf;
+
+  if (!iegp->checked)
+    {
+      int status = iegCheckFiletype(fileID, &iegp->byteswap);
+      if (status == 0) Error("Not a IEG file!");
+      iegp->checked = 1;
+    }
+
+  int byteswap = iegp->byteswap;
+
+  // read header record
+  size_t blocklen = binReadF77Block(fileID, byteswap);
+
+  if (fileEOF(fileID)) return -1;
+
+  if (IEG_Debug) Message("blocklen = %lu", blocklen);
+
+  int dprec = 0;
+  if (blocklen == 636 || blocklen == 640)
+    dprec = 4;
+  else if (blocklen == 1040 || blocklen == 1036)
+    dprec = 8;
+  else
+    {
+      Warning("unexpecteted header size %d!", (int) blocklen);
+      return -1;
+    }
+
+  iegp->dprec = dprec;
+
+  binReadInt32(fileID, byteswap, 37, buf.i32);
+  for (int i = 0; i < 37; i++) iegp->ipdb[i] = (int) buf.i32[i];
+
+  binReadInt32(fileID, byteswap, 18, buf.i32);
+  for (int i = 0; i < 18; i++) iegp->igdb[i] = (int) buf.i32[i];
+
+  if (blocklen == 636 || blocklen == 1036)
+    {
+      fileRead(fileID, buf.f, 4);
+      if (byteswap) swap4byte(buf.f, 1);
+      iegp->refval = (double) buf.f[0];
+    }
+  else
+    {
+      fileRead(fileID, buf.d, 8);
+      if (byteswap) swap8byte(buf.d, 1);
+      iegp->refval = (double) buf.d[0];
+    }
+
+  binReadInt32(fileID, byteswap, 3, buf.i32);
+  for (int i = 0; i < 3; i++) iegp->igdb[18 + i] = (int) buf.i32[i];
+
+  if (dprec == EXSE_PREC_FP32)
+    {
+      fileRead(fileID, buf.f, 400);
+      if (byteswap) swap4byte(buf.f, 100);
+      for (int i = 0; i < 100; i++) iegp->vct[i] = (double) buf.f[i];
+    }
+  else
+    {
+      fileRead(fileID, buf.d, 800);
+      if (byteswap) swap8byte(buf.d, 100);
+      for (int i = 0; i < 100; i++) iegp->vct[i] = buf.d[i];
+    }
+
+  size_t blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("header blocklen differ!");
+      return -1;
+    }
+
+  iegp->datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb);
+
+  if (IEG_Debug) Message("datasize = %zu", iegp->datasize);
+
+  blocklen = binReadF77Block(fileID, byteswap);
+
+  if (iegp->buffersize < blocklen)
+    {
+      iegp->buffer = Realloc(iegp->buffer, blocklen);
+      iegp->buffersize = blocklen;
+    }
+
+  if (dprec != (int) (blocklen / iegp->datasize))
+    {
+      Warning("data precision differ! (h = %d; d = %d)", (int) dprec, (int) (blocklen / iegp->datasize));
+      return -1;
+    }
+
+  fileRead(fileID, iegp->buffer, blocklen);
+
+  blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("data blocklen differ!");
+      return -1;
+    }
+
+  return 0;
+}
+
+int
+iegWrite(int fileID, void *ieg)
+{
+  iegrec_t *iegp = (iegrec_t *) ieg;
+  union
+  {
+    int32_t i32[200];
+    float fvct[100];
+  } buf;
+  int dprec = iegp->dprec;
+  int byteswap = iegp->byteswap;
+
+  // write header record
+  size_t blocklen = (dprec == EXSE_PREC_FP32) ? 636 : 1040;
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  for (int i = 0; i < 37; i++) buf.i32[i] = (int32_t) iegp->ipdb[i];
+  binWriteInt32(fileID, byteswap, 37, buf.i32);
+
+  for (int i = 0; i < 18; i++) buf.i32[i] = (int32_t) iegp->igdb[i];
+  binWriteInt32(fileID, byteswap, 18, buf.i32);
+
+  double refval = (double) iegp->refval;
+  float refvalf = (float) iegp->refval;
+  if (dprec == EXSE_PREC_FP32)
+    binWriteFlt32(fileID, byteswap, 1, &refvalf);
+  else
+    binWriteFlt64(fileID, byteswap, 1, &refval);
+
+  for (int i = 0; i < 3; i++) buf.i32[i] = (int32_t) iegp->igdb[18 + i];
+  binWriteInt32(fileID, byteswap, 3, buf.i32);
+
+  if (dprec == EXSE_PREC_FP32)
+    {
+      for (int i = 0; i < 100; i++) buf.fvct[i] = (float) iegp->vct[i];
+      binWriteFlt32(fileID, byteswap, 100, buf.fvct);
+    }
+  else
+    {
+      binWriteFlt64(fileID, byteswap, 100, iegp->vct);
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  iegp->datasize = (size_t) iegp->igdb[4] * (size_t) iegp->igdb[5];
+  blocklen = iegp->datasize * (size_t) dprec;
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        binWriteFlt32(fileID, byteswap, iegp->datasize, (float *) iegp->buffer);
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        binWriteFlt64(fileID, byteswap, iegp->datasize, (double *) iegp->buffer);
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  return 0;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef INCLUDE_GUARD_CDI_REFERENCE_COUNTING
+#define INCLUDE_GUARD_CDI_REFERENCE_COUNTING
+
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+/*
+This is a base class for all objects that need reference counting.
+A CdiReferencedObject has a reference count of one when it is constructed, refObjectRetain() increments the reference count,
+refObject Release() decrements it. When the reference count reaches zero, the destructor function is called before the memory of the
+object is deallocated with Free().
+
+>>> Warning <<<
+This code is currently not thread-safe.
+
+We are currently using the C99 standard, which does not have atomic types.
+Also, there are still tons of systems out there that have a gcc without wrong C11 atomics support
+(__STDC_NO_ATOMICS__ not defined even though stdatomics.h is not even present).
+Consequently, it is impossible to write preprocessor code to even check for the presence of atomic types.
+So, we have two options: provide multithreading support by means of locks, or wait a year or two before doing this right.
+I, for one, prefer doing things right.
+*/
+typedef struct CdiReferencedObject CdiReferencedObject;
+struct CdiReferencedObject
+{
+  // protected:
+  void (*destructor)(CdiReferencedObject *me);  // Subclass constructors should set this to their own destructor.
+
+  // private:    //Subclasses may read it to determine whether there is only one reference, though.
+  size_t refCount;
+};
+
+void cdiRefObject_construct(CdiReferencedObject *me);
+void cdiRefObject_retain(CdiReferencedObject *me);
+void cdiRefObject_release(CdiReferencedObject *me);
+void cdiRefObject_destruct(CdiReferencedObject *me);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef INCLUDE_GUARD_CDI_GRIB_FILE_H
+#define INCLUDE_GUARD_CDI_GRIB_FILE_H
+
+
+/*
+CdiInputFile is a file abstraction that allows accessing an input file through any number of channels:
+It is reference counted, so that it is closed at the right place,
+and it is stateless, so that accesses from different callers cannot interfere with each other.
+Once the reference counting code is threadsafe, CdiInputFile will also be threadsafe.
+*/
+typedef struct CdiInputFile
+{
+  // public:
+  CdiReferencedObject super;
+
+  // private:
+  char *path;
+  int fileDescriptor;
+} CdiInputFile;
+
+// Final class, the constructor is private and not defined here.
+CdiInputFile *
+cdiInputFile_make(const char *path);  // The caller is responsible to call cdiRefObject_release() on the returned object.
+int cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize,
+                      void *buffer);  // Returns one of CDI_EINVAL, CDI_ESYSTEM, CDI_EEOF, OR CDI_NOERR.
+/* Returns path string, don't use after destruction of CdiInputFile
+ * object */
+const char *cdiInputFile_getPath(const CdiInputFile *me);
+// Destructor is private as well.
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#define _XOPEN_SOURCE 600
+
+
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <string.h>
+#include <unistd.h>
+
+static void cdiInputFile_destruct(CdiInputFile *me);
+
+// For an explanation of the condestruct() pattern, see the comment in iterator_grib.c
+// path != NULL -> construction
+// path = NULL -> destruction
+static CdiInputFile *
+cdiInputFile_condestruct(CdiInputFile *me, const char *path)
+{
+#define super() (&me->super)
+  if (!path) goto destruct;
+  cdiRefObject_construct(super());
+  me->path = strdup(path);
+  if (!me->path) goto destructSuper;
+  do
+    {
+      me->fileDescriptor = open(me->path, O_RDONLY);
+    }
+  while (me->fileDescriptor == -1 && (errno == EINTR || errno == EAGAIN));
+  if (me->fileDescriptor == -1) goto freePath;
+  // construction successfull, now we can set our own destructor
+  super()->destructor = (void (*)(CdiReferencedObject *)) cdiInputFile_destruct;
+  goto success;
+
+  // ^        constructor code       ^
+  // |                               |
+  // v destructor/error-cleanup code v
+
+destruct:
+  close(me->fileDescriptor);
+freePath:
+  Free(me->path);
+destructSuper:
+  cdiRefObject_destruct(super());
+  me = NULL;
+
+success:
+  return me;
+#undef super
+}
+
+static CdiInputFile **openFileList = NULL;
+static size_t openFileCount = 0, openFileListSize = 0;
+static pthread_mutex_t openFileListLock = PTHREAD_MUTEX_INITIALIZER;
+
+// This either returns a new object, or retains and returns a preexisting open file.
+CdiInputFile *
+cdiInputFile_make(const char *path)
+{
+  CdiInputFile *result = NULL;
+  xassert(path);
+  int error = pthread_mutex_lock(&openFileListLock);
+  xassert(!error);
+  {
+    // Check the list of open files for the given path.
+    for (size_t i = openFileCount; i-- && !result;)
+      {
+        if (!strcmp(path, openFileList[i]->path)) result = openFileList[i];
+      }
+    // If no open file was found, we open one, otherwise we just retain the existing one one more time.
+    if (result)
+      {
+        cdiRefObject_retain(&result->super);
+      }
+    else
+      {
+        result = (CdiInputFile *) Malloc(sizeof(*result));
+        if (!cdiInputFile_condestruct(result, path))
+          {
+            // An error occured during construction, avoid a memory leak.
+            Free(result);
+            result = NULL;
+          }
+        else
+          {
+            // Add the new file to the list of open files.
+            if (openFileCount == openFileListSize)
+              {
+                openFileListSize *= 2;
+                if (openFileListSize < 16) openFileListSize = 16;
+                openFileList = (CdiInputFile **) Realloc(openFileList, openFileListSize);
+              }
+            xassert(openFileCount < openFileListSize);
+            openFileList[openFileCount++] = result;
+          }
+      }
+  }
+  error = pthread_mutex_unlock(&openFileListLock);
+  xassert(!error);
+  return result;
+}
+
+int
+cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize, void *buffer)
+{
+  char *byteBuffer = (char *) buffer;
+  size_t trash;
+  if (!outActualReadSize) outActualReadSize = &trash;
+  *outActualReadSize = 0;
+  while (readSize)
+    {
+      ssize_t bytesRead = pread(me->fileDescriptor, byteBuffer, readSize, readPosition);
+      if (bytesRead == -1) return (errno == EINVAL) ? CDI_EINVAL : CDI_ESYSTEM;
+      if (bytesRead == 0) return CDI_EEOF;
+      byteBuffer += bytesRead;
+      readPosition += bytesRead;
+      readSize -= (size_t) bytesRead;
+      *outActualReadSize += (size_t) bytesRead;
+    }
+  return CDI_NOERR;
+}
+
+const char *
+cdiInputFile_getPath(const CdiInputFile *me)
+{
+  return me->path;
+}
+
+void
+cdiInputFile_destruct(CdiInputFile *me)
+{
+  int error = pthread_mutex_lock(&openFileListLock);
+  xassert(!error);
+  {
+    // Find the position of me in the list of open files.
+    ssize_t position = (ssize_t) openFileCount;
+    while (position > 0 && openFileList[--position] != me)
+      ;
+    // Remove me from the list
+    openFileList[position] = openFileList[--openFileCount];
+  }
+  error = pthread_mutex_unlock(&openFileListLock);
+  xassert(!error);
+  cdiInputFile_condestruct(me, NULL);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef INSTITUTION_H
+#define INSTITUTION_H
+
+int instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id);
+
+void instituteDefaultEntries(void);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <assert.h>
+#include <stdlib.h>
+#include <limits.h>
+
+
+typedef struct
+{
+  int self;
+  int center;
+  int subcenter;
+  char *name;
+  char *longname;
+} institute_t;
+
+static int instituteCompareKernel(institute_t *ip1, institute_t *ip2);
+static void instituteDestroyP(institute_t *instituteptr);
+static void institutePrintP(institute_t *instituteptr, FILE *fp);
+static int instituteGetPackSize(institute_t *instituteptr, void *context);
+static void institutePackP(void *instituteptr, void *buf, int size, int *position, void *context);
+static int instituteTxCode(void *instituteptr);
+
+static const resOps instituteOps = { (int (*)(void *, void *)) instituteCompareKernel,
+                                     (void (*)(void *)) instituteDestroyP,
+                                     (void (*)(void *, FILE *)) institutePrintP,
+                                     (int (*)(void *, void *)) instituteGetPackSize,
+                                     institutePackP,
+                                     instituteTxCode };
+
+static void
+instituteDefaultValue(institute_t *instituteptr)
+{
+  instituteptr->self = CDI_UNDEFID;
+  instituteptr->center = CDI_UNDEFID;
+  instituteptr->subcenter = CDI_UNDEFID;
+  instituteptr->name = NULL;
+  instituteptr->longname = NULL;
+}
+
+void
+instituteDefaultEntries(void)
+{
+  // clang-format off
+  cdiResH resH[]
+    = { institutDef( 98,   0, "ECMWF",     "European Centre for Medium-Range Weather Forecasts"),
+        institutDef(252,   1, "MPIMET",    "Max Planck Institute for Meteorology"),
+        institutDef( 98, 232, "MPIMET",    "Max Planck Institute for Meteorology"),
+        institutDef( 98, 255, "MPIMET",    "Max-Planck-Institute for Meteorology"),
+        institutDef( 78, 255, "DWD",       "Deutscher Wetterdienst"),
+        institutDef( 78,   0, "DWD",       "Deutscher Wetterdienst"),
+        institutDef(215, 255, "MCH",       "MeteoSwiss"),
+        institutDef(  7,   0, "NCEP",      "National Centers for Environmental Prediction"),
+        institutDef(  7,   1, "NCEP",      "National Centers for Environmental Prediction"),
+        institutDef( 60,   0, "NCAR",      "National Center for Atmospheric Research"),
+        institutDef( 74,   0, "METOFFICE", "U.K. Met Office"),
+        institutDef( 97,   0, "ESA",       "European Space Agency"),
+        institutDef( 99,   0, "KNMI",      "Royal Netherlands Meteorological Institute"),
+        institutDef( 80,   0, "CNMC",      "Reparto per la Meteorologia, Rome (REMET)"),
+        // institutDef(  0,   0, "IPSL", "IPSL (Institut Pierre Simon Laplace, Paris, France)");
+  };
+  // clang-format on
+
+  const size_t n = sizeof(resH) / sizeof(*resH);
+  for (size_t i = 0; i < n; i++) reshSetStatus(resH[i], &instituteOps, RESH_IN_USE);
+}
+
+static int
+instituteCompareKernel(institute_t *ip1, institute_t *ip2)
+{
+  int differ = 0;
+
+  if (ip1->name)
+    {
+      if (ip1->center > 0 && ip2->center != ip1->center) differ = 1;
+      if (ip1->subcenter > 0 && ip2->subcenter != ip1->subcenter) differ = 1;
+
+      if (!differ)
+        {
+          if (ip2->name)
+            {
+              const size_t len1 = strlen(ip1->name);
+              const size_t len2 = strlen(ip2->name);
+              if ((len1 != len2) || memcmp(ip2->name, ip1->name, len2)) differ = 1;
+            }
+        }
+    }
+  else if (ip1->longname)
+    {
+      if (ip2->longname)
+        {
+          const size_t len1 = strlen(ip1->longname);
+          const size_t len2 = strlen(ip2->longname);
+          if ((len1 != len2) || memcmp(ip2->longname, ip1->longname, len2)) differ = 1;
+        }
+    }
+  else
+    {
+      if (!(ip2->center == ip1->center && ip2->subcenter == ip1->subcenter)) differ = 1;
+      if (ip1->subcenter > 0 && ip1->subcenter != 255 && ip2->subcenter != ip1->subcenter) differ = 1;
+    }
+
+  return differ;
+}
+
+struct instLoc
+{
+  institute_t *ip;
+  int id;
+};
+
+static enum cdiApplyRet
+findInstitute(int id, void *res, void *data)
+{
+  institute_t *ip1 = ((struct instLoc *) data)->ip;
+  institute_t *ip2 = (institute_t *) res;
+  if (!instituteCompareKernel(ip1, ip2))
+    {
+      ((struct instLoc *) data)->id = id;
+      return CDI_APPLY_STOP;
+    }
+  else
+    return CDI_APPLY_GO_ON;
+}
+
+int
+institutInq(int center, int subcenter, const char *name, const char *longname)
+{
+  institute_t ip_ref;
+  ip_ref.self = CDI_UNDEFID;
+  ip_ref.center = center;
+  ip_ref.subcenter = subcenter;
+  ip_ref.name = (name && name[0]) ? (char *) name : NULL;
+  ip_ref.longname = (longname && longname[0]) ? (char *) longname : NULL;
+
+  struct instLoc state = { .ip = &ip_ref, .id = CDI_UNDEFID };
+  cdiResHFilterApply(&instituteOps, findInstitute, &state);
+
+  return state.id;
+}
+
+static institute_t *
+instituteNewEntry(cdiResH resH, int center, int subcenter, const char *name, const char *longname)
+{
+  institute_t *instituteptr = (institute_t *) malloc(sizeof(institute_t));
+  instituteDefaultValue(instituteptr);
+  if (resH == CDI_UNDEFID)
+    instituteptr->self = reshPut(instituteptr, &instituteOps);
+  else
+    {
+      instituteptr->self = resH;
+      reshReplace(resH, instituteptr, &instituteOps);
+    }
+  instituteptr->center = center;
+  instituteptr->subcenter = subcenter;
+  if (name && *name) instituteptr->name = strdup(name);
+  if (longname && *longname) instituteptr->longname = strdup(longname);
+  return instituteptr;
+}
+
+int
+institutDef(int center, int subcenter, const char *name, const char *longname)
+{
+  institute_t *instituteptr = instituteNewEntry(CDI_UNDEFID, center, subcenter, name, longname);
+  return instituteptr->self;
+}
+
+int
+institutInqCenter(int instID)
+{
+  return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->center : CDI_UNDEFID;
+}
+
+int
+institutInqSubcenter(int instID)
+{
+  return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->subcenter : CDI_UNDEFID;
+}
+
+const char *
+institutInqNamePtr(int instID)
+{
+  return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->name : NULL;
+}
+
+const char *
+institutInqLongnamePtr(int instID)
+{
+  return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->longname : NULL;
+}
+
+int
+institutInqNumber(void)
+{
+  int instNum = (int) (reshCountType(&instituteOps));
+  return instNum;
+}
+
+static void
+instituteDestroyP(institute_t *instituteptr)
+{
+  xassert(instituteptr);
+  free(instituteptr->name);
+  free(instituteptr->longname);
+  free(instituteptr);
+}
+
+static void
+institutePrintP(institute_t *ip, FILE *fp)
+{
+  if (ip)
+    fprintf(fp,
+            "#\n"
+            "# instituteID %d\n"
+            "#\n"
+            "self          = %d\n"
+            "center        = %d\n"
+            "subcenter     = %d\n"
+            "name          = %s\n"
+            "longname      = %s\n",
+            ip->self, ip->self, ip->center, ip->subcenter, ip->name ? ip->name : "NN", ip->longname ? ip->longname : "NN");
+}
+
+static int
+instituteTxCode(void *instituteptr)
+{
+  (void) instituteptr;
+  return INSTITUTE;
+}
+
+enum
+{
+  INSTITUTE_PACK_INT_SELF,
+  INSTITUTE_PACK_INT_CENTER,
+  INSTITUTE_PACK_INT_SUBCENTER,
+  INSTITUTE_PACK_INT_NAMELEN,
+  INSTITUTE_PACK_INT_LNAMELEN,
+  institute_nints,
+};
+
+static int
+instituteGetPackSize(institute_t *ip, void *context)
+{
+  size_t namelen = strlen(ip->name), longnamelen = strlen(ip->longname);
+  xassert(namelen < INT_MAX && longnamelen < INT_MAX);
+  size_t txsize = (size_t) serializeGetSize(institute_nints, CDI_DATATYPE_INT, context)
+                  + (size_t) serializeGetSize((int) namelen + 1, CDI_DATATYPE_TXT, context)
+                  + (size_t) serializeGetSize((int) longnamelen + 1, CDI_DATATYPE_TXT, context);
+  xassert(txsize <= INT_MAX);
+  return (int) txsize;
+}
+
+static void
+institutePackP(void *instituteptr, void *buf, int size, int *position, void *context)
+{
+  institute_t *p = (institute_t *) instituteptr;
+  int tempbuf[institute_nints];
+  tempbuf[INSTITUTE_PACK_INT_SELF] = p->self;
+  tempbuf[INSTITUTE_PACK_INT_CENTER] = p->center;
+  tempbuf[INSTITUTE_PACK_INT_SUBCENTER] = p->subcenter;
+  tempbuf[INSTITUTE_PACK_INT_NAMELEN] = (int) strlen(p->name) + 1;
+  tempbuf[INSTITUTE_PACK_INT_LNAMELEN] = (int) strlen(p->longname) + 1;
+  serializePack(tempbuf, institute_nints, CDI_DATATYPE_INT, buf, size, position, context);
+  serializePack(p->name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context);
+  serializePack(p->longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, buf, size, position, context);
+}
+
+int
+instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id)
+{
+#define adaptKey(key) (namespaceAdaptKey((key), originNamespace))
+  int tempbuf[institute_nints];
+  int instituteID;
+  serializeUnpack(buf, size, position, tempbuf, institute_nints, CDI_DATATYPE_INT, context);
+  char *name = (char *) malloc((size_t) tempbuf[INSTITUTE_PACK_INT_NAMELEN] + (size_t) tempbuf[INSTITUTE_PACK_INT_LNAMELEN]),
+       *longname = name + tempbuf[INSTITUTE_PACK_INT_NAMELEN];
+  serializeUnpack(buf, size, position, name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context);
+  serializeUnpack(buf, size, position, longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, context);
+  int targetID = force_id ? adaptKey(tempbuf[INSTITUTE_PACK_INT_SELF]) : CDI_UNDEFID;
+  institute_t *ip
+      = instituteNewEntry(targetID, tempbuf[INSTITUTE_PACK_INT_CENTER], tempbuf[INSTITUTE_PACK_INT_SUBCENTER], name, longname);
+  instituteID = ip->self;
+  xassert(!force_id || instituteID == targetID);
+  free(name);
+  reshSetStatus(instituteID, &instituteOps, reshGetStatus(instituteID, &instituteOps) & ~RESH_SYNC_BIT);
+#undef adaptKey
+  return instituteID;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/*
+ * This file is for the use of iterator.c and the CdiIterator subclasses only.
+ */
+
+#ifndef INCLUDE_GUARD_CDI_ITERATOR_INT_H
+#define INCLUDE_GUARD_CDI_ITERATOR_INT_H
+
+
+#include <stdbool.h>
+
+/*
+class CdiIterator
+
+An iterator is an object that identifies the position of one record in a file, where a record is defined as the data belonging to
+one level, timestep, and variable. Using iterators to read a file can be significantly faster than using streams, because they can
+avoid building an index of the file. For file formats like grib that do not provide an index within the file, this makes the
+difference between reading the file once or reading the file twice.
+
+CdiIterator is an abstract base class. Which derived class is used depends on the type of the file. The class hierarchy currently
+looks like this:
+
+    CdiIterator <|--+-- CdiFallbackIterator
+                    |
+                    +-- CdiGribIterator
+
+The fallback implementation currently uses the stream interface of CDI under the hood to provide full functionality for all
+filetypes for which no iterator implementation exists yet.
+*/
+// TODO[NH]: Debug messages, print function.
+
+struct CdiIterator
+{
+  int filetype;     // This is used to dispatch calls to the correct subclass.
+  bool isAdvanced;  // Used to catch inquiries before the first call to CdiIteratorNextField(). //XXX: Advanced is probably not a
+                    // good word (initialized?)
+
+  // The metadata that can be accessed by the inquiry calls.
+  // While theoretically redundant, these fields allow the handling of most inquiry calls within the base class.
+  // Only the name is excempted because it needs an allocation.
+  // These fields are set by the subclasses in the xxxIterNextField() method.
+  int datatype, timesteptype;
+  int gridId;
+  CdiParam param;
+
+  // The status information for reading/advancing is added in the subclasses.
+};
+
+void baseIterConstruct(CdiIterator *me, int filetype);
+const char *baseIter_constructFromString(
+    CdiIterator *me, const char *description);  // Returns a pointer past the end of the parsed portion of the description string.
+void baseIterDestruct(CdiIterator *me);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/*
+ * A fallback implementation of the iterator interface that opens a stream under the hood.
+ *
+ * This implementation is mainly available to provide iterator access to file formats that don't support iterator access natively,
+ * nevertheless, it allows the file to dictate the order in which data is read, possibly providing performance benefits.
+ */
+
+#ifndef INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H
+#define INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdlib.h>
+
+
+typedef struct CdiFallbackIterator CdiFallbackIterator;
+
+CdiIterator *cdiFallbackIterator_new(const char *path, int filetype);
+CdiFallbackIterator *cdiFallbackIterator_clone(CdiIterator *me);
+CdiIterator *cdiFallbackIterator_getSuper(CdiFallbackIterator *me);
+char *cdiFallbackIterator_serialize(CdiIterator *me);
+CdiFallbackIterator *cdiFallbackIterator_deserialize(const char *me);
+
+int cdiFallbackIterator_nextField(CdiIterator *me);
+
+char *cdiFallbackIterator_inqTime(CdiIterator *me, CdiTimeType timeType);
+int cdiFallbackIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName,
+                                  char **outUnit);
+int cdiFallbackIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2);
+int cdiFallbackIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]);
+char *cdiFallbackIterator_copyVariableName(CdiIterator *me);
+int cdiFallbackIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute);
+int cdiFallbackIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount);
+
+void cdiFallbackIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals);
+void cdiFallbackIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals);
+
+void cdiFallbackIterator_delete(CdiIterator *super);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/*
+ * An implementation of the iterator interface for GRIB files.
+ * Since GRIB files do not contain an index, this avoids scanning the entire file to generate an in-memory index as streamOpenRead()
+ * does. Consequently, using this interface is much more efficient for GRIB files.
+ */
+
+#ifndef INCLUDE_GUARD_CDI_ITERATOR_GRIB_H
+#define INCLUDE_GUARD_CDI_ITERATOR_GRIB_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+#ifdef HAVE_LIBGRIB_API
+#include <grib_api.h>
+#endif
+
+typedef struct recordList recordList;
+
+CdiIterator *cdiGribIterator_new(const char *path, int filetype);
+CdiGribIterator *cdiGribIterator_makeClone(CdiIterator *me);
+CdiIterator *cdiGribIterator_getSuper(CdiGribIterator *me);
+char *cdiGribIterator_serialize(CdiIterator *me);
+CdiGribIterator *cdiGribIterator_deserialize(const char *me);
+
+int cdiGribIterator_nextField(CdiIterator *me);
+
+char *cdiGribIterator_inqTime(CdiIterator *me, CdiTimeType timeType);
+int cdiGribIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName,
+                              char **outUnit);
+int cdiGribIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2);
+int cdiGribIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]);
+int cdiGribIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute);
+int cdiGribIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount);
+char *cdiGribIterator_copyVariableName(CdiIterator *me);
+
+void cdiGribIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals);
+void cdiGribIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+#include <assert.h>
+#include <ctype.h>
+
+static const char kUnexpectedFileTypeMessage[] = "Internal error: Unexpected file type encountered in iterator.\n"
+                                                 "This is either due to an illegal memory access by the application\n"
+                                                 " or an internal logical error in CDI (unlikely, but possible).";
+static const char kAdvancedString[] = "advanced";
+static const char kUnadvancedString[] = "unadvanced";
+
+// Returns a static string.
+static const char *
+fileType2String(int fileType)
+{
+  switch (fileType)
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRB: return "CDI::Iterator::GRIB1";
+    case CDI_FILETYPE_GRB2: return "CDI::Iterator::GRIB2";
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NC: return "CDI::Iterator::NetCDF";
+    case CDI_FILETYPE_NC2: return "CDI::Iterator::NetCDF2";
+    case CDI_FILETYPE_NC4: return "CDI::Iterator::NetCDF4";
+    case CDI_FILETYPE_NC4C: return "CDI::Iterator::NetCDF4C";
+    case CDI_FILETYPE_NC5: return "CDI::Iterator::NetCDF5";
+    case CDI_FILETYPE_NCZARR: return "CDI::Iterator::NCZarr";
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: return "CDI::Iterator::SRV";
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: return "CDI::Iterator::EXT";
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: return "CDI::Iterator::IEG";
+#endif
+
+    default: return NULL;
+    }
+}
+
+static int
+string2FileType(const char *fileType, const char **outRestString)
+{
+  // This first part unconditionally checks all known type strings, and only if the given string matches one of these strings, we
+  // use fileType2string() to check whether support for this type has been compiled in. This is to avoid throwing "invalid type
+  // string" errors when we just have a library version mismatch.
+#define check(givenString, typeString, typeConstant)                                                               \
+  do                                                                                                               \
+    {                                                                                                              \
+      if (givenString == strstr(givenString, typeString))                                                          \
+        {                                                                                                          \
+          if (outRestString) *outRestString = givenString + strlen(typeString);                                    \
+          if (fileType2String(typeConstant)) return typeConstant;                                                  \
+          Error("Support for " typeString                                                                          \
+                " not compiled in. Please check that the result of `cdiIterator_serialize()` is only passed to a " \
+                "`cdiIterator_deserialize()` implementation of the same CDI library version.");                    \
+          return CDI_FILETYPE_UNDEF;                                                                               \
+        }                                                                                                          \
+    }                                                                                                              \
+  while (0)
+  check(fileType, "CDI::Iterator::GRIB1", CDI_FILETYPE_GRB);
+  check(fileType, "CDI::Iterator::GRIB2", CDI_FILETYPE_GRB2);
+  check(fileType, "CDI::Iterator::NetCDF", CDI_FILETYPE_NC);
+  check(fileType, "CDI::Iterator::NetCDF2", CDI_FILETYPE_NC2);
+  check(fileType, "CDI::Iterator::NetCDF4", CDI_FILETYPE_NC4);
+  check(fileType, "CDI::Iterator::NetCDF4C", CDI_FILETYPE_NC4C);
+  check(fileType, "CDI::Iterator::NetCDF5", CDI_FILETYPE_NC5);
+  check(fileType, "CDI::Iterator::NCZarr", CDI_FILETYPE_NCZARR);
+  check(fileType, "CDI::Iterator::SRV", CDI_FILETYPE_SRV);
+  check(fileType, "CDI::Iterator::EXT", CDI_FILETYPE_EXT);
+  check(fileType, "CDI::Iterator::IEG", CDI_FILETYPE_IEG);
+#undef check
+
+  // If this point is reached, the given string does not seem to be produced by a cdiIterator_serialize() call.
+  Error("The string \"%s\" does not start with a valid iterator type. Please check the source of this string.", fileType);
+  *outRestString = fileType;
+  return CDI_FILETYPE_UNDEF;
+}
+
+/*
+@Function cdiIterator_new
+@Title Create an iterator for an input file
+
+@Prototype CdiIterator* cdiIterator_new(const char* path)
+@Parameter
+    @item path Path to the file that is to be read.
+
+@Result An iterator for the given file.
+
+@Description
+    Combined allocator and constructor for CdiIterator.
+
+    The returned iterator does not point to the first field yet,
+    it must first be advanced once before the first field can be introspected.
+    This design decision has two benefits: 1. Empty files require no special
+    cases, 2. Users can start a while(!cdiIterator_nextField(iterator)) loop
+    right after the call to cdiIterator_new().
+*/
+CdiIterator *
+cdiIterator_new(const char *path)
+{
+  int trash;
+  const int filetype = cdiGetFiletype(path, &trash);
+  switch (cdiBaseFiletype(filetype))
+    {
+    case CDI_FILETYPE_UNDEF: Warning("Can't open file \"%s\": unknown format\n", path); return NULL;
+
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_new(path, filetype);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_new(path, filetype);
+
+    default:
+      Warning("the file \"%s\" is of type %s, but support for this format is not compiled in!", path, strfiletype(filetype));
+      return NULL;
+    }
+}
+
+void
+baseIterConstruct(CdiIterator *me, int filetype)
+{
+  me->filetype = filetype;
+  me->isAdvanced = false;
+}
+
+const char *
+baseIter_constructFromString(CdiIterator *me, const char *description)
+{
+  const char *result = description;
+  me->filetype = string2FileType(result, &result);
+  assert(me->filetype != CDI_FILETYPE_UNDEF
+         && "Please report this error.");  // This condition should have been checked for in a calling function.
+  for (; *result && isspace(*result); result++)
+    ;
+  if (result == strstr(result, kAdvancedString))
+    {
+      me->isAdvanced = true;
+      result += sizeof(kAdvancedString) - 1;
+    }
+  else if (result == strstr(result, kUnadvancedString))
+    {
+      me->isAdvanced = false;
+      result += sizeof(kUnadvancedString) - 1;
+    }
+  else
+    {
+      Error("Invalid iterator description string \"%s\". Please check the origin of this string.", description);
+      return NULL;
+    }
+  return result;
+}
+
+#define sanityCheck(me)                                                                                                       \
+  do                                                                                                                          \
+    {                                                                                                                         \
+      if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__); \
+      if (!me->isAdvanced) xabort("Calling %s is not allowed without calling cdiIterator_nextField() first.", __func__);      \
+    }                                                                                                                         \
+  while (0)
+
+/*
+@Function cdiIterator_clone
+@Title Make a copy of an iterator
+
+@Prototype CdiIterator* cdiIterator_clone(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to copy.
+
+@Result The clone.
+
+@Description
+    Clones the given iterator. Make sure to call cdiIterator_delete() on both
+    the copy and the original.
+
+    This is not a cheap operation: Depending on the type of the file, it will
+    either make a copy of the current field in memory (GRIB files), or reopen
+    the file (all other file types). Use it sparingly. And if you do, try to
+    avoid keeping too many clones around: their memory footprint is
+    significant.
+*/
+CdiIterator *
+cdiIterator_clone(CdiIterator *me)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_clone(me));
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_getSuper(cdiFallbackIterator_clone(me));
+
+    default: Error(kUnexpectedFileTypeMessage); return NULL;
+    }
+}
+
+/*
+@Function cdiGribIterator_clone
+@Title Gain access to GRIB specific functionality
+
+@Prototype CdiGribIterator* cdiGribIterator_clone(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A clone that allows access to GRIB specific functionality, or NULL if the underlying file is not a GRIB file.
+
+@Description
+    Clones the given iterator iff the underlying file is a GRIB file, the returned iterator allows access to GRIB specific
+functionality. Make sure to check that the return value is not NULL, and to call cdiGribIterator_delete() on the copy.
+
+    This is not a cheap operation: It will make a copy of the current field in memory. Use it sparingly. And if you do, try to avoid
+keeping too many clones around, their memory footprint is significant.
+*/
+CdiGribIterator *
+cdiGribIterator_clone(CdiIterator *me)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_makeClone(me);
+#endif
+
+    default: return NULL;
+    }
+}
+
+/*
+@Function cdiIterator_serialize
+@Title Serialize an iterator for sending it to another process
+
+@Prototype char* cdiIterator_serialize(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A malloc'ed string that contains the full description of the iterator.
+
+@Description
+    Make sure to call Free() on the resulting string.
+*/
+char *
+cdiIterator_serialize(CdiIterator *me)
+{
+  if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__);
+  char *subclassDescription = NULL;
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: subclassDescription = cdiGribIterator_serialize(me); break;
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      subclassDescription = cdiFallbackIterator_serialize(me);
+      break;
+
+    default: Error(kUnexpectedFileTypeMessage); return NULL;
+    }
+
+  const char *ftypeStr = fileType2String(me->filetype), *advStr = me->isAdvanced ? kAdvancedString : kUnadvancedString;
+  size_t len = strlen(ftypeStr) + 1 + strlen(advStr) + 1 + strlen(subclassDescription) + 1;
+  char *result = (char *) Malloc(len);
+  snprintf(result, len, "%s %s %s", ftypeStr, advStr, subclassDescription);
+  Free(subclassDescription);
+  return result;
+}
+
+/*
+@Function cdiIterator_deserialize
+@Title Recreate an iterator from its textual description
+
+@Prototype CdiIterator* cdiIterator_deserialize(const char* description)
+@Parameter
+    @item description The result of a call to cdiIterator_serialize().
+
+@Result A clone of the original iterator.
+
+@Description
+    A pair of cdiIterator_serialize() and cdiIterator_deserialize() is functionally equivalent to a call to cdiIterator_clone()
+
+    This function will reread the current field from disk, so don't expect immediate return.
+*/
+// This only checks the type of the iterator and calls the corresponding subclass function,
+// the real deserialization is done in baseIter_constructFromString().
+CdiIterator *
+cdiIterator_deserialize(const char *description)
+{
+  switch (cdiBaseFiletype(string2FileType(description, NULL)))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_deserialize(description));
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_getSuper(cdiFallbackIterator_deserialize(description));
+
+    default: Error(kUnexpectedFileTypeMessage); return NULL;
+    }
+}
+
+/*
+@Function cdiIterator_print
+@Title Print a textual description of the iterator to a stream
+
+@Prototype void cdiIterator_print(CdiIterator* iterator, FILE* stream);
+@Parameter
+    @item iterator The iterator to print.
+    @item stream The stream to print to.
+
+@Description
+    Use for debugging output.
+*/
+void
+cdiIterator_print(CdiIterator *me, FILE *stream)
+{
+  char *description = cdiIterator_serialize(me);
+  fprintf(stream, "%s\n", description);
+  Free(description);
+}
+
+/*
+@Function cdiIterator_nextField
+@Title Advance an iterator to the next field in the file
+
+@Prototype int cdiIterator_nextField(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result An error code. May be one of:
+  * CDI_NOERR: The iterator has successfully been advanced to the next field.
+  * CDI_EEOF: No more fields to read in this file.
+
+@Description
+    One call to cdiIterator_nextField() is required before the metadata of the first field can be examined.
+    Usually, it will be used directly as the condition for a while() loop.
+*/
+int
+cdiIterator_nextField(CdiIterator *me)
+{
+  if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new().");
+  me->isAdvanced = true;
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_nextField(me);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_nextField(me);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL;
+    }
+}
+
+static char *
+cdiIterator_inqTime(CdiIterator *me, CdiTimeType timeType)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTime(me, timeType);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_inqTime(me, timeType);
+
+    default: Error(kUnexpectedFileTypeMessage); return NULL;
+    }
+}
+
+/*
+@Function cdiIterator_inqStartTime
+@Title Get the start time of a measurement
+
+@Prototype char* cdiIterator_inqStartTime(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A malloc'ed string containing the (start) time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm".
+
+@Description
+The returned time is either the time of the data (fields defined at a time point),
+or the start time of an integration time range (statistical fields).
+
+Converts the time to the ISO-8601 format and returns it in a newly allocated buffer.
+The caller is responsible to Free() the resulting string.
+
+If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar
+as it is implemented by the standard C mktime() function.
+This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields.
+*/
+char *
+cdiIterator_inqStartTime(CdiIterator *me)
+{
+  return cdiIterator_inqTime(me, kCdiTimeType_startTime);
+}
+
+/*
+@Function cdiIterator_inqEndTime
+@Title Get the end time of a measurement
+
+@Prototype char* cdiIterator_inqEndTime(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A malloc'ed string containing the end time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm", or NULL if no such
+time is defined.
+
+@Description
+The returned time is the end time of an integration period if such a time exists (statistical fields).
+Otherwise, NULL is returned.
+
+Converts the time to the ISO-8601 format and returns it in a newly allocated buffer.
+The caller is responsible to Free() the resulting string.
+
+If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar
+as it is implemented by the standard C mktime() function.
+This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields.
+*/
+char *
+cdiIterator_inqEndTime(CdiIterator *me)
+{
+  return cdiIterator_inqTime(me, kCdiTimeType_endTime);
+}
+
+/*
+@Function cdiIterator_inqRTime
+@Title Get the validity time of the current field
+
+@Prototype char* cdiIterator_inqRTime(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm".
+
+@Description
+The returned time is the validity time as it is returned by taxisInqVtime(), only more precise.
+That is, if the field is a time point, its time is returned,
+if it is a statistical field with an integration period, the end time of the integration period is returned.
+
+Converts the time to the ISO-8601 format and returns it in a newly allocated buffer.
+The caller is responsible to Free() the resulting string.
+
+If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar
+as it is implemented by the standard C mktime() function.
+This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields.
+*/
+char *
+cdiIterator_inqRTime(CdiIterator *me)
+{
+  return cdiIterator_inqTime(me, kCdiTimeType_referenceTime);
+}
+
+/*
+@Function cdiIterator_inqVTime
+@Title Get the validity time of the current field
+
+@Prototype char* cdiIterator_inqVTime(CdiIterator* me)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm".
+
+@Description
+The returned time is the validity time as it is returned by taxisInqVtime(), only more precise.
+That is, if the field is a time point, its time is returned,
+if it is a statistical field with an integration period, the end time of the integration period is returned.
+
+Converts the time to the ISO-8601 format and returns it in a newly allocated buffer.
+The caller is responsible to Free() the resulting string.
+
+If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar
+as it is implemented by the standard C mktime() function.
+This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields.
+*/
+char *
+cdiIterator_inqVTime(CdiIterator *me)
+{
+  char *result = cdiIterator_inqEndTime(me);
+  return (result) ? result : cdiIterator_inqStartTime(me);
+}
+
+/*
+@Function cdiIterator_inqLevelType
+@Title Get the type of a level
+
+@Prototype int cdiIterator_inqLevelType(CdiIterator* me, int levelSelector, char **outName = NULL, char **outLongName = NULL, char
+**outStdName = NULL, char **outUnit = NULL)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item levelSelector Zero for the top level, one for the bottom level
+    @item outName Will be set to a Malloc()'ed string with the name of the level if not NULL.
+    @item outLongName Will be set to a Malloc()'ed string with the long name of the level if not NULL.
+    @item outStdName Will be set to a Malloc()'ed string with the standard name of the level if not NULL.
+    @item outUnit Will be set to a Malloc()'ed string with the unit of the level if not NULL.
+
+@Result An integer indicating the type of the level.
+
+@Description
+Find out some basic information about the given level, the levelSelector selects the function of the requested level.
+If the requested level does not exist, this returns CDI_UNDEFID.
+*/
+int
+cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_UNDEFID;
+    }
+}
+
+/*
+@Function cdiIterator_inqLevel
+@Title Get the value of the z-coordinate
+
+@Prototype void cdiIterator_inqLevel(CdiIterator* me, int levelSelector, double* outValue1, double* outValue2 = NULL)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item levelSelector Zero for the top level, one for the bottom level
+    @item outValue1 For "normal" levels this returns the value, for hybrid levels the first coordinate, for generalized levels the
+level number.
+    @item outValue2 Zero for "normal" levels, for hybrid levels, this returns the second coordinate, for generalized levels the
+level count.
+
+@Result An error code.
+
+@Description
+Returns the value of the z-coordinate, whatever that may be.
+*/
+int
+cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_level(me, levelSelector, outValue1, outValue2);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_level(me, levelSelector, outValue1, outValue2);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL;
+    }
+}
+
+/*
+@Function cdiIterator_inqLevelUuid
+@Title Get the UUID of the z-axis used by this field
+
+@Prototype int cdiIterator_inqLevelUuid(CdiIterator* me, int levelSelector, unsigned char (*outUuid)[16])
+@Parameter
+    @item iterator The iterator to operate on.
+    @item outVgridNumber The number of the associated vertical grid description.
+    @item outLevelCount The number of levels in the associated vertical grid description.
+    @item outUuid A pointer to a user supplied buffer of 16 bytes to store the UUID in.
+
+@Result An error code.
+
+@Description
+Returns identifying information for the external z-axis description. May only be called for generalized levels.
+*/
+int
+cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE])
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL;
+    }
+}
+
+/*
+@Function cdiIterator_inqTile
+@Title Inquire the tile information for the current field
+
+@Prototype int cdiIterator_inqTile(CdiIterator* me, int* outTileIndex, int* outTileAttribute)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item outTileIndex The index of the current tile, -1 if no tile information is available.
+    @item outTileAttribute The attribute of the current tile, -1 if no tile information is available.
+
+@Result An error code. CDI_EINVAL if there is no tile information associated with the current field.
+
+@Description
+Inquire the tile index and attribute for the current field.
+*/
+int
+cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTile(me, outTileIndex, outTileAttribute);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_inqTile(me, outTileIndex, outTileAttribute);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL;
+    }
+}
+
+/**
+@Function cdiIterator_inqTileCount
+@Title Inquire the tile count and tile attribute counts for the current field
+
+@Prototype int cdiIterator_inqTileCount(CdiIterator* me, int* outTileCount, int* outTileAttributeCount)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item outTileCount The number of tiles used for this variable, zero if no tile information is available.
+    @item outTileAttributeCount The number of attributes available for the tile of this field, zero if no tile information is
+available. Note: This is not the global attribute count, which would be impossible to infer without reading the entire file if it's
+a GRIB file.
+
+@Result An error code. CDI_EINVAL if there is no tile information associated with the current field.
+
+@Description
+Inquire the tile count and tile attribute counts for the current field.
+*/
+int
+cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTileCount(me, outTileCount, outTileAttributeCount);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_inqTileCount(me, outTileCount, outTileAttributeCount);
+
+    default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL;
+    }
+}
+
+/*
+@Function cdiIterator_inqParam
+@Title Get discipline, category, and number
+
+@Prototype CdiParam cdiIterator_inqParam(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A struct containing the requested information.
+
+@Description
+    Simple metadata inspection function.
+*/
+CdiParam
+cdiIterator_inqParam(CdiIterator *me)
+{
+  sanityCheck(me);
+  return me->param;
+}
+
+/*
+@Function cdiIterator_inqParamParts
+@Title Get discipline, category, and number
+
+@Prototype void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item outDiscipline This is used to return the discipline.
+    @item outCategory This is used to return the category.
+    @item outNumber This is used to return the number.
+
+@Description
+    Simple metadata inspection function.
+
+    Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper,
+    rendering it unusable from FORTRAN. This function is the workaround.
+*/
+void
+cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber)
+{
+  CdiParam result = cdiIterator_inqParam(me);
+  if (outDiscipline) *outDiscipline = result.discipline;
+  if (outCategory) *outCategory = result.category;
+  if (outNumber) *outNumber = result.number;
+}
+
+/*
+@Function cdiIterator_inqDatatype
+@Title Get the datatype of the current field
+
+@Prototype int cdiIterator_inqDatatype(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result The datatype that is used to store this field on disk.
+
+@Description
+    Simple metadata inspection function.
+*/
+int
+cdiIterator_inqDatatype(CdiIterator *me)
+{
+  sanityCheck(me);
+  return me->datatype;
+}
+
+/*
+@Function cdiIterator_inqFiletype
+@Title Get the filetype of the current field
+
+@Prototype int cdiIterator_inqFiletype(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result The filetype that is used to store this field on disk.
+
+@Description
+    Simple metadata inspection function.
+*/
+int
+cdiIterator_inqFiletype(CdiIterator *me)
+{
+  return me->filetype;
+}
+
+/*
+@Function cdiIterator_inqTsteptype
+@Title Get the timestep type
+
+@Prototype int cdiIterator_inqTsteptype(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result The timestep type.
+
+@Description
+    Simple metadata inspection function.
+*/
+int
+cdiIterator_inqTsteptype(CdiIterator *me)
+{
+  sanityCheck(me);
+  return me->timesteptype;
+}
+
+/*
+@Function cdiIterator_inqVariableName
+@Title Get the variable name of the current field
+
+@Prototype char* cdiIterator_inqVariableName(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A pointer to a C-string containing the name. The storage for this string is allocated with Malloc(), and it is the
+responsibility of the caller to Free() it.
+
+@Description
+    Allocates a buffer to hold the string, copies the current variable name into this buffer, and returns the buffer.
+    The caller is responsible to make the corresponding Free() call.
+*/
+char *
+cdiIterator_inqVariableName(CdiIterator *me)
+{
+  sanityCheck(me);
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: return cdiGribIterator_copyVariableName(me);
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      return cdiFallbackIterator_copyVariableName(me);
+
+    default: Error(kUnexpectedFileTypeMessage); return NULL;
+    }
+}
+
+/*
+@Function cdiIterator_inqGridId
+@Title Get the ID of the current grid
+
+@Prototype int cdiIterator_inqGridId(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Result A gridId that can be used for further introspection.
+
+@Description
+    This provides access to the grid related metadata.
+    The resulting ID is only valid until the next time cdiIterator_nextField() is called.
+*/
+int
+cdiIterator_inqGridId(CdiIterator *me)
+{
+  sanityCheck(me);
+  return me->gridId;
+}
+
+/*
+@Function cdiIterator_readField
+@Title Read the whole field into a double buffer
+
+@Prototype void cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item buffer A pointer to the double array that the data should be written to.
+    @item numMissVals A pointer to a variable where the count of missing values will be stored. May be NULL.
+
+@Description
+    It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the
+buffer. Failing to do so results in undefined behavior. You have been warned.
+*/
+void
+cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  sanityCheck(me);
+  if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer.");
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: cdiGribIterator_readField(me, buffer, &numMiss); return;
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      cdiFallbackIterator_readField(me, buffer, &numMiss);
+      return;
+    default: Error(kUnexpectedFileTypeMessage);
+    }
+
+  *numMissVals = (SizeType) numMiss;
+}
+
+/*
+@Function cdiIterator_readFieldF
+@Title Read the whole field into a double buffer
+
+@Prototype void cdiIterator_readFieldF(CdiIterator  me, float *buffer, SizeType *numMissVals)
+@Parameter
+    @item iterator The iterator to operate on.
+    @item buffer   A pointer to the double array that the data should be written to.
+    @item numMissVals    A pointer to a variable where the count of missing values will be stored. May be NULL.
+
+@Description
+    It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the
+buffer. Failing to do so results in undefined behavior. You have been warned.
+*/
+void
+cdiIterator_readFieldF(CdiIterator *me, float *buffer, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  sanityCheck(me);
+  if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer.");
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: cdiGribIterator_readFieldF(me, buffer, &numMiss); return;
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      cdiFallbackIterator_readFieldF(me, buffer, &numMiss);
+      return;
+    default: Error(kUnexpectedFileTypeMessage);
+    }
+
+  *numMissVals = (SizeType) numMiss;
+}
+
+/*
+@Function cdiIterator_delete
+@Title Destroy an iterator
+
+@Prototype void cdiIterator_delete(CdiIterator* iterator)
+@Parameter
+    @item iterator The iterator to operate on.
+
+@Description
+    Combined destructor & deallocator.
+*/
+void
+cdiIterator_delete(CdiIterator *me)
+{
+  if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new().");
+  switch (cdiBaseFiletype(me->filetype))
+    {
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRIB: cdiGribIterator_delete((CdiGribIterator *) me); break;
+#endif
+
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+#endif
+      cdiFallbackIterator_delete(me);
+      break;
+
+    default: Error(kUnexpectedFileTypeMessage);
+    }
+}
+
+void
+baseIterDestruct(CdiIterator *me)
+{
+  /*currently empty, but that's no reason not to call it*/
+  (void) me;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+
+struct CdiFallbackIterator
+{
+  CdiIterator super;
+  char *path;  // needed for clone() & serialize()
+  int streamId, vlistId, subtypeId;
+
+  int variableCount, curVariable;
+  int curLevelCount, curLevel;
+  int curSubtypeCount, curSubtype;
+  int curTimestep;
+};
+
+CdiIterator *
+cdiFallbackIterator_getSuper(CdiFallbackIterator *me)
+{
+  return &me->super;
+}
+
+CdiIterator *
+cdiFallbackIterator_new(const char *path, int filetype)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me));
+  baseIterConstruct(&me->super, filetype);
+  me->subtypeId = CDI_UNDEFID;  // Will be set in cdiFallbackIterator_nextField()
+  me->curSubtypeCount = -1;     // Will be set in cdiFallbackIterator_nextField()
+  me->curLevelCount = -1;       // Will be set in cdiFallbackIterator_nextField()
+  // These values are chosen so that the natural increment at the start of cdiFallbackIterator_nextField() will correctly position
+  // us at the first slice.
+  me->curTimestep = 0;
+  me->curVariable = -1;
+  me->curSubtype = -1;
+  me->curLevel = -1;
+  me->streamId = streamOpenRead(path);
+  if (me->streamId != CDI_UNDEFID)
+    {
+      me->vlistId = streamInqVlist(me->streamId);
+      if (me->vlistId != CDI_UNDEFID && (me->variableCount = vlistNvars(me->vlistId)) > 0
+          && streamInqTimestep(me->streamId, me->curTimestep) > 0 && (me->path = strdup(path)))
+        {
+          return (CdiIterator *) me;
+        }
+      Free(me->path);
+      streamClose(me->streamId);
+    }
+  baseIterDestruct(&me->super);
+  Free(me);
+  return NULL;
+}
+
+void
+cdiFallbackIterator_delete(CdiIterator *super)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  Free(me->path);
+  streamClose(me->streamId);
+  baseIterDestruct(super);
+  Free(me);
+}
+
+// Fetches the info that is derived from the current variable. Most of this is published by the data members in the base class.
+static void
+fetchVariableInfo(CdiFallbackIterator *me)
+{
+  // Fetch data that's published via base class data members.
+  me->super.datatype = vlistInqVarDatatype(me->vlistId, me->curVariable);
+  me->super.timesteptype = vlistInqVarTsteptype(me->vlistId, me->curVariable);
+  me->super.gridId = vlistInqVarGrid(me->vlistId, me->curVariable);
+  int param = vlistInqVarParam(me->vlistId, me->curVariable);
+  cdiDecodeParam(param, &me->super.param.number, &me->super.param.category, &me->super.param.discipline);
+
+  // Fetch the current level and subtype counts.
+  me->curLevelCount = zaxisInqSize(vlistInqVarZaxis(me->vlistId, me->curVariable));
+  me->subtypeId = vlistInqVarSubtype(me->vlistId, me->curVariable);
+  me->curSubtypeCount = (me->subtypeId == CDI_UNDEFID) ? 1 : subtypeInqSize(me->subtypeId);
+}
+
+CdiFallbackIterator *
+cdiFallbackIterator_clone(CdiIterator *super)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+
+  // Make another stream for this file. This yields an unadvanced iterator.
+  CdiFallbackIterator *clone = (CdiFallbackIterator *) (void *) cdiFallbackIterator_new(me->path, me->super.filetype);
+  if (clone)
+    {
+      // Point the clone to the same position in the file.
+      clone->variableCount = me->variableCount;
+      clone->curVariable = me->curVariable;
+      clone->curLevelCount = me->curLevelCount;
+      clone->curLevel = me->curLevel;
+      clone->curSubtypeCount = me->curSubtypeCount;
+      clone->curSubtype = me->curSubtype;
+      clone->curTimestep = me->curTimestep;
+
+      clone->super.isAdvanced = super->isAdvanced;
+      if (super->isAdvanced) fetchVariableInfo(clone);
+    }
+
+  return clone;
+}
+
+char *
+cdiFallbackIterator_serialize(CdiIterator *super)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+
+  char *escapedPath = cdiEscapeSpaces(me->path);
+  size_t len = strlen(escapedPath) + 7 * (3 * sizeof(int) * CHAR_BIT / 8 + 1) + 1;
+  char *result = (char *) Malloc(len);
+  snprintf(result, len, "%s %d %d %d %d %d %d %d", escapedPath, me->variableCount, me->curVariable, me->curLevelCount, me->curLevel,
+           me->curSubtypeCount, me->curSubtype, me->curTimestep);
+  Free(escapedPath);
+  return result;
+}
+
+CdiFallbackIterator *
+cdiFallbackIterator_deserialize(const char *description)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me));
+  if (!me) goto fail;
+
+  description = baseIter_constructFromString(&me->super, description);
+
+  while (*description == ' ') description++;
+  me->path = cdiUnescapeSpaces(description, &description);
+  if (!me->path) goto destructSuper;
+
+  me->streamId = streamOpenRead(me->path);
+  if (me->streamId == CDI_UNDEFID) goto freePath;
+  me->vlistId = streamInqVlist(me->streamId);
+  if (me->vlistId == CDI_UNDEFID) goto closeStream;
+
+    // This reads one variable from the description string, does error checking, and advances the given string pointer.
+#define decodeValue(variable, description)                                                                                      \
+  do                                                                                                                            \
+    {                                                                                                                           \
+      const char *savedStart = description;                                                                                     \
+      long long decodedValue                                                                                                    \
+          = strtoll(description, (char **) &description, 0); /*The cast is a workaround for the wrong signature of strtoll().*/ \
+      variable = (int) decodedValue;                                                                                            \
+      if (savedStart == description) goto closeStream;                                                                          \
+      if ((long long) decodedValue != (long long) variable) goto closeStream;                                                   \
+    }                                                                                                                           \
+  while (0)
+  decodeValue(me->variableCount, description);
+  decodeValue(me->curVariable, description);
+  decodeValue(me->curLevelCount, description);
+  decodeValue(me->curLevel, description);
+  decodeValue(me->curSubtypeCount, description);
+  decodeValue(me->curSubtype, description);
+  decodeValue(me->curTimestep, description);
+#undef decodeValue
+
+  if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) goto closeStream;
+  if (me->super.isAdvanced) fetchVariableInfo(me);
+
+  return me;
+
+closeStream:
+  streamClose(me->streamId);
+freePath:
+  Free(me->path);
+destructSuper:
+  baseIterDestruct(&me->super);
+  Free(me);
+fail:
+  return NULL;
+}
+
+static int
+advance(CdiFallbackIterator *me)
+{
+  me->curLevel++;
+  if (me->curLevel >= me->curLevelCount)
+    {
+      me->curLevel = 0;
+      me->curSubtype++;
+      if (me->curSubtype >= me->curSubtypeCount)
+        {
+          me->curSubtype = 0;
+          me->curVariable++;
+          if (me->curVariable >= me->variableCount)
+            {
+              me->curVariable = 0;
+              me->curTimestep++;
+              if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) return CDI_EEOF;
+            }
+        }
+    }
+  return CDI_NOERR;
+}
+
+int
+cdiFallbackIterator_nextField(CdiIterator *super)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int result = advance(me);
+  if (result) return result;
+
+  if (!me->curLevel && !me->curSubtype)
+    fetchVariableInfo(me);  // Check whether we are processing a new variable/timestep and fetch the information that may have
+                            // changed in this case.
+  return CDI_NOERR;
+}
+
+char *
+cdiFallbackIterator_inqTime(CdiIterator *super, CdiTimeType timeType)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+
+  // retrieve the time information
+  int taxisId = vlistInqTaxis(me->vlistId);
+  int date = 0, time = 0;
+  switch (timeType)
+    {
+    case kCdiTimeType_referenceTime:
+      date = taxisInqRdate(taxisId);
+      time = taxisInqRtime(taxisId);
+      break;
+
+    case kCdiTimeType_startTime:
+      date = taxisInqVdate(taxisId);
+      time = taxisInqVtime(taxisId);
+      break;
+
+    case kCdiTimeType_endTime:
+      return NULL;  // The stream interface does not export the start/end times of statistical fields, so we treat all data as point
+                    // of time data, returning the validity time as the start time.
+
+    default: assert(0 && "internal error, please report this bug");
+    }
+
+  // decode the time information and reencode it into an ISO-compliant string
+  int year, month, day, hour, minute, second;
+  cdiDecodeDate(date, &year, &month, &day);
+  cdiDecodeTime(time, &hour, &minute, &second);
+  size_t len = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1;
+  char *result = (char *) Malloc(len);
+  snprintf(result, len, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, month, day, hour, minute, second);
+  return result;
+}
+
+int
+cdiFallbackIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName,
+                              char **outUnit)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable);
+  (void) levelSelector;
+#define copyString(outPointer, key)                                       \
+  do                                                                      \
+    {                                                                     \
+      if (outPointer)                                                     \
+        {                                                                 \
+          char tempBuffer[CDI_MAX_NAME];                                  \
+          int length = CDI_MAX_NAME;                                      \
+          cdiInqKeyString(zaxisId, CDI_GLOBAL, key, tempBuffer, &length); \
+          *outPointer = strdup(tempBuffer);                               \
+        }                                                                 \
+    }                                                                     \
+  while (0)
+  copyString(outName, CDI_KEY_NAME);
+  copyString(outLongName, CDI_KEY_LONGNAME);
+  copyString(outStdName, CDI_KEY_STDNAME);
+  copyString(outUnit, CDI_KEY_UNITS);
+#undef copyString
+  int ltype = 0;
+  cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype);
+  return ltype;
+}
+
+int
+cdiFallbackIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable);
+
+  // handle NULL pointers once and for all
+  double trash;
+  if (!outValue1) outValue1 = &trash;
+  if (!outValue2) outValue2 = &trash;
+
+  // get the level value
+  if (levelSelector)
+    {
+      *outValue1 = (zaxisInqLbounds(zaxisId, NULL)) ? zaxisInqLbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel);
+    }
+  else
+    {
+      *outValue1 = (zaxisInqUbounds(zaxisId, NULL)) ? zaxisInqUbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel);
+    }
+  *outValue2 = 0.0;
+
+  // if this is a hybrid zaxis, lookup the coordinates in the vertical coordinate table
+  ssize_t intLevel = (ssize_t) (2 * *outValue1);
+  if (0 <= intLevel && intLevel < zaxisInqVctSize(zaxisId) - 1)
+    {
+      const double *coordinateTable = zaxisInqVctPtr(zaxisId);
+      *outValue1 = coordinateTable[intLevel];
+      *outValue2 = coordinateTable[intLevel + 1];
+    }
+  return CDI_NOERR;
+}
+
+int
+cdiFallbackIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE])
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable);
+  int ltype = 0;
+  cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype);
+  if (ltype != ZAXIS_HYBRID) return CDI_EINVAL;
+  if (outVgridNumber)
+    {
+      *outVgridNumber = 0;
+      cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, outVgridNumber);
+    }
+  if (outLevelCount)
+    {
+      *outLevelCount = 0;
+      cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NLEV, outLevelCount);
+    }
+  if (outUuid)
+    {
+      int length = CDI_UUID_SIZE;
+      memset(outUuid, 0, (size_t) length);
+      cdiInqKeyBytes(zaxisId, CDI_GLOBAL, CDI_KEY_UUID, outUuid, &length);
+    }
+  return CDI_NOERR;
+}
+
+int
+cdiFallbackIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int dummy = 0;
+  if (!outTileIndex) outTileIndex = &dummy;
+  if (!outTileAttribute) outTileAttribute = &dummy;
+
+  int error = CDI_NOERR;
+  if (me->subtypeId == CDI_UNDEFID)  // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the
+                                     // program instead of returning an error
+    {
+      error = CDI_EINVAL;
+    }
+  else
+    {
+      if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileIndex", outTileIndex)) error = CDI_EINVAL;
+      if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileAttribute", outTileAttribute)) error = CDI_EINVAL;
+    }
+  if (error) *outTileIndex = *outTileAttribute = -1;  // Guarantee defined values in case of an error.
+  return error;
+}
+
+int
+cdiFallbackIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  int temp = 0;
+  if (!outTileCount) outTileCount = &temp;
+  if (!outTileAttributeCount) outTileAttributeCount = &temp;
+
+  int error = CDI_NOERR;
+  if (me->subtypeId == CDI_UNDEFID)  // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the
+                                     // program instead of returning an error
+    {
+      error = CDI_EINVAL;
+    }
+  else
+    {
+      if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTiles", outTileCount)) error = CDI_EINVAL;
+      if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTileAttributes", outTileAttributeCount)) error = CDI_EINVAL;
+    }
+  if (error) *outTileCount = *outTileAttributeCount = -1;  // Guarantee defined values in case of an error.
+  return CDI_NOERR;
+}
+
+char *
+cdiFallbackIterator_copyVariableName(CdiIterator *super)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  return vlistCopyVarName(me->vlistId, me->curVariable);
+}
+
+void
+cdiFallbackIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  SizeType missingValues = 0;
+  streamReadVarSlice(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues);
+  if (numMissVals) *numMissVals = (size_t) missingValues;
+}
+
+void
+cdiFallbackIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals)
+{
+  CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super;
+  SizeType missingValues = 0;
+  streamReadVarSliceF(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues);
+  if (numMissVals) *numMissVals = (size_t) missingValues;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef STREAM_GRB_H
+#define STREAM_GRB_H
+
+double zaxis_units_to_centimeter(int zaxisID);
+double zaxis_units_to_meter(int zaxisID);
+bool zaxis_units_is_Pa(int zaxisID);
+
+void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer);
+int grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer);
+
+static inline bool
+gribbyte_get_bit(int number, int bit)
+{
+  return (bool) ((number >> (8 - bit)) & 1);
+}
+static inline void
+gribbyte_set_bit(int *number, int bit)
+{
+  *number |= 1 << (8 - bit);
+}
+static inline void
+gribbyte_clear_bit(int *number, int bit)
+{
+  *number &= ~(1 << (8 - bit));
+}
+
+int grbBitsPerValue(int datatype);
+
+int fdbInqContents(stream_t *streamptr);
+long grbInqContents(stream_t *streamptr);
+int fdbInqTimestep(stream_t *streamptr, int tsID);
+int grbInqTimestep(stream_t *streamptr, int tsID);
+
+int grbInqRecord(stream_t *streamptr, int *varID, int *levelID);
+void grbDefRecord(stream_t *streamptr);
+void grb_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals);
+void grb_write_record(stream_t *streamptr, int memtype, const void *data, size_t numMissVals);
+void grbCopyRecord(stream_t *streamptr2, stream_t *streamptr1);
+
+void grb_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals);
+void grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals);
+
+void grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals);
+void grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals);
+
+int grib1ltypeToZaxisType(int grib_ltype);
+int grib2ltypeToZaxisType(int grib_ltype);
+
+int zaxisTypeToGrib1ltype(int zaxistype);
+int zaxisTypeToGrib2ltype(int zaxistype);
+
+int grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear);
+
+struct cdiGribParamChange
+{
+  int code, ltype, lev;
+  bool active;
+};
+
+struct cdiGribScanModeChange
+{
+  int value;
+  bool active;
+};
+
+extern struct cdiGribParamChange cdiGribChangeParameterID;
+extern struct cdiGribScanModeChange cdiGribDataScanningMode;
+
+// Used in CDO
+void streamGrbChangeParameterIdentification(int code, int ltype, int lev);
+void streamGrbDefDataScanningMode(int scanmode);
+
+#endif /* STREAM_GRB_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef ZAXIS_H
+#define ZAXIS_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+// clang-format off
+typedef struct
+{
+  double    *vals;
+#ifndef USE_MPI
+  char     **cvals;
+  int        clength;
+#endif
+  double    *lbounds;
+  double    *ubounds;
+  double    *weights;
+  int        self;
+  int        scalar;
+  int        type;
+  int        size;
+  int        direction;
+  int        vctsize;
+  unsigned   positive;
+  double    *vct;
+  cdi_keys_t keys;
+  cdi_atts_t atts;
+}
+zaxis_t;
+// clang-format on
+
+void zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName,
+                             const char **outStdName,
+                             const char **outUnit);  // The returned const char* point to static storage. Don't free or modify them.
+
+unsigned cdiZaxisCount(void);
+
+zaxis_t *zaxis_to_pointer(int zaxisID);
+
+void cdiZaxisGetIndexList(unsigned numIDs, int *IDs);
+
+int zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id);
+
+const resOps *getZaxisOps(void);
+
+const char *zaxisInqNamePtr(int zaxisID);
+
+const double *zaxisInqLevelsPtr(int zaxisID);
+#ifndef USE_MPI
+char **zaxisInqCValsPtr(int zaxisID);
+#endif
+void zaxisResize(int zaxisID, int size);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+
+#include <assert.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_LIBGRIB_API
+
+struct CdiGribIterator
+{
+  CdiIterator super;
+
+  CdiInputFile *file;
+  off_t fileOffset;
+  unsigned char *gribBuffer;
+  size_t bufferSize, curRecordSize;
+  grib_handle *gribHandle;
+};
+
+CdiIterator *
+cdiGribIterator_getSuper(CdiGribIterator *me)
+{
+  return &me->super;
+}
+
+// Since the error handling in constructors is usually very closely related to the workings of a destructor,
+// this function combines both functions in one, using a centralized exit.
+// The mode of operation depends on whether me is a NULL pointer on entry:
+// If it is NULL, a new object is allocated and constructed, which is returned if construction is successful.
+// If a non-NULL pointer is passed in, the object is destructed and NULL is returned. In this case, the other arguments are ignored.
+static CdiGribIterator *
+cdiGribIterator_condestruct(CdiGribIterator *me, const char *path, int filetype)
+{
+#define super() (&me->super)
+  if (me) goto destruct;
+  me = (CdiGribIterator *) Malloc(sizeof(*me));
+  baseIterConstruct(super(), filetype);
+
+  me->file = cdiInputFile_make(path);
+  if (!me->file) goto destructSuper;
+  me->fileOffset = 0;
+  me->gribHandle = NULL;
+  me->gribBuffer = NULL;
+  me->bufferSize = me->curRecordSize = 0;
+  me->super.gridId = CDI_UNDEFID;
+
+  goto success;
+
+  // ^        constructor code        ^
+  // |                                |
+  // v destructor/error-cleanup code  v
+
+destruct:
+  if (me->super.gridId != CDI_UNDEFID) gridDestroy(me->super.gridId);
+  if (me->gribHandle) grib_handle_delete((struct grib_handle *) me->gribHandle);
+  Free(me->gribBuffer);
+  cdiRefObject_release(&me->file->super);
+destructSuper:
+  baseIterDestruct(super());
+  Free(me);
+  me = NULL;
+
+success:
+  return me;
+#undef super
+}
+
+CdiIterator *
+cdiGribIterator_new(const char *path, int filetype)
+{
+  return &cdiGribIterator_condestruct(NULL, path, filetype)->super;
+}
+
+CdiGribIterator *
+cdiGribIterator_makeClone(CdiIterator *super)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  // Allocate memory and copy data. (operations that may fail)
+  CdiGribIterator *result = (struct CdiGribIterator *) Malloc(sizeof(*result));
+  if (!result) goto fail;
+
+  result->file = me->file;
+  result->fileOffset = me->fileOffset;
+  result->gribBuffer = NULL;
+  result->bufferSize = me->bufferSize;
+  result->curRecordSize = me->curRecordSize;
+  result->gribHandle = NULL;
+
+  if (me->gribBuffer)
+    {
+      result->gribBuffer = (unsigned char *) Malloc(me->bufferSize);
+      if (!result->gribBuffer) goto freeResult;
+      memcpy(result->gribBuffer, me->gribBuffer, me->curRecordSize);
+    }
+  if (me->gribHandle)
+    {
+      result->gribHandle = grib_handle_new_from_message(NULL, result->gribBuffer, result->curRecordSize);
+      if (!result->gribHandle) goto freeBuffer;
+    }
+  if (super->gridId != CDI_UNDEFID)
+    {
+      result->super.gridId = gridDuplicate(super->gridId);
+      if (result->super.gridId == CDI_UNDEFID) goto deleteGribHandle;
+    }
+
+  // Finish construction. (operations that cannot fail)
+  baseIterConstruct(&result->super, super->filetype);
+  result->super.datatype = super->datatype;
+  result->super.timesteptype = super->timesteptype;
+  result->super.param = super->param;
+  cdiRefObject_retain(&result->file->super);
+
+  return result;
+
+  // Error handling.
+deleteGribHandle:
+  if (result->gribHandle) grib_handle_delete(result->gribHandle);
+freeBuffer:
+  Free(result->gribBuffer);
+freeResult:
+  Free(result);
+fail:
+  return NULL;
+}
+
+char *
+cdiGribIterator_serialize(CdiIterator *super)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  const char *path = cdiInputFile_getPath(me->file);
+  char *escapedPath = cdiEscapeSpaces(path);
+  size_t len = strlen(escapedPath) + 3 * sizeof(int) * CHAR_BIT / 8;
+  char *result = (char *) Malloc(len);
+  snprintf(result, len, "%s %zu", escapedPath, (size_t) me->fileOffset);
+  Free(escapedPath);
+  return result;
+}
+
+CdiGribIterator *
+cdiGribIterator_deserialize(const char *description)
+{
+  char *path;
+  CdiGribIterator *me = (CdiGribIterator *) Malloc(sizeof(*me));
+  if (!me) goto fail;
+
+  description = baseIter_constructFromString(&me->super, description);
+
+  while (*description == ' ') description++;
+  path = cdiUnescapeSpaces(description, &description);
+  if (!path) goto destructSuper;
+
+  me->file = cdiInputFile_make(path);
+  Free(path);
+  if (!me->file) goto destructSuper;
+
+  {
+    const char *savedStart = description;
+    char *description_ = (char *) description;
+    long long decodedOffset = strtoll(description, &description_, 0);
+    description = description_;
+    me->fileOffset = (off_t) decodedOffset;
+    if (savedStart == description) goto closeFile;
+    if ((unsigned long long) decodedOffset > (unsigned long long) me->fileOffset) goto closeFile;
+  }
+
+  me->gribBuffer = NULL;
+  me->bufferSize = me->curRecordSize = 0;
+  me->gribHandle = NULL;
+  me->super.gridId = CDI_UNDEFID;
+  if (me->super.isAdvanced && cdiGribIterator_nextField(&me->super)) goto closeFile;
+
+  return me;
+
+closeFile:
+  cdiRefObject_release(&me->file->super);
+destructSuper:
+  baseIterDestruct(&me->super);
+  Free(me);
+fail:
+  return NULL;
+}
+
+static void
+cdiGribIterator_ensureBuffer(CdiGribIterator *me, size_t requiredSize)
+{
+  if (me->bufferSize < requiredSize)
+    {
+      me->bufferSize *= 2;
+      if (me->bufferSize < requiredSize) me->bufferSize = requiredSize;
+      me->gribBuffer = (unsigned char *) Realloc(me->gribBuffer, me->bufferSize);
+    }
+}
+
+static bool
+isGrib1DualLevel(int levelType)
+{
+  switch (levelType)
+    {
+    case 101:
+    case 104:
+    case 106:
+    case 108:
+    case 110:
+    case 112:
+    case 114:
+    case 116:
+    case 120:
+    case 121:
+    case 128:
+    case 141:  // This is the complete list after grib_api-1.12.3/definitions/grib1/sections.1.def:106-117:, the code in
+               // cdi/src/stream_gribapi.c:grib1GetLevel() seems to be incomplete.
+      return true;
+    default: return false;
+    }
+}
+
+static const unsigned char *
+positionOfGribMarker(const unsigned char *data, size_t size)
+{
+  for (const unsigned char *currentPosition = data, *end = data + size; currentPosition < end; currentPosition++)
+    {
+      currentPosition = (unsigned char *) memchr(
+          currentPosition, 'G',
+          size - (size_t) (currentPosition - data) - 3);  //-3 to ensure that we don't overrun the buffer during the strncmp() call.
+      if (!currentPosition) return NULL;
+      if (!strncmp((const char *) currentPosition, "GRIB", 4)) return currentPosition;
+    }
+  return NULL;
+}
+
+// This clobbers the contents of the gribBuffer!
+// Returns the file offset of the next 'GRIB' marker.
+static ssize_t
+scanToGribMarker(CdiGribIterator *me)
+{
+  cdiGribIterator_ensureBuffer(me, 8 * 1024);
+  const size_t kMaxScanSize = 16 * 1024 * 1024;
+  for (size_t scannedBytes = 0, scanSize; scannedBytes < kMaxScanSize; scannedBytes += scanSize)
+    {
+      // Load a chunk of data into our buffer.
+      scanSize = me->bufferSize;
+      if (scannedBytes + scanSize > kMaxScanSize) scanSize = kMaxScanSize - scannedBytes;
+      assert(scanSize <= me->bufferSize);
+      int status = cdiInputFile_read(me->file, me->fileOffset + (off_t) scannedBytes, scanSize, &scanSize, me->gribBuffer);
+      if (status != CDI_NOERR && status != CDI_EEOF) return -1;
+
+      const unsigned char *startPosition = positionOfGribMarker(me->gribBuffer, scanSize);
+      if (startPosition)
+        {
+          return (ssize_t) (me->fileOffset + (off_t) scannedBytes + (off_t) (startPosition - me->gribBuffer));
+        }
+
+      // Get the offset for the next iteration if there is a next iteration.
+      scanSize -= 3;                           // so that we won't miss a 'GRIB' sequence that happens to be cut off
+      scanSize &= ~(size_t) 0xf;               // make 16 bytes aligned
+      if ((ssize_t) scanSize <= 0) return -1;  // ensure that we make progress
+    }
+  return -1;
+}
+
+static unsigned
+decode24(void *beData)
+{
+  unsigned char *bytes = (unsigned char *) beData;
+  return ((unsigned) bytes[0] << 16) + ((unsigned) bytes[1] << 8) + (unsigned) bytes[2];
+}
+
+static uint64_t
+decode64(void *beData)
+{
+  unsigned char *bytes = (unsigned char *) beData;
+  uint64_t result = 0;
+  for (size_t i = 0; i < 8; i++) result = (result << 8) + bytes[i];
+  return result;
+}
+
+// Determine the size of the GRIB record that begins at the given file offset.
+static int
+getRecordSize(CdiGribIterator *me, off_t gribFileOffset, size_t *outRecordSize)
+{
+  char buffer[16];
+  size_t readSize;
+  int status = cdiInputFile_read(me->file, gribFileOffset, sizeof(buffer), &readSize, buffer);
+  if (status != CDI_NOERR && status != CDI_EEOF) return status;
+  if (readSize < sizeof(buffer)) return CDI_EEOF;
+  *outRecordSize = 0;
+  switch (buffer[7])
+    {
+    case 1:
+      *outRecordSize = decode24(&buffer[4]);
+      if (*outRecordSize & (1 << 23))
+        {
+          *outRecordSize = 120 * (*outRecordSize & ((1 << 23) - 1));  // Rescaling for long records.
+          // The corresponding code in cgribexlib.c:4532-4570: is much more complicated
+          // due to the fact that it subtracts the padding bytes that are inserted after section 4.
+          // However, we are only interested in the total size of data we need to read here,
+          // so we can ignore the presence of some padding bytes.
+        }
+      return CDI_NOERR;
+
+    case 2: *outRecordSize = decode64(&buffer[8]); return CDI_NOERR;
+
+    default: return CDI_EUFTYPE;
+    }
+}
+
+#if 0
+static void hexdump(void *data, size_t size)
+{
+  unsigned char *charData = data;
+  for(size_t offset = 0; offset < size; )
+    {
+      printf("%016zx:", offset);
+      for(size_t i = 0; i < 64 && offset < size; i++, offset++)
+        {
+          if((i & 63) && !(i & 15)) printf(" |");
+          if((i & 15) && !(i & 3)) printf("  ");
+          printf(" %02x", charData[offset]);
+        }
+      printf("\n");
+    }
+}
+#endif
+
+// Read a record into memory and wrap it in a grib_handle.
+// XXX: I have omitted checking for szip compression as it is done in grbReadVarDP() & friends since that appears to be a
+// non-standard extension of the GRIB1 standard: bit 1 in octet 14 of the binary data section which is used to signal szip
+// compression is defined to be reserved in the standard. As such, it seems prudent not to support this and to encourage people with
+// such szip compressed files to switch to the GRIB2/JPEG2000 format. However, in the case that this reasoning is wrong, this
+// function is probably the place to add the check for zsip compression.
+static int
+readMessage(CdiGribIterator *me)
+{
+  // Destroy the old grib_handle.
+  if (me->gribHandle) grib_handle_delete(me->gribHandle), me->gribHandle = NULL;
+  me->fileOffset += (off_t) me->curRecordSize;
+
+  // Find the next record and determine its size.
+  ssize_t gribFileOffset = scanToGribMarker(me);
+  int result = CDI_EEOF;
+  if (gribFileOffset < 0) goto fail;
+  result = getRecordSize(me, gribFileOffset, &me->curRecordSize);
+  if (result) goto fail;
+
+  // Load the whole record into our buffer and create a grib_handle for it.
+  cdiGribIterator_ensureBuffer(me, me->curRecordSize);
+  result = cdiInputFile_read(me->file, gribFileOffset, me->curRecordSize, NULL, me->gribBuffer);
+  if (result) goto fail;
+  me->gribHandle = grib_handle_new_from_message(NULL, me->gribBuffer, me->curRecordSize);
+  result = CDI_EUFSTRUCT;
+  if (!me->gribHandle) goto fail;
+
+  return CDI_NOERR;
+
+fail:
+  me->curRecordSize = 0;  // This ensures that we won't jump to an uncontrolled file position if cdiGribIterator_nextField() is
+                          // called another time after it has returned an error.
+  return result;
+}
+
+int
+cdiGribIterator_nextField(CdiIterator *super)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  if (super->gridId != CDI_UNDEFID) gridDestroy(super->gridId), super->gridId = CDI_UNDEFID;
+
+  // Get the next GRIB message into our buffer.
+  int result = readMessage(me);
+  if (result) return result;
+
+  // Get the metadata that's published as variables in the base class.
+  super->datatype = gribGetDatatype(me->gribHandle);
+  super->timesteptype = gribapiGetTsteptype(me->gribHandle);
+  cdiDecodeParam(gribapiGetParam(me->gribHandle), &super->param.number, &super->param.category, &super->param.discipline);
+  grid_t grid;
+  gribapiGetGrid(me->gribHandle, &grid);
+  super->gridId = gridGenerate(&grid);
+
+  return CDI_NOERR;
+}
+
+char *
+cdiGribIterator_inqTime(CdiIterator *super, CdiTimeType timeType)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+  return gribMakeTimeString(me->gribHandle, timeType);
+}
+
+int
+cdiGribIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName,
+                          char **outUnit)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  // First determine the zaxis type corresponding to the given level.
+  int zaxisType = ZAXIS_GENERIC;
+  if (gribEditionNumber(me->gribHandle) <= 1)
+    {
+      int levelType = (int) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", 255);
+      if (levelSelector && !isGrib1DualLevel(levelType)) levelType = 255;
+      zaxisType = grib1ltypeToZaxisType(levelType);
+    }
+  else
+    {
+      int levelType
+          = (int) gribGetLongDefault(me->gribHandle, levelSelector ? "typeOfSecondFixedSurface" : "typeOfFirstFixedSurface", 255);
+      zaxisType = grib2ltypeToZaxisType(levelType);
+    }
+
+  // Then lookup the requested names.
+  const char *name, *longName, *stdName, *unit;
+  zaxisGetTypeDescription(zaxisType, NULL, &name, &longName, &stdName, &unit);
+  if (outName) *outName = strdup(name);
+  if (outLongName) *outLongName = strdup(longName);
+  if (outStdName) *outStdName = strdup(stdName);
+  if (outUnit) *outUnit = strdup(unit);
+
+  return zaxisType;
+}
+
+static double
+logicalLevelValue2(long gribType, long storedValue, long power)
+{
+  double factor = 1;
+  assert(power >= 0);
+  while (power--) factor *= 10;  // this is precise up to factor == 22.
+  switch (gribType)
+    {
+    case GRIB2_LTYPE_LANDDEPTH:
+    case GRIB2_LTYPE_ISOBARIC:
+    case GRIB2_LTYPE_SIGMA:
+      return (double) storedValue
+             * (1000.0 / factor);  // The evaluation order allows the factors of ten to cancel out before rounding.
+
+    case 255: return 0;
+
+    default: return (double) storedValue / factor;
+    }
+}
+
+// The output values must be preinitialized, this function does not always write them.
+static int
+readLevel2(grib_handle *gribHandle, const char *levelTypeKey, const char *powerKey, const char *valueKey, double *outValue1,
+           double *outValue2)
+{
+  assert(levelTypeKey && powerKey && valueKey && outValue1 && outValue2);
+
+  long levelType = gribGetLongDefault(gribHandle, levelTypeKey, 255);  // 1 byte
+  switch (levelType)
+    {
+    case 255: break;
+
+    case 105:
+    case 113:
+      {
+        unsigned long value = (unsigned long) gribGetLongDefault(gribHandle, valueKey, 0);
+        unsigned long coordinateCount = (unsigned long) gribGetLongDefault(gribHandle, "numberOfCoordinatesValues", 0);
+        if (value >= coordinateCount / 2)
+          {
+            Error("Invalid level coordinate: Level has the hybrid coordinate index %lu, but only %lu coordinate pairs are present.",
+                  value, coordinateCount / 2);
+            return CDI_EUFSTRUCT;
+          }
+        int status;
+        // XXX: I'm not 100% sure about how the coordinate pairs are stored in the file.
+        //     I'm assuming an array of pairs due to the example code in grib_api-1.12.3/examples/F90/set_pv.f90, but that may be
+        //     wrong.
+        if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2, outValue1))) return status;
+        if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2 + 1, outValue2))) return status;
+        break;
+      }
+
+    default:
+      {
+        long power = 255 & gribGetLongDefault(gribHandle, powerKey, 0);  // 1 byte
+        if (power == 255) power = 0;
+        long value = gribGetLongDefault(gribHandle, valueKey, 0);  // 4 bytes
+        *outValue1 = logicalLevelValue2(levelType, value, power);
+      }
+    }
+  return CDI_NOERR;
+}
+
+int
+cdiGribIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+  double trash;
+  if (!outValue1) outValue1 = &trash;
+  if (!outValue2) outValue2 = &trash;
+  *outValue1 = *outValue2 = 0;
+
+  if (gribEditionNumber(me->gribHandle) > 1)
+    {
+      if (levelSelector)
+        {
+          return readLevel2(me->gribHandle, "typeOfFirstFixedSurface", "scaleFactorOfFirstFixedSurface",
+                            "scaledValueOfFirstFixedSurface", outValue1, outValue2);
+        }
+      else
+        {
+          return readLevel2(me->gribHandle, "typeOfSecondFixedSurface", "scaleFactorOfSecondFixedSurface",
+                            "scaledValueOfSecondFixedSurface", outValue1, outValue2);
+        }
+    }
+  else
+    {
+      long levelType = (uint8_t) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", -1);  // 1 byte
+      if (levelType == 255)
+        {
+        }
+      else if (isGrib1DualLevel((int) levelType))
+        {
+          *outValue1 = (double) (gribGetLongDefault(me->gribHandle, (levelSelector ? "bottomLevel" : "topLevel"), 0));
+        }
+      else if (levelType == 100)
+        {
+          *outValue1 = 100 * (double) (gribGetLongDefault(me->gribHandle, "level", 0));  // 2 bytes
+        }
+      else
+        {
+          *outValue1 = (double) (gribGetLongDefault(me->gribHandle, "level", 0));  // 2 bytes
+        }
+    }
+  return CDI_NOERR;
+}
+
+int
+cdiGribIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE])
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  if (outVgridNumber)
+    {
+      long temp;
+      if (grib_get_long(me->gribHandle, "numberOfVGridUsed", &temp)) return CDI_EINVAL;
+      *outVgridNumber = (int) temp;
+    }
+  if (outLevelCount)
+    {
+      long temp;
+      if (grib_get_long(me->gribHandle, "nlev", &temp)) return CDI_EINVAL;
+      *outLevelCount = (int) temp;
+    }
+  if (outUuid)
+    {
+      size_t size = CDI_UUID_SIZE;
+      if (grib_get_bytes(me->gribHandle, "uuidOfVGrid", outUuid, &size)) return CDI_EINVAL;
+      if (size != CDI_UUID_SIZE) return CDI_EUFSTRUCT;
+    }
+
+  return CDI_NOERR;
+}
+
+int
+cdiGribIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+  int trash;
+  if (!outTileIndex) outTileIndex = &trash;
+  if (!outTileAttribute) outTileAttribute = &trash;
+
+  // Get the values if possible.
+  int error = CDI_NOERR;
+  long value;
+  if (grib_get_long(me->gribHandle, "tileIndex", &value)) error = CDI_EINVAL;
+  *outTileIndex = (int) value;
+  if (grib_get_long(me->gribHandle, "tileAttribute", &value)) error = CDI_EINVAL;
+  *outTileAttribute = (int) value;
+
+  // Ensure defined return values in case of failure.
+  if (error) *outTileIndex = *outTileAttribute = -1;
+  return error;
+}
+
+int
+cdiGribIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+  int trash;
+  if (!outTileCount) outTileCount = &trash;
+  if (!outTileAttributeCount) outTileAttributeCount = &trash;
+
+  // Get the values if possible.
+  int error = CDI_NOERR;
+  long value;
+  if (grib_get_long(me->gribHandle, "numberOfTiles", &value)) error = CDI_EINVAL;
+  *outTileCount = (int) value;
+  if (grib_get_long(me->gribHandle, "numberOfTileAttributes", &value)) error = CDI_EINVAL;
+  *outTileAttributeCount = (int) value;
+
+  // Ensure defined return values in case of failure.
+  if (error) *outTileCount = *outTileAttributeCount = 0;
+  return error;
+}
+
+char *
+cdiGribIterator_copyVariableName(CdiIterator *super)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+  return gribCopyString(me->gribHandle, "shortName");
+}
+
+void
+cdiGribIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  GRIB_CHECK(my_grib_set_double(me->gribHandle, "missingValue", CDI_Default_Missval), 0);
+  gribGetDoubleArray(me->gribHandle, "values", buffer);
+  long gridType = gribGetLong(me->gribHandle, "gridDefinitionTemplateNumber");
+  if (numMissVals)
+    {
+      // The condition excludes harmonic data.
+      *numMissVals = (gridType >= 50 && gridType <= 53) ? (size_t) 0 : (size_t) gribGetLong(me->gribHandle, "numberOfMissing");
+    }
+}
+
+void
+cdiGribIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals)
+{
+  CdiGribIterator *me = (CdiGribIterator *) (void *) super;
+
+  size_t valueCount = gribGetArraySize(me->gribHandle, "values");
+  double *temp = (double *) Malloc(valueCount * sizeof(*temp));
+  cdiGribIterator_readField(super, temp, numMissVals);
+  for (size_t i = valueCount; i--;) buffer[i] = (float) temp[i];
+  Free(temp);
+}
+#endif
+
+/*
+@Function cdiGribIterator_delete
+@Title Dispose off a CdiGribIterator instance.
+
+@Prototype void cdiGribIterator_delete(CdiGribIterator *me)
+@Parameter
+    @item me The iterator to delete.
+
+@Description
+    Combined destructor and deallocator. Make sure to match every call to cdiGribIterator_clone() with a call to this function.
+*/
+void
+cdiGribIterator_delete(CdiGribIterator *me)
+{
+#ifdef HAVE_LIBGRIB_API
+  if (me) cdiGribIterator_condestruct(me, NULL, 0);
+#else
+  if (me)
+    xabort(
+        "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// callthroughs to provide direct access to the grib keys //////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/*
+@Function cdiGribIterator_inqEdition
+@Title Get the version of the GRIB standard that is used
+
+@Prototype int cdiGribIterator_inqEdition(CdiGribIterator *me)
+@Parameter
+    @item me The iterator to operate on.
+
+@Result The GRIB version.
+
+@Description
+    Returns the version of the file format.
+*/
+int
+cdiGribIterator_inqEdition(CdiGribIterator *me)
+{
+#ifdef HAVE_LIBGRIB_API
+  return (int) gribEditionNumber(me->gribHandle);
+#else
+  (void) me;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getLong
+@Title Access to grib_get_long()
+
+@Prototype int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_long().
+*/
+int
+cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_long(me->gribHandle, key, result);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getLength
+@Title Access to grib_get_length()
+
+@Prototype int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_length().
+*/
+int
+cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result)
+{
+#ifdef HAVE_LIBGRIB_API
+#ifdef HAVE_GRIB_GET_LENGTH
+  return grib_get_length(me->gribHandle, key, result);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  Error("grib_get_length() is not available, so cdiGribIterator_getLength() can't be used");
+  return -1;
+#endif
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getString
+@Title Access to grib_get_string()
+
+@Prototype int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_string().
+*/
+int
+cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_string(me->gribHandle, key, result, length);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  (void) length;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_inqLongValue
+@Title Get the value of a GRIB-API key as a long
+
+@Prototype long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key)
+@Parameter
+    @item me The iterator to operate on.
+    @item key The GRIB-API key to retrieve.
+
+@Result The value of the key.
+
+@Description
+    Use this to fetch a grib value if you are certain that the given key must be present.
+    This will abort the process if the key cannot be retrieved.
+*/
+long
+cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key)
+{
+#ifdef HAVE_LIBGRIB_API
+  return gribGetLong(me->gribHandle, key);
+#else
+  (void) me;
+  (void) key;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_inqLongDefaultValue
+@Title Get the value of a GRIB-API key as a long
+
+@Prototype long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue)
+@Parameter
+    @item me The iterator to operate on.
+    @item key The GRIB-API key to retrieve.
+    @item defaultValue The value to return if the key is not present.
+
+@Result The value of the key or the given default value.
+
+@Description
+    Use this if you can handle failure to fetch the key by supplying a default value.
+    This function cannot fail.
+*/
+long
+cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue)
+{
+#ifdef HAVE_LIBGRIB_API
+  return gribGetLongDefault(me->gribHandle, key, defaultValue);
+#else
+  (void) me;
+  (void) key;
+  (void) defaultValue;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_inqStringValue
+@Title Safely retrieve a GRIB-API key with a string value
+
+@Prototype char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key)
+@Parameter
+    @item me The iterator to operate on.
+    @item key The GRIB-API key to retrieve.
+
+@Result A malloc'ed string or NULL.
+
+@Description
+    This will first call grib_get_length() to inquire the actual size of the string,
+    allocate memory accordingly, call grib_get_string(), and return the pointer to the new string.
+    Returns NULL on failure.
+*/
+char *
+cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key)
+{
+#ifdef HAVE_LIBGRIB_API
+  return gribCopyString(me->gribHandle, key);
+#else
+  (void) me;
+  (void) key;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return NULL;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getDouble
+@Title Access to grib_get_double()
+
+@Prototype int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_double().
+*/
+int
+cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_double(me->gribHandle, key, result);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getSize
+@Title Access to grib_get_size()
+
+@Prototype int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_size().
+*/
+int
+cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_size(me->gribHandle, key, result);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getLongArray
+@Title Access to grib_get_long_array()
+
+@Prototype int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_long_array().
+*/
+int
+cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_long_array(me->gribHandle, key, result, size);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  (void) size;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_getDoubleArray
+@Title Access to grib_get_double_array()
+
+@Prototype int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size)
+@Parameter
+    @item me The iterator to operate on.
+    @item ... The arguments to the underlying GRIB-API function.
+
+@Result An error code.
+
+@Description
+    Callthrough to grib_get_double_array().
+*/
+int
+cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size)
+{
+#ifdef HAVE_LIBGRIB_API
+  return grib_get_double_array(me->gribHandle, key, result, size);
+#else
+  (void) me;
+  (void) key;
+  (void) result;
+  (void) size;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_inqDoubleValue
+@Title Get the value of a GRIB-API key as a double
+
+@Prototype double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key)
+@Parameter
+    @item me The iterator to operate on.
+    @item key The GRIB-API key to retrieve.
+
+@Result The value of the key.
+
+@Description
+    Use this to fetch a grib value if you are certain that the given key must be present.
+    This will abort the process if the key cannot be retrieved.
+*/
+double
+cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key)
+{
+#ifdef HAVE_LIBGRIB_API
+  return gribGetDouble(me->gribHandle, key);
+#else
+  (void) me;
+  (void) key;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+@Function cdiGribIterator_inqDoubleDefaultValue
+@Title Get the value of a GRIB-API key as a double
+
+@Prototype double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue)
+@Parameter
+    @item me The iterator to operate on.
+    @item key The GRIB-API key to retrieve.
+    @item defaultValue The value to return if the key is not present.
+
+@Result The value of the key or the given default value.
+
+@Description
+    Use this if you can handle failure to fetch the key by supplying a default value.
+    This function cannot fail.
+*/
+double
+cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue)
+{
+#ifdef HAVE_LIBGRIB_API
+  return gribGetDoubleDefault(me->gribHandle, key, defaultValue);
+#else
+  (void) me;
+  (void) key;
+  (void) defaultValue;
+  xabort(
+      "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with");
+  return -4;
+#endif
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <assert.h>
+#include <math.h>
+
+// convert Julian calendar day into year, months, day
+static void
+decode_julday(int calendar, int64_t julianDay,  // Julian day number to convert
+              int *year,                        // Gregorian year (out)
+              int *mon,                         // Gregorian month (1-12) (out)
+              int *day)                         // Gregorian day (1-31) (out)
+{
+  double a = (double) julianDay;
+  assert((int64_t) a == julianDay);
+  double b = floor((a - 1867216.25) / 36524.25);
+  double c = a + b - floor(b / 4) + 1525;
+
+  if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN)
+    if (a < 2299161) c = a + 1524.;
+
+  double d = floor((c - 122.1) / 365.25);
+  double e = floor(365.25 * d);
+  double f = floor((c - e) / 30.6001);
+
+  *day = (int) (c - e - floor(30.6001 * f));
+  *mon = (int) (f - 1 - 12 * floor(f / 14));
+  *year = (int) (d - 4715 - floor((7 + *mon) / 10));
+}
+
+// convert year, month, day into Julian calendar day
+static int64_t
+encode_julday(int calendar, int year, int month, int day)
+{
+  int iy = (month <= 2) ? year - 1 : year;
+  int im = (month <= 2) ? month + 12 : month;
+  int ib = (iy < 0) ? ((iy + 1) / 400 - (iy + 1) / 100) : (iy / 400 - iy / 100);
+
+  if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN)
+    {
+      if (year > 1582 || (year == 1582 && (month > 10 || (month == 10 && day >= 15))))
+        {
+          // 15th October 1582 AD or later
+        }
+      else
+        {
+          // 4th October 1582 AD or earlier
+          ib = -2;
+        }
+    }
+
+  int64_t julianDay = (int64_t) (floor(365.25 * iy) + trunc(30.6001 * (im + 1)) + ib + 1720996.5 + day + 0.5);
+
+  return julianDay;
+}
+
+int64_t
+date_to_julday(int calendar, int64_t date)
+{
+  CdiDate date_struct = cdiDate_set(date);
+
+  return encode_julday(calendar, date_struct.year, date_struct.month, date_struct.day);
+}
+
+int64_t
+julday_to_date(int calendar, int64_t julianDay)
+{
+  int year, month, day;
+  decode_julday(calendar, julianDay, &year, &month, &day);
+
+  return cdiEncodeDate(year, month, day);
+}
+
+int
+time_to_sec(int time)
+{
+  int hour, minute, second;
+  cdiDecodeTime(time, &hour, &minute, &second);
+
+  int seconds = hour * 3600 + minute * 60 + second;
+
+  return seconds;
+}
+
+int
+sec_to_time(int secofday)
+{
+  int hour = secofday / 3600;
+  int minute = secofday / 60 - hour * 60;
+  int second = secofday - hour * 3600 - minute * 60;
+
+  return cdiEncodeTime(hour, minute, second);
+}
+
+double
+secofday_encode(CdiTime time)
+{
+  int hour = time.hour;
+  int minute = time.minute;
+  int second = time.second;
+  return hour * 3600 + minute * 60 + second + time.ms / 1000.0;
+}
+
+CdiTime
+secofday_decode(double secondOfDay)
+{
+  CdiTime time;
+
+  double secondOfDayIntegral;
+  time.ms = (short) lround(modf(secondOfDay, &secondOfDayIntegral) * 1000);
+
+  /* because of the limited value range this can be safely improved
+   * to use multiplication with inverse */
+  double hour = trunc(secondOfDayIntegral / 3600.), minute = trunc(secondOfDayIntegral / 60. - hour * 60.),
+         second = secondOfDayIntegral - hour * 3600. - minute * 60.;
+
+  time.hour = (short) hour;
+  time.minute = (short) minute;
+  time.second = (short) second;
+
+  return time;
+}
+
+static int64_t
+calendarDay_encode(int calendar, CdiDate date)
+{
+  int dpy = calendar_dpy(calendar);
+
+  if (dpy == 360 || dpy == 365 || dpy == 366)
+    return encode_calday(dpy, date.year, date.month, date.day);
+  else
+    return encode_julday(calendar, date.year, date.month, date.day);
+}
+
+static CdiDate
+calendarDay_decode(int calendar, int64_t julday)
+{
+  int year, month, day;
+  int dpy = calendar_dpy(calendar);
+
+  if (dpy == 360 || dpy == 365 || dpy == 366)
+    decode_calday(dpy, julday, &year, &month, &day);
+  else
+    decode_julday(calendar, julday, &year, &month, &day);
+
+  CdiDate date;
+  date.year = year;
+  date.month = (short) month;
+  date.day = (short) day;
+
+  return date;
+}
+
+JulianDate
+julianDate_encode(int calendar, CdiDateTime dt)
+{
+  JulianDate julianDate;
+
+  julianDate.julianDay = calendarDay_encode(calendar, dt.date);
+  julianDate.secondOfDay = secofday_encode(dt.time);
+
+  return julianDate;
+}
+
+CdiDateTime
+julianDate_decode(int calendar, JulianDate julianDate)
+{
+  CdiDateTime dt;
+
+  dt.date = calendarDay_decode(calendar, julianDate.julianDay);
+  dt.time = secofday_decode(julianDate.secondOfDay);
+
+  return dt;
+}
+
+static void
+adjust_seconds(JulianDate *julianDate)
+{
+  double SecondsPerDay = 86400.0;
+
+  while (julianDate->secondOfDay >= SecondsPerDay)
+    {
+      julianDate->secondOfDay -= SecondsPerDay;
+      julianDate->julianDay++;
+    }
+
+  while (julianDate->secondOfDay < 0.0)
+    {
+      julianDate->secondOfDay += SecondsPerDay;
+      julianDate->julianDay--;
+    }
+}
+
+// add seconds to julianDate
+JulianDate
+julianDate_add_seconds(JulianDate julianDate, int64_t seconds)
+{
+  assert(seconds == (int64_t) (double) seconds);
+  julianDate.secondOfDay += (double) seconds;
+
+  adjust_seconds(&julianDate);
+
+  return julianDate;
+}
+
+// add julianDate1 and julianDate2
+JulianDate
+julianDate_add(JulianDate julianDate1, JulianDate julianDate2)
+{
+  JulianDate julianDate;
+  julianDate.julianDay = julianDate1.julianDay + julianDate2.julianDay;
+  julianDate.secondOfDay = julianDate1.secondOfDay + julianDate2.secondOfDay;
+
+  adjust_seconds(&julianDate);
+
+  return julianDate;
+}
+
+// subtract julianDate2 from julianDate1
+JulianDate
+julianDate_sub(JulianDate julianDate1, JulianDate julianDate2)
+{
+  JulianDate julianDate;
+  julianDate.julianDay = julianDate1.julianDay - julianDate2.julianDay;
+  julianDate.secondOfDay = julianDate1.secondOfDay - julianDate2.secondOfDay;
+
+  adjust_seconds(&julianDate);
+
+  return julianDate;
+}
+
+double
+julianDate_to_seconds(JulianDate julianDate)
+{
+  assert(julianDate.julianDay == (int64_t) (double) julianDate.julianDay);
+  return (double) julianDate.julianDay * 86400.0 + julianDate.secondOfDay;
+}
+
+#ifdef TEST2
+int
+main(void)
+{
+  int calendar = CALENDAR_STANDARD;
+  int factor = 86400;
+  int value = 30;
+
+  int year = 1979;
+  int month = 1;
+  int day = 15;
+  int hour = 12;
+  int minute = 30;
+  int second = 17;
+  int ms = 0;
+
+  CdiDateTime dt;
+  dt.date = cdiDate_encode(year, month, day);
+  dt.time = cdiTime_encode(hour, minute, second, ms);
+  printf("%d/%02d/%02d %02d:%02d:%02d.%03d\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute,
+         dt.time.second, dt.time.ms);
+
+  JulianDate julianDate = julianDate_encode(calendar, dt);
+
+  dt = julianDate_decode(calendar, julianDate);
+  /* FIXME: using PRI64 seems more appropriate */
+  printf("%d/%02d/%02d %02d:%02d:%02d.%03d   %d %g\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute,
+         dt.time.second, dt.time.ms, (int) julianDate.julianDay, julianDate.secondOfDay);
+
+  for (int i = 0; i < 420; i++)
+    {
+      dt = julianDate_decode(calendar, julianDate);
+      printf("%2d %d/%02d/%02d %02d:%02d:%02d.%03d\n", i, dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute,
+             dt.time.second, dt.time.ms);
+      julianDate = julianDate_add_seconds(julianDate, value * factor);
+    }
+
+  return 0;
+}
+#endif
+#ifndef MODEL_H
+#define MODEL_H
+
+int modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id);
+
+void modelDefaultEntries(void);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <limits.h>
+#include <stdlib.h>
+
+
+#undef CDI_UNDEFID
+#define CDI_UNDEFID -1
+
+typedef struct
+{
+  int self;
+  int instID;
+  int modelgribID;
+  char *name;
+} model_t;
+
+static void modelInit(void);
+
+static int modelCompareP(void *modelptr1, void *modelptr2);
+static void modelDestroyP(void *modelptr);
+static void modelPrintP(void *modelptr, FILE *fp);
+static int modelGetSizeP(void *modelptr, void *context);
+static void modelPackP(void *modelptr, void *buff, int size, int *position, void *context);
+static int modelTxCode(void *modelptr);
+
+static const resOps modelOps = { modelCompareP, modelDestroyP, modelPrintP, modelGetSizeP, modelPackP, modelTxCode };
+
+static void
+modelDefaultValue(model_t *modelptr)
+{
+  modelptr->self = CDI_UNDEFID;
+  modelptr->instID = CDI_UNDEFID;
+  modelptr->modelgribID = CDI_UNDEFID;
+  modelptr->name = NULL;
+}
+
+static model_t *
+modelNewEntry(cdiResH resH, int instID, int modelgribID, const char *name)
+{
+  model_t *modelptr = (model_t *) malloc(sizeof(model_t));
+  modelDefaultValue(modelptr);
+  if (resH == CDI_UNDEFID)
+    modelptr->self = reshPut(modelptr, &modelOps);
+  else
+    {
+      modelptr->self = resH;
+      reshReplace(resH, modelptr, &modelOps);
+    }
+  modelptr->instID = instID;
+  modelptr->modelgribID = modelgribID;
+  if (name && *name) modelptr->name = strdup(name);
+
+  return (modelptr);
+}
+
+void
+modelDefaultEntries(void)
+{
+  int instID;
+  enum
+  {
+    nDefModels = 10
+  };
+  cdiResH resH[nDefModels];
+
+  instID = institutInq(0, 0, "ECMWF", NULL);
+  /* (void)    modelDef(instID, 131, "ERA15"); */
+  /* (void)    modelDef(instID, 199, "ERA40"); */
+
+  instID = institutInq(98, 232, "MPIMET", NULL);
+  resH[0] = modelDef(instID, 64, "ECHAM5.4");
+  resH[1] = modelDef(instID, 63, "ECHAM5.3");
+  resH[2] = modelDef(instID, 62, "ECHAM5.2");
+  resH[3] = modelDef(instID, 61, "ECHAM5.1");
+
+  instID = institutInq(98, 255, "MPIMET", NULL);
+  resH[4] = modelDef(instID, 60, "ECHAM5.0");
+  resH[5] = modelDef(instID, 50, "ECHAM4");
+  resH[6] = modelDef(instID, 110, "MPIOM1");
+
+  instID = institutInq(0, 0, "DWD", NULL);
+  resH[7] = modelDef(instID, 149, "GME");
+
+  instID = institutInq(0, 0, "MCH", NULL);
+  //(void)  = modelDef(instID, 137, "COSMO");
+  resH[8] = modelDef(instID, 255, "COSMO");
+
+  instID = institutInq(0, 1, "NCEP", NULL);
+  resH[9] = modelDef(instID, 80, "T62L28MRF");
+
+  /* pre-defined models are not synchronized */
+  for (int i = 0; i < nDefModels; i++) reshSetStatus(resH[i], &modelOps, RESH_IN_USE);
+}
+
+static void
+modelInit(void)
+{
+  static bool modelInitialized = false;
+  if (modelInitialized) return;
+}
+
+struct modelLoc
+{
+  const char *name;
+  int instID, modelgribID, resID;
+};
+
+static enum cdiApplyRet
+findModelByID(int resID, void *res, void *data)
+{
+  model_t *modelptr = (model_t *) res;
+  struct modelLoc *ret = (struct modelLoc *) data;
+  int instID = ret->instID, modelgribID = ret->modelgribID;
+  if (modelptr->instID == instID && modelptr->modelgribID == modelgribID)
+    {
+      ret->resID = resID;
+      return CDI_APPLY_STOP;
+    }
+  else
+    return CDI_APPLY_GO_ON;
+}
+
+static enum cdiApplyRet
+findModelByName(int resID, void *res, void *data)
+{
+  model_t *modelptr = (model_t *) res;
+  struct modelLoc *ret = (struct modelLoc *) data;
+  int instID = ret->instID, modelgribID = ret->modelgribID;
+  const char *name = ret->name;
+  if ((instID == -1 || modelptr->instID == instID) && (modelgribID == 0 || modelptr->modelgribID == modelgribID) && modelptr->name)
+    {
+      const char *p = name, *q = modelptr->name;
+      while (*p != '\0' && *p == *q) ++p, ++q;
+      if (*p == '\0' || *q == '\0')
+        {
+          ret->resID = resID;
+          return CDI_APPLY_STOP;
+        }
+    }
+  return CDI_APPLY_GO_ON;
+}
+
+int
+modelInq(int instID, int modelgribID, const char *name)
+{
+  modelInit();
+
+  struct modelLoc searchState = { .name = name, .instID = instID, .modelgribID = modelgribID, .resID = CDI_UNDEFID };
+  if (name && *name)
+    cdiResHFilterApply(&modelOps, findModelByName, &searchState);
+  else
+    cdiResHFilterApply(&modelOps, findModelByID, &searchState);
+  return searchState.resID;
+}
+
+int
+modelDef(int instID, int modelgribID, const char *name)
+{
+  model_t *modelptr;
+
+  modelInit();
+
+  modelptr = modelNewEntry(CDI_UNDEFID, instID, modelgribID, name);
+
+  return modelptr->self;
+}
+
+int
+modelInqInstitut(int modelID)
+{
+  model_t *modelptr = NULL;
+
+  modelInit();
+
+  if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps);
+
+  return modelptr ? modelptr->instID : CDI_UNDEFID;
+}
+
+int
+modelInqGribID(int modelID)
+{
+  model_t *modelptr = NULL;
+
+  modelInit();
+
+  if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps);
+
+  return modelptr ? modelptr->modelgribID : CDI_UNDEFID;
+}
+
+const char *
+modelInqNamePtr(int modelID)
+{
+  model_t *modelptr = NULL;
+
+  modelInit();
+
+  if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps);
+
+  return modelptr ? modelptr->name : NULL;
+}
+
+static int
+modelCompareP(void *modelptr1, void *modelptr2)
+{
+  model_t *model1 = (model_t *) modelptr1, *model2 = (model_t *) modelptr2;
+  int diff = (namespaceResHDecode(model1->instID).idx != namespaceResHDecode(model2->instID).idx)
+             | (model1->modelgribID != model2->modelgribID) | !str_is_equal(model1->name, model2->name);
+  return diff;
+}
+
+void
+modelDestroyP(void *modelptr)
+{
+  model_t *mp = (model_t *) modelptr;
+  if (mp->name) free(mp->name);
+  free(mp);
+}
+
+void
+modelPrintP(void *modelptr, FILE *fp)
+{
+  model_t *mp = (model_t *) modelptr;
+  fprintf(fp,
+          "#\n"
+          "# modelID %d\n"
+          "#\n"
+          "self          = %d\n"
+          "instID        = %d\n"
+          "modelgribID   = %d\n"
+          "name          = %s\n",
+          mp->self, mp->self, mp->instID, mp->modelgribID, mp->name ? mp->name : "NN");
+}
+
+static int
+modelTxCode(void *modelptr)
+{
+  (void) modelptr;
+  return MODEL;
+}
+
+enum
+{
+  MODEL_PACK_INT_SELF,
+  MODEL_PACK_INT_INSTID,
+  MODEL_PACK_INT_MODELGRIBID,
+  MODEL_PACK_INT_NAMELEN,
+  modelNints,
+};
+
+static int
+modelGetSizeP(void *modelptr, void *context)
+{
+  model_t *p = (model_t *) modelptr;
+  size_t txsize = (size_t) serializeGetSize(modelNints, CDI_DATATYPE_INT, context)
+                  + (size_t) serializeGetSize(p->name ? (int) strlen(p->name) : 0, CDI_DATATYPE_TXT, context);
+  xassert(txsize <= INT_MAX);
+  return (int) txsize;
+}
+
+static void
+modelPackP(void *modelptr, void *buf, int size, int *position, void *context)
+{
+  model_t *p = (model_t *) modelptr;
+  int tempbuf[modelNints];
+  tempbuf[MODEL_PACK_INT_SELF] = p->self;
+  tempbuf[MODEL_PACK_INT_INSTID] = p->instID;
+  tempbuf[MODEL_PACK_INT_MODELGRIBID] = p->modelgribID;
+  tempbuf[MODEL_PACK_INT_NAMELEN] = p->name ? (int) strlen(p->name) : 0;
+  serializePack(tempbuf, modelNints, CDI_DATATYPE_INT, buf, size, position, context);
+  if (p->name) serializePack(p->name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context);
+}
+
+int
+modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id)
+{
+#define adaptKey(key) (namespaceAdaptKey((key), originNamespace))
+  int tempbuf[modelNints];
+  char *name;
+  serializeUnpack(buf, size, position, tempbuf, modelNints, CDI_DATATYPE_INT, context);
+  if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0)
+    {
+      size_t len = (size_t) tempbuf[MODEL_PACK_INT_NAMELEN];
+      name = (char *) malloc(len + 1);
+      serializeUnpack(buf, size, position, name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context);
+      name[len] = '\0';
+    }
+  else
+    {
+      name = (char *) "";
+    }
+  int targetID = adaptKey(tempbuf[MODEL_PACK_INT_SELF]);
+  model_t *mp = modelNewEntry(force_id ? targetID : CDI_UNDEFID, adaptKey(tempbuf[MODEL_PACK_INT_INSTID]),
+                              tempbuf[MODEL_PACK_INT_MODELGRIBID], name);
+  if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0) free(name);
+  xassert(!force_id || (mp->self == adaptKey(tempbuf[0])));
+  reshSetStatus(mp->self, &modelOps, reshGetStatus(mp->self, &modelOps) & ~RESH_SYNC_BIT);
+#undef adaptKey
+  return mp->self;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef STREAM_CDF_POSTDEF_H
+#define STREAM_CDF_POSTDEF_H
+
+#include <stdlib.h>
+
+
+struct cdfPostDefAction
+{
+  void *data;
+  void (*action)(void *data);
+  void (*cleanup)(void *data);
+};
+
+struct cdfPostDefActionList
+{
+  size_t size, len;
+  struct cdfPostDefAction actions[];
+};
+
+void cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp,
+                              struct cdfPostDefActionList **delayed);
+
+typedef void (*cdfFuncPtrPostDefActionGridProp)(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp,
+                                                struct cdfPostDefActionList **delayed);
+
+struct cdfPostDefActionList *cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum);
+
+void cdfDelayedPutVarDeepCleanup(void *data);
+
+void cdfPostDefActionAddPutVal(struct cdfPostDefActionList **delayed, int fileID, int ncvarid, const double *values,
+                               void (*cleanup)(void *));
+
+#endif
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */
+#endif
+
+#include <limits.h>
+#include <stdio.h>
+
+#ifdef HAVE_LIBNETCDF
+#endif
+
+static unsigned nNamespaces = 1;
+static int activeNamespace = 0;
+
+#ifdef HAVE_LIBNETCDF
+// clang-format off
+#define CDI_NETCDF_SWITCHES                              \
+  { .func = (void (*)(void)) nc__create },               \
+  { .func = (void (*)(void)) cdf_def_var_serial },       \
+  { .func = (void (*)(void)) cdi_nc_enddef_serial },     \
+  { .func = (void (*)(void)) cdi_nc__enddef_serial },    \
+  { .func = (void (*)(void)) cdfDefTimestep },           \
+  { .func = (void (*)(void)) cdfDefCoordinateVars },     \
+  { .func = (void (*)(void)) cdfPostDefActionGridProp }
+// clang-format on
+#else
+#define CDI_NETCDF_SWITCHES
+#endif
+
+// clang-format off
+#define defaultSwitches {                                       \
+    { .func = (void (*)(void)) cdiAbortC_serial },              \
+    { .func = (void (*)(void)) cdiWarning },                    \
+    { .func = (void (*)(void)) serializeGetSizeInCore },        \
+    { .func = (void (*)(void)) serializePackInCore },           \
+    { .func = (void (*)(void)) serializeUnpackInCore },         \
+    { .func = (void (*)(void)) fileOpen_serial },               \
+    { .func = (void (*)(void)) fileWrite },                     \
+    { .func = (void (*)(void)) fileClose_serial },              \
+    { .func = (void (*)(void)) cdiStreamOpenDefaultDelegate },  \
+    { .func = (void (*)(void)) cdiStreamDefVlist_ },            \
+    { .func = (void (*)(void)) cdiStreamSetupVlist_ },          \
+    { .func = (void (*)(void)) cdiStreamWriteVar_ },            \
+    { .func = (void (*)(void)) cdiStreamWriteVarChunk_ },       \
+    { .func = (void (*)(void)) 0 },                             \
+    { .func = (void (*)(void)) 0 },                             \
+    { .func = (void (*)(void)) cdiStreamCloseDefaultDelegate }, \
+    { .func = (void (*)(void)) cdiStreamDefTimestep_ },         \
+    { .func = (void (*)(void)) cdiStreamSync_ },                \
+    { .func = (void (*)(void)) cdiVlistDestroy_ },              \
+    CDI_NETCDF_SWITCHES                                         \
+    }
+// clang-format on
+
+#if defined(SX) || defined(__cplusplus)
+static const union namespaceSwitchValue defaultSwitches_[NUM_NAMESPACE_SWITCH] = defaultSwitches;
+#endif
+
+enum namespaceStatus
+{
+  NAMESPACE_STATUS_INUSE,
+  NAMESPACE_STATUS_UNUSED,
+};
+
+static union namespaceSwitchValue initialSwitches[NUM_NAMESPACE_SWITCH] = defaultSwitches;
+
+static struct Namespace
+{
+  enum namespaceStatus resStage;
+  unsigned numSwitches;
+  union namespaceSwitchValue *switches;
+} initialNamespace = { .resStage = NAMESPACE_STATUS_INUSE, .numSwitches = NUM_NAMESPACE_SWITCH, .switches = initialSwitches };
+
+static struct Namespace *namespaces = &initialNamespace;
+
+static unsigned namespacesSize = 1;
+
+#if defined(HAVE_LIBPTHREAD)
+#include <pthread.h>
+
+static pthread_once_t namespaceOnce = PTHREAD_ONCE_INIT;
+static pthread_mutex_t namespaceMutex;
+
+static void
+namespaceInitialize(void)
+{
+  pthread_mutexattr_t ma;
+  pthread_mutexattr_init(&ma);
+  pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
+  pthread_mutex_init(&namespaceMutex, &ma);
+  pthread_mutexattr_destroy(&ma);
+}
+
+#define NAMESPACE_LOCK() pthread_mutex_lock(&namespaceMutex)
+#define NAMESPACE_UNLOCK() pthread_mutex_unlock(&namespaceMutex)
+#define NAMESPACE_INIT() pthread_once(&namespaceOnce, namespaceInitialize)
+
+#else
+
+#define NAMESPACE_INIT() \
+  do                     \
+    {                    \
+    }                    \
+  while (0)
+#define NAMESPACE_LOCK()
+#define NAMESPACE_UNLOCK()
+
+#endif
+
+enum
+{
+  intbits = sizeof(int) * CHAR_BIT,
+  nspbits = 4,
+  idxbits = intbits - nspbits,
+  nspmask = (int) ((((unsigned) 1 << nspbits) - 1) << idxbits),
+  idxmask = (1 << idxbits) - 1,
+};
+
+enum
+{
+  NUM_NAMESPACES = 1 << nspbits,
+  NUM_IDX = 1 << idxbits,
+};
+
+int
+namespaceIdxEncode(namespaceTuple_t tin)
+{
+  xassert(tin.nsp < NUM_NAMESPACES && tin.idx < NUM_IDX);
+  return (tin.nsp << idxbits) + tin.idx;
+}
+
+int
+namespaceIdxEncode2(int nsp, int idx)
+{
+  xassert(nsp < NUM_NAMESPACES && idx < NUM_IDX);
+  return (nsp << idxbits) + idx;
+}
+
+namespaceTuple_t
+namespaceResHDecode(int resH)
+{
+  namespaceTuple_t tin;
+
+  tin.idx = resH & idxmask;
+  tin.nsp = (int) (((unsigned) (resH & nspmask)) >> idxbits);
+
+  return tin;
+}
+
+int
+namespaceNew(void)
+{
+  int newNamespaceID = -1;
+  NAMESPACE_INIT();
+  NAMESPACE_LOCK();
+  if (namespacesSize > nNamespaces)
+    {
+      /* namespace is already available and only needs reinitialization */
+      for (unsigned i = 0; i < namespacesSize; ++i)
+        if (namespaces[i].resStage == NAMESPACE_STATUS_UNUSED)
+          {
+            newNamespaceID = (int) i;
+            break;
+          }
+    }
+  else if (namespacesSize == 1)
+    {
+      /* make room for additional namespace */
+      struct Namespace *newNameSpaces = (struct Namespace *) Malloc(((size_t) namespacesSize + 1) * sizeof(namespaces[0]));
+      memcpy(newNameSpaces, namespaces, sizeof(namespaces[0]));
+      namespaces = newNameSpaces;
+      ++namespacesSize;
+      newNamespaceID = 1;
+    }
+  else if (namespacesSize < NUM_NAMESPACES)
+    {
+      /* make room for additional namespace */
+      newNamespaceID = (int) namespacesSize;
+      namespaces = (struct Namespace *) Realloc(namespaces, ((size_t) namespacesSize + 1) * sizeof(namespaces[0]));
+      ++namespacesSize;
+    }
+  else /* implicit: namespacesSize >= NUM_NAMESPACES */
+    {
+      NAMESPACE_UNLOCK();
+      return -1;
+    }
+  xassert(newNamespaceID >= 0 && newNamespaceID < NUM_NAMESPACES);
+  ++nNamespaces;
+  namespaces[newNamespaceID].resStage = NAMESPACE_STATUS_INUSE;
+  namespaces[newNamespaceID].numSwitches = NUM_NAMESPACE_SWITCH;
+  enum
+  {
+    initialNSSWSize = sizeof(union namespaceSwitchValue) * NUM_NAMESPACE_SWITCH
+  };
+  namespaces[newNamespaceID].switches = (union namespaceSwitchValue *) Malloc(initialNSSWSize);
+#if defined(SX) || defined(__cplusplus)
+  memcpy(namespaces[newNamespaceID].switches, defaultSwitches_, initialNSSWSize);
+#else
+  memcpy(namespaces[newNamespaceID].switches, (union namespaceSwitchValue[NUM_NAMESPACE_SWITCH]) defaultSwitches, initialNSSWSize);
+#endif
+  reshListCreate(newNamespaceID);
+  NAMESPACE_UNLOCK();
+  return newNamespaceID;
+}
+
+void
+namespaceDelete(int namespaceID)
+{
+  NAMESPACE_INIT();
+  NAMESPACE_LOCK();
+  xassert(namespaceID >= 0 && (unsigned) namespaceID < namespacesSize && nNamespaces);
+  reshListDestruct(namespaceID);
+  if (namespaces[namespaceID].switches != initialSwitches) Free(namespaces[namespaceID].switches);
+  namespaces[namespaceID].resStage = NAMESPACE_STATUS_UNUSED;
+  --nNamespaces;
+  NAMESPACE_UNLOCK();
+}
+
+int
+namespaceGetNumber(void)
+{
+  return (int) nNamespaces;
+}
+
+void
+namespaceSetActive(int nId)
+{
+  xassert((unsigned) nId < namespacesSize && namespaces[nId].resStage != NAMESPACE_STATUS_UNUSED);
+  activeNamespace = nId;
+}
+
+int
+namespaceGetActive(void)
+{
+  return activeNamespace;
+}
+
+int
+namespaceAdaptKey(int originResH, int originNamespace)
+{
+  if (originResH == CDI_UNDEFID) return CDI_UNDEFID;
+
+  namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) };
+  xassert(tin.nsp == originNamespace);
+
+  int nsp = namespaceGetActive();
+
+  return namespaceIdxEncode2(nsp, tin.idx);
+}
+
+int
+namespaceAdaptKey2(int originResH)
+{
+
+  if (originResH == CDI_UNDEFID) return CDI_UNDEFID;
+
+  namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) };
+  int nsp = namespaceGetActive();
+  return namespaceIdxEncode2(nsp, tin.idx);
+}
+
+void
+namespaceSwitchSet(int sw, union namespaceSwitchValue value)
+{
+  xassert(sw > NSSWITCH_NO_SUCH_SWITCH);
+  int nsp = namespaceGetActive();
+  NAMESPACE_LOCK();
+  if (namespaces[nsp].numSwitches <= (unsigned) sw)
+    {
+      if (namespaces[nsp].switches != initialSwitches)
+        namespaces[nsp].switches
+            = (union namespaceSwitchValue *) Realloc(namespaces[nsp].switches, ((unsigned) sw + 1) * sizeof value);
+      else
+        {
+          void *temp = Malloc(((unsigned) sw + 1) * sizeof value);
+          memcpy(temp, (void *) namespaces[nsp].switches, namespaces[nsp].numSwitches * sizeof value);
+          namespaces[nsp].switches = (union namespaceSwitchValue *) temp;
+        }
+      namespaces[nsp].numSwitches = (unsigned) sw + 1;
+    }
+  namespaces[nsp].switches[sw] = value;
+  NAMESPACE_UNLOCK();
+}
+
+union namespaceSwitchValue
+namespaceSwitchGet(int sw)
+{
+  int nsp = namespaceGetActive();
+  xassert(sw > NSSWITCH_NO_SUCH_SWITCH && (unsigned) sw < namespaces[nsp].numSwitches);
+  NAMESPACE_LOCK();
+  union namespaceSwitchValue sw_val = namespaces[nsp].switches[sw];
+  NAMESPACE_UNLOCK();
+  return sw_val;
+}
+
+int
+cdiNamespaceSwitchNewKey(void)
+{
+  static unsigned reservedKeys = 0;
+#if defined(HAVE_LIBPTHREAD)
+  static pthread_mutex_t keyMutex = PTHREAD_MUTEX_INITIALIZER;
+  pthread_mutex_lock(&keyMutex);
+#endif
+  if (reservedKeys >= INT_MAX - NUM_NAMESPACE_SWITCH - 1) Error("pool of available namespace switch keys exhausted!");
+  int newKey = (int) (reservedKeys++) + NUM_NAMESPACE_SWITCH;
+#if defined(HAVE_LIBPTHREAD)
+  pthread_mutex_unlock(&keyMutex);
+#endif
+  return newKey;
+}
+
+void
+cdiReset(void)
+{
+  NAMESPACE_INIT();
+  NAMESPACE_LOCK();
+  for (unsigned namespaceID = 0; namespaceID < namespacesSize; ++namespaceID)
+    if (namespaces[namespaceID].resStage != NAMESPACE_STATUS_UNUSED) namespaceDelete((int) namespaceID);
+  if (namespaces != &initialNamespace)
+    {
+      Free(namespaces);
+      namespaces = &initialNamespace;
+      namespaces[0].resStage = NAMESPACE_STATUS_UNUSED;
+    }
+  namespacesSize = 1;
+  nNamespaces = 0;
+  NAMESPACE_UNLOCK();
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+
+void
+cdiRefObject_construct(CdiReferencedObject *me)
+{
+  me->destructor = cdiRefObject_destruct;
+  me->refCount = 1;
+}
+
+void
+cdiRefObject_retain(CdiReferencedObject *me)
+{
+  size_t oldCount = me->refCount++;
+  xassert(oldCount && "A reference counted object was used after it was destructed.");
+}
+
+void
+cdiRefObject_release(CdiReferencedObject *me)
+{
+  size_t oldCount = me->refCount--;
+  xassert(oldCount && "A reference counted object was released too often.");
+  if (oldCount == 1)
+    {
+      me->destructor(me);
+      Free(me);
+    }
+}
+
+void
+cdiRefObject_destruct(CdiReferencedObject *me)
+{
+  (void) me;
+  /* Empty for now, but that's no reason not to call it! */
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#if defined(HAVE_EXECINFO_H)
+#include <execinfo.h>
+#endif
+
+static void
+show_stackframe(void)
+{
+#if defined HAVE_EXECINFO_H && defined backtrace_size_t && defined HAVE_BACKTRACE
+  void *trace[16];
+  backtrace_size_t trace_size = backtrace(trace, 16);
+  char **messages = backtrace_symbols(trace, trace_size);
+
+  fprintf(stderr, "[bt] Execution path:\n");
+  if (messages)
+    {
+      for (backtrace_size_t i = 0; i < trace_size; ++i) fprintf(stderr, "[bt] %s\n", messages[i]);
+      free(messages);
+    }
+#endif
+}
+
+
+enum
+{
+  MIN_LIST_SIZE = 128
+};
+
+static void listInitialize(void);
+
+typedef struct listElem
+{
+  union
+  {
+    /* free-list management data */
+    struct
+    {
+      int next, prev;
+    } free;
+    /* holding an actual value */
+    struct
+    {
+      const resOps *ops;
+      void *val;  // ptr
+    } v;
+  } res;
+  int status;
+} listElem_t;
+
+struct resHList_t
+{
+  int size, freeHead, hasDefaultRes;
+  listElem_t *resources;
+};
+
+static struct resHList_t *resHList;
+
+static int resHListSize = 0;
+
+#if defined(HAVE_LIBPTHREAD)
+#include <pthread.h>
+
+static pthread_once_t listInitThread = PTHREAD_ONCE_INIT;
+static pthread_mutex_t listMutex;
+
+#define LIST_LOCK() pthread_mutex_lock(&listMutex)
+#define LIST_UNLOCK() pthread_mutex_unlock(&listMutex)
+#define LIST_INIT(init0)                                                       \
+  do                                                                           \
+    {                                                                          \
+      pthread_once(&listInitThread, listInitialize);                           \
+      pthread_mutex_lock(&listMutex);                                          \
+      if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \
+      pthread_mutex_unlock(&listMutex);                                        \
+    }                                                                          \
+  while (0)
+
+#else
+
+static int listInit = 0;
+
+#define LIST_LOCK()
+#define LIST_UNLOCK()
+#define LIST_INIT(init0)                                                           \
+  do                                                                               \
+    {                                                                              \
+      if (!listInit)                                                               \
+        {                                                                          \
+          listInitialize();                                                        \
+          if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \
+          listInit = 1;                                                            \
+        }                                                                          \
+    }                                                                              \
+  while (0)
+
+#endif
+
+#ifdef CDI_CHECK_RESOURCE_LISTS
+static void
+checkListLinear(const char *caller, int nsp)
+{
+  const listElem_t *restrict r = resHList[nsp].resources;
+  for (int i = 0; i < resHList[nsp].size; i++)
+    {
+      if (r[i].status != RESH_UNUSED) continue;
+
+      int prev = r[i].res.free.prev;
+      int next = r[i].res.free.next;
+
+      if (prev < -1 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid back-link in free-list!");
+      if (prev != -1)
+        {
+          if (r[prev].res.free.next != i) xabortC(caller, "error: found incomplete back link in free-list!");
+          if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use back link element in free-list!");
+        }
+
+      if (next < -1 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid forward-link in free-list!");
+      if (next != -1)
+        {
+          if (r[next].res.free.prev != i) xabortC(caller, "error: found incomplete forward link in free-list!");
+          if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!");
+        }
+    }
+}
+
+static void
+checkListFwdBwd(const char *caller, int nsp)
+{
+  const listElem_t *restrict r = resHList[nsp].resources;
+
+  int next = resHList[nsp].freeHead, loopLimit = resHList[nsp].size + 1;
+  int i = 0, cur = -1;
+  while (next != -1)
+    {
+      if (next < 0 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!");
+      if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!");
+
+      cur = next;
+      next = r[next].res.free.next;
+
+      if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!");
+    }
+
+  i = 0;
+  int prev = cur;
+  while (prev != -1)
+    {
+      if (prev < 0 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!");
+      if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use prev element in free-list!");
+
+      cur = prev;
+      prev = r[prev].res.free.prev;
+
+      if (prev == -1) break;
+
+      if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!");
+    }
+}
+
+static void
+checkList(const char *caller, int nsp)
+{
+  checkListLinear(caller, nsp);
+  checkListFwdBwd(caller, nsp);
+}
+#else
+#define checkList(caller, nsp)
+#endif
+
+/**************************************************************/
+
+static void
+listInitResources(int nsp)
+{
+  xassert(nsp < resHListSize && nsp >= 0);
+  int size = resHList[nsp].size = MIN_LIST_SIZE;
+  xassert(resHList[nsp].resources == NULL);
+  resHList[nsp].resources = (listElem_t *) calloc(MIN_LIST_SIZE, sizeof(listElem_t));
+  listElem_t *p = resHList[nsp].resources;
+
+  for (int i = 0; i < size; i++)
+    {
+      p[i].res.free.next = i + 1;
+      p[i].res.free.prev = i - 1;
+      p[i].status = RESH_UNUSED;
+    }
+  p[size - 1].res.free.next = -1;
+  resHList[nsp].freeHead = 0;
+
+  checkList(__func__, nsp);
+
+  int oldNsp = namespaceGetActive();
+  namespaceSetActive(nsp);
+  instituteDefaultEntries();
+  modelDefaultEntries();
+  namespaceSetActive(oldNsp);
+}
+
+static inline void
+reshListClearEntry(int i)
+{
+  resHList[i].size = 0;
+  resHList[i].resources = NULL;
+  resHList[i].freeHead = -1;
+}
+
+void
+reshListCreate(int namespaceID)
+{
+  LIST_INIT(namespaceID != 0);
+  LIST_LOCK();
+  if (resHListSize <= namespaceID)
+    {
+      resHList = (struct resHList_t *) realloc(resHList, (size_t) (namespaceID + 1) * sizeof(resHList[0]));
+      for (int i = resHListSize; i <= namespaceID; ++i) reshListClearEntry(i);
+      resHListSize = namespaceID + 1;
+    }
+  listInitResources(namespaceID);
+  LIST_UNLOCK();
+}
+
+/**************************************************************/
+static void reshRemove_(int nsp, int idx, const char *caller);
+
+void
+reshListDestruct(int namespaceID)
+{
+  LIST_LOCK();
+  xassert(resHList && namespaceID >= 0 && namespaceID < resHListSize);
+  int callerNamespaceID = namespaceGetActive();
+  namespaceSetActive(namespaceID);
+  if (resHList[namespaceID].resources)
+    {
+      for (int j = 0; j < resHList[namespaceID].size; j++)
+        {
+          listElem_t *listElem = resHList[namespaceID].resources + j;
+          if (listElem->status & RESH_IN_USE_BIT)
+            {
+              listElem->res.v.ops->valDestroy(listElem->res.v.val);
+              reshRemove_(namespaceID, j, __func__);
+            }
+        }
+      free(resHList[namespaceID].resources);
+      resHList[namespaceID].resources = NULL;
+      reshListClearEntry(namespaceID);
+    }
+  if (resHList[callerNamespaceID].resources) namespaceSetActive(callerNamespaceID);
+  LIST_UNLOCK();
+}
+
+static void
+listDestroy(void)
+{
+  LIST_LOCK();
+  for (int i = resHListSize; i > 0; --i)
+    if (resHList[i - 1].resources) namespaceDelete(i - 1);
+  resHListSize = 0;
+  free(resHList);
+  resHList = NULL;
+  cdiReset();
+  LIST_UNLOCK();
+}
+
+/**************************************************************/
+
+static void
+listInitialize(void)
+{
+#if defined(HAVE_LIBPTHREAD)
+  pthread_mutexattr_t ma;
+  pthread_mutexattr_init(&ma);
+  pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
+  /* initialize global API mutex lock */
+  pthread_mutex_init(&listMutex, &ma);
+  pthread_mutexattr_destroy(&ma);
+#endif
+  /* file is special and has its own table, which needs to be
+   * created, before we register the listDestroy exit handler */
+  {
+    int null_id;
+    null_id = fileOpen_serial("/dev/null", "r");
+    if (null_id != -1) fileClose_serial(null_id);
+  }
+  atexit(listDestroy);
+}
+
+/**************************************************************/
+
+static void
+listSizeExtend(void)
+{
+  int nsp = namespaceGetActive();
+  checkList(__func__, nsp);
+  int oldSize = resHList[nsp].size;
+  size_t newListSize = (size_t) oldSize + MIN_LIST_SIZE;
+
+  resHList[nsp].resources = (listElem_t *) realloc(resHList[nsp].resources, newListSize * sizeof(listElem_t));
+
+  listElem_t *r = resHList[nsp].resources;
+  for (size_t i = (size_t) oldSize; i < newListSize; ++i)
+    {
+      r[i].res.free.next = (int) i + 1;
+      r[i].res.free.prev = (int) i - 1;
+      r[i].status = RESH_UNUSED;
+    }
+
+  if (resHList[nsp].freeHead != -1) r[resHList[nsp].freeHead].res.free.prev = (int) newListSize - 1;
+  r[newListSize - 1].res.free.next = resHList[nsp].freeHead;
+  r[oldSize].res.free.prev = -1;
+  resHList[nsp].freeHead = oldSize;
+  resHList[nsp].size = (int) newListSize;
+
+  checkList(__func__, nsp);
+}
+
+/**************************************************************/
+
+static void
+reshPut_(int nsp, int entry, void *p, const resOps *ops)
+{
+  checkList(__func__, nsp);
+
+  listElem_t *newListElem = resHList[nsp].resources + entry;
+  int next = newListElem->res.free.next, prev = newListElem->res.free.prev;
+  if (next != -1) resHList[nsp].resources[next].res.free.prev = prev;
+  if (prev != -1)
+    resHList[nsp].resources[prev].res.free.next = next;
+  else
+    resHList[nsp].freeHead = next;
+  newListElem->res.v.val = p;
+  newListElem->res.v.ops = ops;
+  newListElem->status = RESH_DESYNC_IN_USE;
+
+  checkList(__func__, nsp);
+}
+
+int
+reshPut(void *p, const resOps *ops)
+{
+  xassert(p && ops);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  if (resHList[nsp].freeHead == -1) listSizeExtend();
+  int entry = resHList[nsp].freeHead;
+  cdiResH resH = namespaceIdxEncode2(nsp, entry);
+  reshPut_(nsp, entry, p, ops);
+
+  LIST_UNLOCK();
+
+  return resH;
+}
+
+/**************************************************************/
+
+static void
+reshRemove_(int nsp, int idx, const char *caller)
+{
+  checkList(__func__, nsp);
+
+  int curFree = resHList[nsp].freeHead;
+  listElem_t *r = resHList[nsp].resources;
+  if (!(r[idx].status & RESH_IN_USE_BIT)) xabortC(caller, "Attempting to remove an item that is already removed.");
+  r[idx].res.free.next = curFree;
+  r[idx].res.free.prev = -1;
+  if (curFree != -1) r[curFree].res.free.prev = idx;
+  r[idx].status = RESH_DESYNC_DELETED;
+  resHList[nsp].freeHead = idx;
+
+  checkList(__func__, nsp);
+}
+
+void
+reshDestroy(cdiResH resH)
+{
+  int nsp;
+  namespaceTuple_t nspT;
+
+  LIST_LOCK();
+
+  nsp = namespaceGetActive();
+
+  nspT = namespaceResHDecode(resH);
+
+  listElem_t *r = resHList[nsp].resources + nspT.idx;
+
+  xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size && r->res.v.ops);
+
+  if (r->status & RESH_IN_USE_BIT)
+    {
+      r->res.v.ops->valDestroy(r->res.v.val);
+      reshRemove_(nsp, nspT.idx, __func__);
+    }
+
+  LIST_UNLOCK();
+}
+
+void
+reshRemove(cdiResH resH, const resOps *ops)
+{
+  int nsp;
+  namespaceTuple_t nspT;
+
+  LIST_LOCK();
+
+  nsp = namespaceGetActive();
+
+  nspT = namespaceResHDecode(resH);
+
+  xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size
+          && (resHList[nsp].resources[nspT.idx].status & RESH_IN_USE_BIT) && resHList[nsp].resources[nspT.idx].res.v.ops
+          && resHList[nsp].resources[nspT.idx].res.v.ops == ops);
+
+  reshRemove_(nsp, nspT.idx, __func__);
+
+  LIST_UNLOCK();
+}
+
+/**************************************************************/
+
+void
+reshReplace(cdiResH resH, void *p, const resOps *ops)
+{
+  xassert(p && ops);
+  LIST_INIT(1);
+  LIST_LOCK();
+  int nsp = namespaceGetActive();
+
+  checkList(__func__, nsp);
+
+  namespaceTuple_t nspT = namespaceResHDecode(resH);
+  while (resHList[nsp].size <= nspT.idx) listSizeExtend();
+  listElem_t *q = resHList[nsp].resources + nspT.idx;
+  if (q->status & RESH_IN_USE_BIT)
+    {
+      q->res.v.ops->valDestroy(q->res.v.val);
+      reshRemove_(nsp, nspT.idx, __func__);
+    }
+  reshPut_(nsp, nspT.idx, p, ops);
+  LIST_UNLOCK();
+
+  checkList(__func__, nsp);
+}
+
+static listElem_t *
+reshGetElem(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops)
+{
+  listElem_t *listElem;
+  xassert(ops);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  namespaceTuple_t nspT = namespaceResHDecode(resH);
+  assert(nspT.idx >= 0);
+
+  if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size)
+    {
+      listElem = resHList[nsp].resources + nspT.idx;
+      LIST_UNLOCK();
+    }
+  else
+    {
+      LIST_UNLOCK();
+      show_stackframe();
+
+      if (resH == CDI_UNDEFID)
+        {
+          xabortC(caller,
+                  "Error while trying to resolve the ID \"%s\" in `%s()`: the value is CDI_UNDEFID (= %d).\n\tThis is most likely "
+                  "the result of a failed earlier call. Please check the IDs returned by CDI.",
+                  expressionString, caller, resH);
+        }
+      else
+        {
+          xabortC(caller,
+                  "Error while trying to resolve the ID \"%s\" in `%s()`: the value is garbage (= %d, which resolves to namespace "
+                  "= %d, index = %d).\n\tThis is either the result of using an uninitialized variable,\n\tof using a value as an "
+                  "ID that is not an ID,\n\tor of using an ID after it has been invalidated.",
+                  expressionString, caller, resH, nspT.nsp, nspT.idx);
+        }
+    }
+
+  if (!(listElem && listElem->res.v.ops == ops))
+    {
+      show_stackframe();
+
+      xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: list element not found. The failed ID is %d",
+              expressionString, caller, (int) resH);
+    }
+
+  return listElem;
+}
+
+void *
+reshGetValue(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops)
+{
+  return reshGetElem(caller, expressionString, resH, ops)->res.v.val;
+}
+
+/**************************************************************/
+
+void
+reshGetResHListOfType(unsigned numIDs, int resHs[], const resOps *ops)
+{
+  xassert(resHs && ops);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+  unsigned j = 0;
+  for (int i = 0; i < resHList[nsp].size && j < numIDs; i++)
+    if ((resHList[nsp].resources[i].status & RESH_IN_USE_BIT) && resHList[nsp].resources[i].res.v.ops == ops)
+      resHs[j++] = namespaceIdxEncode2(nsp, i);
+
+  LIST_UNLOCK();
+}
+
+enum cdiApplyRet
+cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data)
+{
+  xassert(func);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+  enum cdiApplyRet ret = CDI_APPLY_GO_ON;
+  for (int i = 0; i < resHList[nsp].size && ret > 0; ++i)
+    if (resHList[nsp].resources[i].status & RESH_IN_USE_BIT)
+      ret = func(namespaceIdxEncode2(nsp, i), resHList[nsp].resources[i].res.v.val, resHList[nsp].resources[i].res.v.ops, data);
+  LIST_UNLOCK();
+  return ret;
+}
+
+enum cdiApplyRet
+cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data)
+{
+  xassert(p && func);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+  enum cdiApplyRet ret = CDI_APPLY_GO_ON;
+  listElem_t *r = resHList[nsp].resources;
+  for (int i = 0; i < resHList[nsp].size && ret > 0; ++i)
+    if ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == p) ret = func(namespaceIdxEncode2(nsp, i), r[i].res.v.val, data);
+  LIST_UNLOCK();
+  return ret;
+}
+
+/**************************************************************/
+
+unsigned
+reshCountType(const resOps *ops)
+{
+  unsigned countType = 0;
+
+  xassert(ops);
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  listElem_t *r = resHList[nsp].resources;
+  size_t len = (size_t) resHList[nsp].size;
+  for (size_t i = 0; i < len; i++) countType += ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == ops);
+
+  LIST_UNLOCK();
+
+  return countType;
+}
+
+/**************************************************************/
+
+int
+reshResourceGetPackSize_intern(int resH, const resOps *ops, void *context, const char *caller, const char *expressionString)
+{
+  listElem_t *curr = reshGetElem(caller, expressionString, resH, ops);
+  return curr->res.v.ops->valGetPackSize(curr->res.v.val, context);
+}
+
+void
+reshPackResource_intern(int resH, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller,
+                        const char *expressionString)
+{
+  listElem_t *curr = reshGetElem(caller, expressionString, resH, ops);
+  curr->res.v.ops->valPack(curr->res.v.val, buf, buf_size, position, context);
+}
+
+enum
+{
+  resHPackHeaderNInt = 2,
+  resHDeleteNInt = 2,
+};
+
+static int
+getPackBufferSize(void *context)
+{
+  int intpacksize, packBufferSize = 0;
+
+  int nsp = namespaceGetActive();
+
+  /* pack start marker, namespace and sererator marker */
+  packBufferSize += resHPackHeaderNInt * (intpacksize = serializeGetSize(1, CDI_DATATYPE_INT, context));
+
+  /* pack resources, type marker and seperator marker */
+  listElem_t *r = resHList[nsp].resources;
+  for (int i = 0; i < resHList[nsp].size; i++)
+    if (r[i].status & RESH_SYNC_BIT)
+      {
+        if (r[i].status == RESH_DESYNC_DELETED)
+          {
+            packBufferSize += resHDeleteNInt * intpacksize;
+          }
+        else if (r[i].status == RESH_DESYNC_IN_USE)
+          {
+            xassert(r[i].res.v.ops);
+            /* packed resource plus 1 int for type */
+            packBufferSize += r[i].res.v.ops->valGetPackSize(r[i].res.v.val, context) + intpacksize;
+          }
+      }
+  /* end marker */
+  packBufferSize += intpacksize;
+
+  return packBufferSize;
+}
+
+/**************************************************************/
+
+void
+reshPackBufferDestroy(char **buffer)
+{
+  if (buffer) free(*buffer);
+}
+
+/**************************************************************/
+
+int
+reshGetTxCode(cdiResH resH)
+{
+  int type = 0;
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  namespaceTuple_t nspT = namespaceResHDecode(resH);
+  assert(nspT.idx >= 0);
+
+  if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size)
+    {
+      listElem_t *listElem = resHList[nsp].resources + nspT.idx;
+      xassert(listElem->res.v.ops);
+      type = listElem->res.v.ops->valTxCode(listElem->res.v.val);
+    }
+
+  LIST_UNLOCK();
+
+  return type;
+}
+
+/**************************************************************/
+
+int
+reshPackBufferCreate(char **packBuffer, int *packBufferSize, void *context)
+{
+  int packBufferPos = 0;
+  int end = END;
+
+  xassert(packBuffer);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  int pBSize = *packBufferSize = getPackBufferSize(context);
+  char *pB = *packBuffer = (char *) malloc((size_t) pBSize);
+
+  {
+    int header[resHPackHeaderNInt] = { START, nsp };
+    serializePack(header, resHPackHeaderNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context);
+  }
+
+  listElem_t *r = resHList[nsp].resources;
+  for (int i = 0; i < resHList[nsp].size; i++)
+    if (r[i].status & RESH_SYNC_BIT)
+      {
+        if (r[i].status == RESH_DESYNC_DELETED)
+          {
+            int temp[resHDeleteNInt] = { RESH_DELETE, namespaceIdxEncode2(nsp, i) };
+            serializePack(temp, resHDeleteNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context);
+          }
+        else
+          {
+            listElem_t *curr = r + i;
+            xassert(curr->res.v.ops);
+            int type = curr->res.v.ops->valTxCode(curr->res.v.val);
+            if (!type) continue;
+            serializePack(&type, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context);
+            curr->res.v.ops->valPack(curr->res.v.val, pB, pBSize, &packBufferPos, context);
+          }
+        r[i].status &= ~RESH_SYNC_BIT;
+      }
+
+  LIST_UNLOCK();
+
+  serializePack(&end, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context);
+
+  return packBufferPos;
+}
+
+/**************************************************************/
+
+/* for thread safety this feature would have to be integrated in reshPut */
+
+void
+reshSetStatus(cdiResH resH, const resOps *ops, int status)
+{
+  int nsp;
+  namespaceTuple_t nspT;
+  listElem_t *listElem;
+
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  nsp = namespaceGetActive();
+
+  nspT = namespaceResHDecode(resH);
+
+  xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size);
+
+  xassert(resHList[nsp].resources);
+  listElem = resHList[nsp].resources + nspT.idx;
+
+  xassert((!ops || (listElem->res.v.ops == ops)) && (listElem->status & RESH_IN_USE_BIT) == (status & RESH_IN_USE_BIT));
+
+  listElem->status = status;
+
+  LIST_UNLOCK();
+}
+
+/**************************************************************/
+
+int
+reshGetStatus(cdiResH resH, const resOps *ops)
+{
+  LIST_INIT(1);
+
+  LIST_LOCK();
+
+  int nsp = namespaceGetActive();
+
+  namespaceTuple_t nspT = namespaceResHDecode(resH);
+
+  xassert(nspT.nsp == nsp && nspT.idx >= 0);
+
+  int status = RESH_UNUSED;
+  if (nspT.idx < resHList[nsp].size)
+    {
+      listElem_t *listElem = resHList[nsp].resources + nspT.idx;
+      const resOps *elemOps = listElem->res.v.ops;
+      xassert(listElem && (!(listElem->status & RESH_IN_USE_BIT) || elemOps == ops || !ops));
+      status = listElem->status;
+    }
+
+  LIST_UNLOCK();
+
+  return status;
+}
+
+/**************************************************************/
+
+void
+reshLock(void)
+{
+  LIST_LOCK();
+}
+
+/**************************************************************/
+
+void
+reshUnlock(void)
+{
+  LIST_UNLOCK();
+}
+
+/**************************************************************/
+
+int
+reshListCompare(int nsp0, int nsp1)
+{
+  LIST_INIT(1);
+  LIST_LOCK();
+
+  xassert(resHListSize > nsp0 && resHListSize > nsp1 && nsp0 >= 0 && nsp1 >= 0);
+
+  int valCompare = 0;
+  int i, listSizeMin = (resHList[nsp0].size <= resHList[nsp1].size) ? resHList[nsp0].size : resHList[nsp1].size;
+  listElem_t *resources0 = resHList[nsp0].resources, *resources1 = resHList[nsp1].resources;
+  for (i = 0; i < listSizeMin; i++)
+    {
+      int occupied0 = (resources0[i].status & RESH_IN_USE_BIT) != 0, occupied1 = (resources1[i].status & RESH_IN_USE_BIT) != 0;
+      /* occupation mismatch ? */
+      int diff = occupied0 ^ occupied1;
+      valCompare |= (diff << cdiResHListOccupationMismatch);
+      if (!diff && occupied0)
+        {
+          /* both occupied, do resource types match? */
+          diff = (resources0[i].res.v.ops != resources1[i].res.v.ops || resources0[i].res.v.ops == NULL);
+          valCompare |= (diff << cdiResHListResourceTypeMismatch);
+          if (!diff)
+            {
+              /* types match, does content match also? */
+              diff = resources0[i].res.v.ops->valCompare(resources0[i].res.v.val, resources1[i].res.v.val);
+              valCompare |= (diff << cdiResHListResourceContentMismatch);
+            }
+        }
+    }
+  /* find resources in nsp 0 beyond end of nsp 1 */
+  for (int j = listSizeMin; j < resHList[nsp0].size; ++j)
+    valCompare |= (((resources0[j].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch);
+  /* find resources in nsp 1 beyond end of nsp 0 */
+  for (; i < resHList[nsp1].size; ++i)
+    valCompare |= (((resources1[i].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch);
+
+  LIST_UNLOCK();
+
+  return valCompare;
+}
+
+/**************************************************************/
+
+void
+reshListPrint(FILE *fp)
+{
+  int i, j, temp;
+  listElem_t *curr;
+
+  LIST_INIT(1);
+
+  temp = namespaceGetActive();
+
+  fprintf(fp, "\n\n##########################################\n#\n#  print "
+              "global resource list \n#\n");
+
+  for (i = 0; i < namespaceGetNumber(); i++)
+    {
+      namespaceSetActive(i);
+
+      fprintf(fp, "\n");
+      fprintf(fp, "##################################\n");
+      fprintf(fp, "#\n");
+      fprintf(fp, "# namespace=%d\n", i);
+      fprintf(fp, "#\n");
+      fprintf(fp, "##################################\n\n");
+
+      fprintf(fp, "resHList[%d].size=%d\n", i, resHList[i].size);
+
+      for (j = 0; j < resHList[i].size; j++)
+        {
+          curr = resHList[i].resources + j;
+          if (!(curr->status & RESH_IN_USE_BIT))
+            {
+              curr->res.v.ops->valPrint(curr->res.v.val, fp);
+              fprintf(fp, "\n");
+            }
+        }
+    }
+  fprintf(fp, "#\n#  end global resource list"
+              "\n#\n##########################################\n\n");
+
+  namespaceSetActive(temp);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <inttypes.h>
+#include <limits.h>
+#include <string.h>
+
+
+int
+serializeGetSize(int count, int datatype, void *context)
+{
+  int (*serialize_get_size_p)(int count, int datatype, void *context)
+      = (int (*)(int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_GET_SIZE).func;
+  return serialize_get_size_p(count, datatype, context);
+}
+
+void
+serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context)
+{
+  void (*serialize_pack_p)(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context)
+      = (void (*)(const void *, int, int, void *, int, int *, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_PACK).func;
+  serialize_pack_p(data, count, datatype, buf, buf_size, position, context);
+}
+
+void
+serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context)
+{
+  void (*serialize_unpack_p)(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context)
+      = (void (*)(const void *, int, int *, void *, int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_UNPACK).func;
+  serialize_unpack_p(buf, buf_size, position, data, count, datatype, context);
+}
+
+int
+serializeGetSizeInCore(int count, int datatype, void *context)
+{
+  int elemSize;
+  (void) context;
+  switch (datatype)
+    {
+    case CDI_DATATYPE_INT8: elemSize = sizeof(int8_t); break;
+    case CDI_DATATYPE_INT16: elemSize = sizeof(int16_t); break;
+    case CDI_DATATYPE_UINT32: elemSize = sizeof(uint32_t); break;
+    case CDI_DATATYPE_INT: elemSize = sizeof(int); break;
+    case CDI_DATATYPE_UINT: elemSize = sizeof(unsigned); break;
+    case CDI_DATATYPE_FLT:
+    case CDI_DATATYPE_FLT64: elemSize = sizeof(double); break;
+    case CDI_DATATYPE_TXT:
+    case CDI_DATATYPE_UCHAR: elemSize = 1; break;
+    case CDI_DATATYPE_LONG: elemSize = sizeof(long); break;
+    default: xabort("Unexpected datatype");
+    }
+  return count * elemSize;
+}
+
+void
+serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context)
+{
+  int size = serializeGetSize(count, datatype, context);
+  int pos = *position;
+  xassert(INT_MAX - pos >= size && buf_size - pos >= size);
+  memcpy((unsigned char *) buf + pos, data, (size_t) size);
+  pos += size;
+  *position = pos;
+}
+
+void
+serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context)
+{
+  int size = serializeGetSize(count, datatype, context);
+  int pos = *position;
+  xassert(INT_MAX - pos >= size && buf_size - pos >= size);
+  memcpy(data, (unsigned char *) buf + pos, (size_t) size);
+  pos += size;
+  *position = pos;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+
+enum
+{
+  SRV_HEADER_LEN = 8,
+};
+
+union SRV_HEADER
+{
+  int32_t i32[SRV_HEADER_LEN];
+  int64_t i64[SRV_HEADER_LEN];
+};
+
+static int initSrvLib = 0;
+static int srvDefaultHprec = 0;
+static int srvDefaultDprec = 0;
+
+// A version string.
+#undef LIBVERSION
+#define LIBVERSION 2.0.0
+#define XSTRING(x) #x
+#define STRING(x) XSTRING(x)
+static const char srv_libvers[] = STRING(LIBVERSION);
+
+const char *
+srvLibraryVersion(void)
+{
+  return srv_libvers;
+}
+
+static int SRV_Debug = 0;  // If set to 1, debugging
+
+void
+srvDebug(int debug)
+{
+  if (debug) Message("debug level %d", debug);
+  SRV_Debug = debug;
+}
+
+static void
+srvLibInit(void)
+{
+  const char *envName = "SRV_PRECISION";
+
+  char *envString = getenv(envName);
+  if (envString)
+    {
+      int nrun = (strlen(envString) == 2) ? 1 : 2;
+      int pos = 0;
+      while (nrun--)
+        {
+          switch (tolower((int) envString[pos]))
+            {
+            case 'i':
+              {
+                switch ((int) envString[pos + 1])
+                  {
+                  case '4': srvDefaultHprec = EXSE_PREC_FP32; break;
+                  case '8': srvDefaultHprec = EXSE_PREC_FP64; break;
+                  default: Warning("Invalid digit in %s: %s", envName, envString);
+                  }
+                break;
+              }
+            case 'r':
+              {
+                switch ((int) envString[pos + 1])
+                  {
+                  case '4': srvDefaultDprec = EXSE_PREC_FP32; break;
+                  case '8': srvDefaultDprec = EXSE_PREC_FP64; break;
+                  default: Warning("Invalid digit in %s: %s", envName, envString);
+                  }
+                break;
+              }
+            default:
+              {
+                Warning("Invalid character in %s: %s", envName, envString);
+                break;
+              }
+            }
+          pos += 2;
+        }
+    }
+
+  initSrvLib = 1;
+}
+
+static void
+srvInit(srvrec_t *srvp)
+{
+  srvp->checked = 0;
+  srvp->byteswap = 0;
+  srvp->hprec = 0;
+  srvp->dprec = 0;
+  srvp->datasize = 0;
+  srvp->buffersize = 0;
+  srvp->buffer = NULL;
+}
+
+void *
+srvNew(void)
+{
+  if (!initSrvLib) srvLibInit();
+
+  srvrec_t *srvp = (srvrec_t *) Malloc(sizeof(srvrec_t));
+  srvInit(srvp);
+
+  return (void *) srvp;
+}
+
+void
+srvDelete(void *srv)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+
+  if (srvp)
+    {
+      if (srvp->buffer) Free(srvp->buffer);
+      Free(srvp);
+    }
+}
+
+int
+srvCheckFiletype(int fileID, int *swap)
+{
+  size_t data = 0;
+  size_t dimx = 0, dimy = 0;
+  size_t fact = 0;
+  unsigned char buffer[72], *pbuf;
+
+  if (fileRead(fileID, buffer, 4) != 4) return 0;
+
+  size_t blocklen = (size_t) get_uint32(buffer);
+  size_t sblocklen = (size_t) get_swap_uint32(buffer);
+
+  if (SRV_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen);
+
+  // clang-format off
+  if (blocklen == 32)
+    {
+     *swap = 0;
+      fact = blocklen>>3;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+4*fact;      dimx = (size_t) get_uint32(pbuf);
+      pbuf = buffer+5*fact;      dimy = (size_t) get_uint32(pbuf);
+      pbuf = buffer+blocklen+4;  data = (size_t) get_uint32(pbuf);
+    }
+  else if (blocklen == 64)
+    {
+     *swap = 0;
+      fact = blocklen>>3;
+      if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0;
+      pbuf = buffer+4*fact;      dimx = (size_t) get_uint64(pbuf);
+      pbuf = buffer+5*fact;      dimy = (size_t) get_uint64(pbuf);
+      pbuf = buffer+blocklen+4;  data = (size_t) get_uint32(pbuf);
+    }
+  else if (sblocklen == 32)
+    {
+     *swap = 1;
+      fact = sblocklen>>3;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+4*fact;       dimx = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+5*fact;       dimy = (size_t) get_swap_uint32(pbuf);
+      pbuf = buffer+sblocklen+4;  data = (size_t) get_swap_uint32(pbuf);
+    }
+  else if (sblocklen == 64)
+    {
+     *swap = 1;
+      fact = sblocklen>>3;
+      if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0;
+      pbuf = buffer+4*fact;       dimx = (size_t) get_swap_uint64(pbuf);
+      pbuf = buffer+5*fact;       dimy = (size_t) get_swap_uint64(pbuf);
+      pbuf = buffer+sblocklen+4;  data = (size_t) get_swap_uint32(pbuf);
+    }
+  // clang-format on
+
+  fileRewind(fileID);
+
+  if (SRV_Debug) Message("swap = %d fact = %d", *swap, fact);
+  if (SRV_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data);
+
+  int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data);
+  return found;
+}
+
+int
+srvInqHeader(void *srv, int *header)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+
+  for (int i = 0; i < SRV_HEADER_LEN; i++) header[i] = srvp->header[i];
+
+  if (SRV_Debug) Message("datasize = %lu", srvp->datasize);
+
+  return 0;
+}
+
+int
+srvDefHeader(void *srv, const int *header)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+
+  for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = header[i];
+
+  srvp->datasize = (size_t) header[4] * (size_t) header[5];
+
+  if (SRV_Debug) Message("datasize = %zu", srvp->datasize);
+
+  return 0;
+}
+
+static int
+srvInqData(srvrec_t *srvp, int prec, void *data)
+{
+  int ierr = 0;
+  int byteswap = srvp->byteswap;
+  size_t datasize = srvp->datasize;
+  void *buffer = srvp->buffer;
+  int dprec = srvp->dprec;
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (byteswap) swap4byte(buffer, datasize);
+
+        if (dprec == prec)
+          memcpy(data, buffer, datasize * sizeof(float));
+        else
+          for (size_t i = 0; i < datasize; i++) ((double *) data)[i] = (double) ((float *) buffer)[i];
+
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (byteswap) swap8byte(buffer, datasize);
+
+        if (dprec == prec)
+          memcpy(data, buffer, datasize * sizeof(double));
+        else
+          for (size_t i = 0; i < datasize; i++) ((float *) data)[i] = (float) ((double *) buffer)[i];
+
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  return ierr;
+}
+
+int
+srvInqDataFP32(void *srv, float *data)
+{
+  return srvInqData((srvrec_t *) srv, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+srvInqDataFP64(void *srv, double *data)
+{
+  return srvInqData((srvrec_t *) srv, EXSE_PREC_FP64, (void *) data);
+}
+
+static int
+srvDefData(void *srv, int prec, const void *data)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+
+  int dprec = srvDefaultDprec ? srvDefaultDprec : srvp->dprec;
+  srvp->dprec = dprec ? dprec : prec;
+
+  int hprec = srvDefaultHprec ? srvDefaultHprec : srvp->hprec;
+  srvp->hprec = hprec ? hprec : dprec;
+
+  int *header = srvp->header;
+
+  size_t datasize = (size_t) header[4] * (size_t) header[5];
+  size_t blocklen = datasize * (size_t) dprec;
+
+  srvp->datasize = datasize;
+
+  if (srvp->buffersize != blocklen)
+    {
+      srvp->buffersize = blocklen;
+      srvp->buffer = Realloc(srvp->buffer, srvp->buffersize);
+    }
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        if (dprec == prec)
+          memcpy(srvp->buffer, data, datasize * sizeof(float));
+        else
+          for (size_t i = 0; i < datasize; i++) ((float *) srvp->buffer)[i] = (float) ((double *) data)[i];
+
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        if (dprec == prec)
+          memcpy(srvp->buffer, data, datasize * sizeof(double));
+        else
+          for (size_t i = 0; i < datasize; i++) ((double *) srvp->buffer)[i] = (double) ((float *) data)[i];
+
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  return 0;
+}
+
+int
+srvDefDataFP32(void *srv, const float *data)
+{
+  return srvDefData(srv, EXSE_PREC_FP32, (void *) data);
+}
+
+int
+srvDefDataFP64(void *srv, const double *data)
+{
+  return srvDefData(srv, EXSE_PREC_FP64, (void *) data);
+}
+
+int
+srvRead(int fileID, void *srv)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+  union SRV_HEADER tempheader;
+
+  if (!srvp->checked)
+    {
+      int status = srvCheckFiletype(fileID, &srvp->byteswap);
+      if (status == 0) Error("Not a SERVICE file!");
+      srvp->checked = 1;
+    }
+
+  int byteswap = srvp->byteswap;
+
+  // read header record
+  size_t blocklen = binReadF77Block(fileID, byteswap);
+
+  if (fileEOF(fileID)) return -1;
+
+  if (SRV_Debug) Message("blocklen = %lu", blocklen);
+
+  size_t hprec = blocklen / SRV_HEADER_LEN;
+
+  srvp->hprec = (int) hprec;
+
+  switch (hprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        binReadInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32);
+        for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i32[i];
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        binReadInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64);
+        for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i64[i];
+        break;
+      }
+    default:
+      {
+        Error("Unexpected header precision %d", hprec);
+        break;
+      }
+    }
+
+  size_t blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2);
+      if (blocklen2 != 0) return -1;
+    }
+
+  srvp->datasize = (size_t) srvp->header[4] * (size_t) srvp->header[5];
+
+  if (SRV_Debug) Message("datasize = %zu", srvp->datasize);
+
+  blocklen = binReadF77Block(fileID, byteswap);
+
+  if (srvp->buffersize < blocklen)
+    {
+      srvp->buffersize = blocklen;
+      srvp->buffer = Realloc(srvp->buffer, srvp->buffersize);
+    }
+
+  size_t dprec = blocklen / srvp->datasize;
+
+  srvp->dprec = (int) dprec;
+
+  if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64)
+    {
+      Warning("Unexpected data precision %d", dprec);
+      return -1;
+    }
+
+  fileRead(fileID, srvp->buffer, blocklen);
+
+  blocklen2 = binReadF77Block(fileID, byteswap);
+
+  if (blocklen2 != blocklen)
+    {
+      Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2);
+      if (blocklen2 != 0) return -1;
+    }
+
+  return 0;
+}
+
+void
+srvWrite(int fileID, void *srv)
+{
+  srvrec_t *srvp = (srvrec_t *) srv;
+  union SRV_HEADER tempheader;
+  int byteswap = srvp->byteswap;
+  int dprec = srvp->dprec;
+  int hprec = srvp->hprec;
+  int *restrict header = srvp->header;
+
+  // write header record
+  size_t blocklen = SRV_HEADER_LEN * (size_t) hprec;
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  switch (hprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i];
+        binWriteInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32);
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i];
+        binWriteInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64);
+        break;
+      }
+    default:
+      {
+        Error("unexpected header precision %d", hprec);
+        break;
+      }
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  srvp->datasize = (size_t) header[4] * (size_t) header[5];
+  blocklen = srvp->datasize * (size_t) dprec;
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+
+  switch (dprec)
+    {
+    case EXSE_PREC_FP32:
+      {
+        binWriteFlt32(fileID, byteswap, srvp->datasize, (float *) srvp->buffer);
+        break;
+      }
+    case EXSE_PREC_FP64:
+      {
+        binWriteFlt64(fileID, byteswap, srvp->datasize, (double *) srvp->buffer);
+        break;
+      }
+    default:
+      {
+        Error("unexpected data precision %d", dprec);
+        break;
+      }
+    }
+
+  binWriteF77Block(fileID, byteswap, blocklen);
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef STREAM_SCAN_H
+#define STREAM_SCAN_H
+
+
+void streamScanResizeRecords1(stream_t *streamptr);
+int streamScanInitRecords2(stream_t *streamptr);
+int streamScanInitRecords(stream_t *streamptr, int tsID);
+void streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis);
+void streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos);
+
+#endif /* STREAM_SCAN_H */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+void
+streamScanResizeRecords1(stream_t *streamptr)
+{
+  const int nrecords = streamptr->tsteps[0].nallrecs;
+  if (nrecords < streamptr->tsteps[0].recordSize)
+    {
+      streamptr->tsteps[0].recordSize = nrecords;
+      streamptr->tsteps[0].records = (record_t *) Realloc(streamptr->tsteps[0].records, (size_t) nrecords * sizeof(record_t));
+    }
+
+  streamptr->tsteps[0].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int));
+  streamptr->tsteps[0].nrecs = nrecords;
+  for (int recID = 0; recID < nrecords; ++recID) streamptr->tsteps[0].recIDs[recID] = recID;
+}
+
+int
+streamScanInitRecords2(stream_t *streamptr)
+{
+  const int nrecords = streamptr->tsteps[1].nallrecs;
+  streamptr->tsteps[1].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int));
+  streamptr->tsteps[1].nrecs = 0;
+
+  for (int recID = 0; recID < nrecords; ++recID)
+    {
+      streamptr->tsteps[1].recIDs[recID] = -1;
+      streamptr->tsteps[1].records[recID].position = streamptr->tsteps[0].records[recID].position;
+      streamptr->tsteps[1].records[recID].size = streamptr->tsteps[0].records[recID].size;
+    }
+
+  return nrecords;
+}
+
+int
+streamScanInitRecords(stream_t *streamptr, int tsID)
+{
+  const int nrecs = streamptr->tsteps[1].nrecs;
+
+  streamptr->tsteps[tsID].nrecs = nrecs;
+  streamptr->tsteps[tsID].recIDs = (int *) Malloc((size_t) nrecs * sizeof(int));
+
+  for (int recID = 0; recID < nrecs; ++recID) streamptr->tsteps[tsID].recIDs[recID] = streamptr->tsteps[1].recIDs[recID];
+
+  return nrecs;
+}
+
+void
+streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis)
+{
+  const int vlistID = streamptr->vlistID;
+  if (streamptr->ntsteps == 1 && cdiDateTime_isNull(taxis->vDateTime))
+    {
+      streamptr->ntsteps = 0;
+      for (int varID = 0; varID < streamptr->nvars; ++varID) vlistDefVarTimetype(vlistID, varID, TIME_CONSTANT);
+    }
+}
+
+void
+streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos)
+{
+  if (streamptr->ntsteps == -1)
+    {
+      const int tsID = tstepsNewEntry(streamptr);
+      if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+      streamptr->tsteps[tsID - 1].next = true;
+      streamptr->tsteps[tsID].position = recpos;
+    }
+}
+#ifndef CDI_ACROSS_H
+#define CDI_ACROSS_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_ACROSS
+
+
+#define ACROSS_DEFAULT_PORT "13859"
+
+typedef struct
+{
+  char *expid;
+  int expver;
+} across_info_t;
+
+int across_connect(const char *path, char filemode, stream_t *streamptr);
+void across_disconnect(int sock);
+int across_write_grib_message(stream_t *streamptr, const void *gribbuffer, size_t nbytes);
+
+#endif
+
+#endif /* CDI_ACROSS_H */
+#ifndef STREAM_CGRIBEX_H
+#define STREAM_CGRIBEX_H
+
+void *cgribexNew(void);
+void cgribexDelete(void *cgribexp);
+
+int cgribexScanTimestep1(stream_t *streamptr);
+int cgribexScanTimestep2(stream_t *streamptr);
+int cgribexScanTimestep(stream_t *streamptr);
+
+int cgribexDecode(int memtype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced,
+                  size_t *numMissVals, double missval);
+
+size_t cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime,
+                     int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer,
+                     size_t gribbuffersize);
+
+void *cgribex_handle_new_from_meassage(void *gribbuffer, size_t recsize);
+void cgribex_handle_delete(void *gh);
+
+void cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev);
+
+#endif /* STREAM_CGRIBEX_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _STREAM_SRV_H
+#define _STREAM_SRV_H
+
+#ifndef _SERVICE_H
+#endif
+
+int srvInqContents(stream_t *streamptr);
+int srvInqTimestep(stream_t *streamptr, int tsID);
+
+int srvInqRecord(stream_t *streamptr, int *varID, int *levelID);
+void srvDefRecord(stream_t *streamptr);
+void srvCopyRecord(stream_t *streamptr2, stream_t *streamptr1);
+void srv_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals);
+void srv_write_record(stream_t *streamptr, int memtype, const void *data);
+
+void srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals);
+void srvWriteVarDP(stream_t *streamptr, int varID, const double *data);
+
+void srvReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals);
+void srvWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data);
+
+#endif /* _STREAM_SRV_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _STREAM_EXT_H
+#define _STREAM_EXT_H
+
+#ifndef _EXTRA_H
+#endif
+
+int extInqContents(stream_t *streamptr);
+int extInqTimestep(stream_t *streamptr, int tsID);
+
+int extInqRecord(stream_t *streamptr, int *varID, int *levelID);
+void extDefRecord(stream_t *streamptr);
+void extCopyRecord(stream_t *streamptr2, stream_t *streamptr1);
+void ext_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals);
+void ext_write_record(stream_t *streamptr, int memtype, const void *data);
+
+void extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals);
+void extWriteVarDP(stream_t *streamptr, int varID, const double *data);
+
+void extReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals);
+void extWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data);
+
+#endif /* _STREAM_EXT_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _STREAM_IEG_H
+#define _STREAM_IEG_H
+
+#ifndef _IEG_H
+#endif
+
+int iegInqContents(stream_t *streamptr);
+int iegInqTimestep(stream_t *streamptr, int tsID);
+
+int iegInqRecord(stream_t *streamptr, int *varID, int *levelID);
+void iegDefRecord(stream_t *streamptr);
+void iegCopyRecord(stream_t *streamptr2, stream_t *streamptr1);
+void ieg_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals);
+void ieg_write_record(stream_t *streamptr, int memtype, const void *data);
+
+void iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals);
+void iegWriteVarDP(stream_t *streamptr, int varID, const double *data);
+
+void iegReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals);
+void iegWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data);
+
+#endif /* _STREAM_IEG_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600
+#endif
+
+#ifdef HAVE_LIBFDB5
+#endif
+
+#include <sys/stat.h>  // struct stat
+#include <ctype.h>
+#include <string.h>
+
+
+static stream_t *stream_new_entry(int resH);
+static int streamCompareP(void *streamptr1, void *streamptr2);
+static void streamDestroyP(void *streamptr);
+static void streamPrintP(void *streamptr, FILE *fp);
+static int streamGetPackSize(void *streamptr, void *context);
+static void streamPack(void *streamptr, void *buff, int size, int *position, void *context);
+static int streamTxCode(void *streamptr);
+
+const resOps streamOps = { streamCompareP, streamDestroyP, streamPrintP, streamGetPackSize, streamPack, streamTxCode };
+
+static int
+getByteorder(int byteswap)
+{
+  int byteorder = -1;
+
+  switch (HOST_ENDIANNESS)
+    {
+    case CDI_BIGENDIAN: byteorder = byteswap ? CDI_LITTLEENDIAN : CDI_BIGENDIAN; break;
+    case CDI_LITTLEENDIAN: byteorder = byteswap ? CDI_BIGENDIAN : CDI_LITTLEENDIAN; break;
+    /* FIXME: does not currently adjust for PDP endianness */
+    case CDI_PDPENDIAN:
+    default: Error("unhandled endianness");
+    }
+
+  return byteorder;
+}
+
+// used also in CDO
+int
+cdiGetFiletype(const char *uri, int *byteorder)
+{
+  // clang-format off
+  int filetype = CDI_EUFTYPE;
+  int swap = 0;
+  int version;
+  long recpos;
+
+  const char *filename;
+  int protocol = cdiGetProtocol(uri, &filename);
+
+  switch (protocol)
+    {
+    case CDI_PROTOCOL_ACROSS: return CDI_FILETYPE_GRB2;
+    case CDI_PROTOCOL_FDB:    return CDI_FILETYPE_GRB2;
+    case CDI_PROTOCOL_OTHER:  return CDI_FILETYPE_NC4;  // support for NetCDF remote types and ESDM
+    case CDI_PROTOCOL_FILE:
+      // handled below;
+      break;
+    }
+
+  int fileID = fileOpen(filename, "r");
+
+  if      (fileID == CDI_UNDEFID) return CDI_ESYSTEM;
+  else if (fileID == -2)          return CDI_ETMOF;
+
+  char buffer[8];
+  if (fileRead(fileID, buffer, 8) != 8)
+    {
+      struct stat buf;
+      if (stat(filename, &buf) == 0)
+        {
+          if (buf.st_size == 0)      return CDI_EISEMPTY;
+          if (buf.st_mode & S_IFDIR) return CDI_EISDIR;
+        }
+
+      return CDI_EUFTYPE;
+    }
+
+  fileRewind(fileID);
+
+  if (memcmp(buffer, "GRIB", 4) == 0)
+    {
+      version = buffer[7];
+      if      (version <= 1) filetype = CDI_FILETYPE_GRB;
+      else if (version == 2) filetype = CDI_FILETYPE_GRB2;
+    }
+  else if (memcmp(buffer, "CDF\001", 4) == 0) { filetype = CDI_FILETYPE_NC; }
+  else if (memcmp(buffer, "CDF\002", 4) == 0) { filetype = CDI_FILETYPE_NC2; }
+  else if (memcmp(buffer, "CDF\005", 4) == 0) { filetype = CDI_FILETYPE_NC5; }
+  else if (memcmp(buffer + 1, "HDF", 3) == 0) { filetype = CDI_FILETYPE_NC4; }
+#ifdef HAVE_LIBSERVICE
+  else if (srvCheckFiletype(fileID, &swap))   { filetype = CDI_FILETYPE_SRV; }
+#endif
+#ifdef HAVE_LIBEXTRA
+  else if (extCheckFiletype(fileID, &swap))   { filetype = CDI_FILETYPE_EXT; }
+#endif
+#ifdef HAVE_LIBIEG
+  else if (iegCheckFiletype(fileID, &swap))   { filetype = CDI_FILETYPE_IEG; }
+#endif
+#ifdef HAVE_LIBGRIB
+  else if (gribCheckSeek(fileID, &recpos, &version) == 0)
+    {
+      if      (version <= 1) filetype = CDI_FILETYPE_GRB;
+      else if (version == 2) filetype = CDI_FILETYPE_GRB2;
+    }
+#endif
+  // clang-format on
+
+  if (CDI_Debug && filetype != CDI_EUFTYPE) Message("found %s file = %s", strfiletype(filetype), filename);
+
+  fileClose(fileID);
+
+  *byteorder = getByteorder(swap);
+
+  return filetype;
+}
+
+/*
+@Function  streamInqFiletype
+@Title     Get the filetype
+
+@Prototype int streamInqFiletype(int streamID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}.
+
+@Description
+The function @func{streamInqFiletype} returns the filetype of a stream.
+
+@Result
+@func{streamInqFiletype} returns the type of the file format,
+one of the set of predefined CDI file format types.
+The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC},
+@func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5},
+@func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}.
+@EndFunction
+*/
+int
+streamInqFiletype(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  return streamptr->filetype;
+}
+
+int
+getByteswap(int byteorder)
+{
+  int byteswap = -1;
+
+  switch (byteorder)
+    {
+    case CDI_BIGENDIAN:
+    case CDI_LITTLEENDIAN:
+    case CDI_PDPENDIAN: byteswap = (HOST_ENDIANNESS != byteorder); break;
+    case -1: break;
+    default: Error("unexpected byteorder %d query!", byteorder);
+    }
+
+  return byteswap;
+}
+
+void
+streamDefMaxSteps(int streamID, int maxSteps)
+{
+  if (maxSteps >= 0)
+    {
+      stream_t *streamptr = stream_to_pointer(streamID);
+      streamptr->maxSteps = maxSteps;
+    }
+}
+
+int
+streamInqNumSteps(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  long ntsteps = streamptr->ntsteps;
+  if (ntsteps == (long) CDI_UNDEFID)
+    {
+      int tsID = 0;
+      while (streamInqTimestep(streamID, tsID++)) ntsteps = streamptr->ntsteps;
+    }
+
+  return (int) ntsteps;
+}
+
+static long
+get_max_global_recs(stream_t *streamptr)
+{
+  long maxGlobalRecs = -1;
+  const tsteps_t *tsteps = streamptr->tsteps;
+  if (tsteps)
+    {
+      maxGlobalRecs = tsteps[0].nrecs;
+      long numSteps = streamptr->ntsteps;
+      if (numSteps > 1) maxGlobalRecs += tsteps[1].nrecs * (numSteps - 1);
+    }
+  return maxGlobalRecs;
+}
+
+void
+streamDefNumWorker(int streamID, int numWorker)
+{
+  if (numWorker > 0)
+    {
+      stream_t *streamptr = stream_to_pointer(streamID);
+      int filetype = streamptr->filetype;
+
+      if (streamptr->filemode == 'r')
+        {
+          if (cdiBaseFiletype(filetype) == CDI_FILETYPE_GRIB)
+            {
+              (void) streamInqNumSteps(streamID);
+              streamptr->maxGlobalRecs = get_max_global_recs(streamptr);
+            }
+#ifdef HAVE_LIBNETCDF
+          else if (filetype == CDI_FILETYPE_NCZARR || (CDI_Test && cdiBaseFiletype(filetype) == CDI_FILETYPE_NETCDF))
+            {
+              streamptr->maxGlobalRecs = get_max_global_recs(streamptr);
+              if (CDI_Test) Message("numWorker=%d", numWorker);
+              if (CDI_Test) Message("maxGlobalRecs=%ld", streamptr->maxGlobalRecs);
+              if (streamptr->maxGlobalRecs == -1) xabort("Internal error: number of timesteps missing!");
+              if (streamptr->maxGlobalRecs == 1) numWorker = 0;
+              if (numWorker > streamptr->maxGlobalRecs) numWorker = (int) streamptr->maxGlobalRecs;
+              if (streamptr->chunkSizeTdim > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars;
+              if (streamptr->chunkSizeZdim > 1) numWorker = 0;
+              if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", streamptr->chunkSizeTdim, streamptr->chunkSizeZdim);
+            }
+#endif
+          else
+            {
+              numWorker = 0;
+            }
+
+          streamptr->numWorker = numWorker;
+          if (CDI_Debug || CDI_Test) Message("Number of asynchronous worker: %d", numWorker);
+        }
+    }
+}
+
+/*
+@Function  streamDefByteorder
+@Title     Define the byte order
+
+@Prototype void streamDefByteorder(int streamID, int byteorder)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  byteorder The byte order of a dataset, one of the CDI constants @func{CDI_BIGENDIAN} and
+                     @func{CDI_LITTLEENDIAN}.
+
+@Description
+The function @func{streamDefByteorder} defines the byte order of a binary dataset
+with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}.
+
+@EndFunction
+*/
+void
+streamDefByteorder(int streamID, int byteorder)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  streamptr->byteorder = byteorder;
+  int filetype = streamptr->filetype;
+
+  switch (filetype)
+    {
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+      {
+        srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp;
+        srvp->byteswap = getByteswap(byteorder);
+
+        break;
+      }
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+      {
+        extrec_t *extp = (extrec_t *) streamptr->record->objectp;
+        extp->byteswap = getByteswap(byteorder);
+
+        break;
+      }
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+      {
+        iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
+        iegp->byteswap = getByteswap(byteorder);
+
+        break;
+      }
+#endif
+    }
+
+  reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE);
+}
+
+/*
+@Function  streamInqByteorder
+@Title     Get the byte order
+
+@Prototype int streamInqByteorder(int streamID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}.
+
+@Description
+The function @func{streamInqByteorder} returns the byte order of a binary dataset
+with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}.
+
+@Result
+@func{streamInqByteorder} returns the type of the byte order.
+The valid CDI byte order types are @func{CDI_BIGENDIAN} and @func{CDI_LITTLEENDIAN}
+
+@EndFunction
+*/
+int
+streamInqByteorder(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  return streamptr->byteorder;
+}
+
+const char *
+streamFilesuffix(int filetype)
+{
+  static const char noSuffix[] = "";
+  static const char ncSuffix[] = ".nc";
+  static const char grbSuffix[] = ".grb";
+  static const char srvSuffix[] = ".srv";
+  static const char extSuffix[] = ".ext";
+  static const char iegSuffix[] = ".ieg";
+
+  switch (cdiBaseFiletype(filetype))
+    {
+    case CDI_FILETYPE_GRIB: return grbSuffix;
+    case CDI_FILETYPE_SRV: return srvSuffix;
+    case CDI_FILETYPE_EXT: return extSuffix;
+    case CDI_FILETYPE_IEG: return iegSuffix;
+    case CDI_FILETYPE_NETCDF: return ncSuffix;
+    default: return noSuffix;
+    }
+}
+
+const char *
+streamFilename(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  return streamptr->filename;
+}
+
+static long
+cdiInqContents(stream_t *streamptr)
+{
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  long status = 0;
+  int filetype = streamptr->filetype;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB:
+      {
+        switch (streamptr->protocol)
+          {
+#ifdef HAVE_LIBFDB5
+          case CDI_PROTOCOL_FDB: status = fdbInqContents(streamptr); break;
+#endif
+          case CDI_PROTOCOL_ACROSS:  // TODO read from ACROSS
+          case CDI_PROTOCOL_OTHER:
+          case CDI_PROTOCOL_FILE: status = grbInqContents(streamptr); break;
+          }
+        break;
+      }
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: status = srvInqContents(streamptr); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: status = extInqContents(streamptr); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: status = iegInqContents(streamptr); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: status = cdfInqContents(streamptr); break;
+#endif
+    default:
+      {
+        status = CDI_ELIBNAVAIL;
+        if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype));
+      }
+    }
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+
+  if (status == 0)
+    {
+      int taxisID = vlistInqTaxis(streamptr->vlistID);
+      if (taxisID != CDI_UNDEFID)
+        {
+          taxis_t *taxisptr1 = &streamptr->tsteps[0].taxis;
+          taxis_t *taxisptr2 = taxisPtr(taxisID);
+          ptaxisCopy(taxisptr2, taxisptr1);
+        }
+    }
+
+  return status;
+}
+
+int
+cdiGetProtocol(const char *uri, const char **filename)
+{
+  const char *pos = strstr(uri, "://");
+  if (pos == NULL)
+    {
+      *filename = uri;
+      return CDI_PROTOCOL_FILE;
+    }
+
+  size_t protocollen = (size_t) (pos - uri);
+  *filename = pos + 3;
+
+  // if (strncmp(uri, "file", protocollen) == 0) return CDI_PROTOCOL_FILE; // file is already used in NetCDF
+  if (strncmp(uri, "fdb", protocollen) == 0) return CDI_PROTOCOL_FDB;
+  if (strncmp(uri, "across", protocollen) == 0) return CDI_PROTOCOL_ACROSS;
+
+  *filename = uri;
+
+  return CDI_PROTOCOL_OTHER;
+}
+
+int
+cdiStreamOpenDefaultDelegate(const char *uri, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated)
+{
+  int fileID;
+  char temp[2] = { filemode, 0 };
+
+  const char *filename;
+  streamptr->protocol = cdiGetProtocol(uri, &filename);
+
+  switch (streamptr->protocol)
+    {
+    case CDI_PROTOCOL_ACROSS:
+#if defined(HAVE_ACROSS) && defined(HAVE_LIBGRIB_API)
+      if (filetype != CDI_FILETYPE_GRB2)
+        {
+          Warning("ACROSS needs to be used with GRIB2");
+          return CDI_EUFTYPE;
+        }
+      fileID = across_connect(filename, filemode, streamptr);
+      if (fileID >= 0)
+        {
+          streamptr->filetype = filetype;
+          if (recordBufIsToBeCreated)
+            {
+              streamptr->record = (Record *) Malloc(sizeof(Record));
+              streamptr->record->buffer = NULL;
+            }
+        }
+      return fileID;
+#else
+#ifdef HAVE_ACROSS
+      Warning("ecCodes support not compiled in (Needed for ACROSS)!");
+#else
+      Warning("ACROSS support not compiled in!");
+#endif
+      return CDI_ELIBNAVAIL;
+#endif
+
+    case CDI_PROTOCOL_FDB:
+#if defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API)
+
+      if (filetype != CDI_FILETYPE_GRB && filetype != CDI_FILETYPE_GRB2)
+        {
+          Warning("FDB5 needs to be used with GRIB or GRIB2");
+          return CDI_EUFTYPE;
+        }
+
+      check_fdb_error(fdb_initialise());
+      check_fdb_error(fdb_new_handle((fdb_handle_t **) &(streamptr->protocolData)));
+      streamptr->filetype = filetype;
+      if (recordBufIsToBeCreated)
+        {
+          streamptr->record = (Record *) Malloc(sizeof(Record));
+          streamptr->record->buffer = NULL;
+        }
+      return 88;
+
+#else  // !(defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API))
+
+#ifdef HAVE_LIBFDB5
+      Warning("ecCodes support not compiled in (Needed for FDB5)!");
+#else
+      Warning("FDB5 support not compiled in!");
+#endif
+
+      return CDI_ELIBNAVAIL;
+#endif
+
+    case CDI_PROTOCOL_OTHER:
+    case CDI_PROTOCOL_FILE:
+      // handled below;
+      break;
+    }
+
+  switch (filetype)
+    {
+#if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API))
+    case CDI_FILETYPE_GRB:
+      {
+        fileID = gribOpen(filename, temp);
+        if (fileID < 0) return CDI_ESYSTEM;
+        if (recordBufIsToBeCreated)
+          {
+            streamptr->record = (Record *) Malloc(sizeof(Record));
+            streamptr->record->buffer = NULL;
+#ifdef HAVE_LIBCGRIBEX
+            streamptr->record->objectp = cgribexNew();
+#else
+            streamptr->record->objectp = NULL;
+#endif
+          }
+        break;
+      }
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRB2:
+      {
+        fileID = gribOpen(filename, temp);
+        if (fileID < 0) return CDI_ESYSTEM;
+        if (recordBufIsToBeCreated)
+          {
+            streamptr->record = (Record *) Malloc(sizeof(Record));
+            streamptr->record->buffer = NULL;
+          }
+        break;
+      }
+#endif
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+      {
+        fileID = fileOpen(filename, temp);
+        if (fileID < 0) return CDI_ESYSTEM;
+        if (recordBufIsToBeCreated)
+          {
+            streamptr->record = (Record *) Malloc(sizeof(Record));
+            streamptr->record->buffer = NULL;
+            streamptr->record->objectp = srvNew();
+          }
+        break;
+      }
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+      {
+        fileID = fileOpen(filename, temp);
+        if (fileID < 0) return CDI_ESYSTEM;
+        if (recordBufIsToBeCreated)
+          {
+            streamptr->record = (Record *) Malloc(sizeof(Record));
+            streamptr->record->buffer = NULL;
+            streamptr->record->objectp = extNew();
+          }
+        break;
+      }
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+      {
+        fileID = fileOpen(filename, temp);
+        if (fileID < 0) return CDI_ESYSTEM;
+        if (recordBufIsToBeCreated)
+          {
+            streamptr->record = (Record *) Malloc(sizeof(Record));
+            streamptr->record->buffer = NULL;
+            streamptr->record->objectp = iegNew();
+          }
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NC:
+    case CDI_FILETYPE_NC2:
+    case CDI_FILETYPE_NC5:
+      {
+        fileID = cdfOpen(filename, temp, filetype);
+        break;
+      }
+    case CDI_FILETYPE_NC4:
+    case CDI_FILETYPE_NC4C:
+    case CDI_FILETYPE_NCZARR:
+      {
+        fileID = cdf4Open(filename, temp, &filetype);
+        break;
+      }
+#endif
+    default:
+      {
+        if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype));
+        return CDI_ELIBNAVAIL;
+      }
+    }
+
+  streamptr->filetype = filetype;
+
+  return fileID;
+}
+
+static long
+stream_create_vlist(stream_t *streamptr, CdiQuery *query)
+{
+  int vlistID = vlistCreate();
+  if (vlistID < 0) return CDI_ELIMIT;
+
+  cdiVlistMakeInternal(vlistID);
+  streamptr->vlistID = vlistID;
+
+  if (query) streamptr->query = query;
+
+  long status = cdiInqContents(streamptr);
+  if (status >= 0)
+    {
+      vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID);
+      vlistptr->ntsteps = streamptr->ntsteps;
+      cdiVlistMakeImmutable(vlistID);
+    }
+
+  return status;
+}
+
+int
+streamOpenID(const char *filename, char filemode, int filetype, int resH)
+{
+  if (CDI_Debug) Message("Open %s mode %c file %s", strfiletype(filetype), filemode, filename ? filename : "(NUL)");
+
+  if (!filename || filetype < 0) return CDI_EINVAL;
+
+  stream_t *streamptr = stream_new_entry(resH);
+  int streamID = CDI_ESYSTEM;
+
+#ifndef HAVE_NC4HDF5_THREADSAFE
+  if (CDI_Threadsafe)
+    {
+#ifndef HAVE_LIBPTHREAD
+      Error("CDI threadsafe failed, pthread support not compiled in!");
+#endif
+      if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C) streamptr->lockIO = true;
+    }
+#endif
+
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated)
+      = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func;
+
+  int fileID = streamOpenDelegate(filename, filemode, filetype, streamptr, 1);
+  if (fileID < 0)
+    {
+      streamID = fileID;
+      if (streamptr->record) Free(streamptr->record);
+      reshRemove(streamptr->self, &streamOps);
+      Free(streamptr);
+    }
+  else
+    {
+      streamID = streamptr->self;
+      if (streamID < 0) return CDI_ELIMIT;
+
+      streamptr->filemode = filemode;
+      streamptr->filename = strdup(filename);
+      streamptr->fileID = fileID;
+    }
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+
+  return streamID;
+}
+
+static int
+streamOpen(const char *filename, const char *filemode, int filetype)
+{
+  if (!filemode || strlen(filemode) != 1) return CDI_EINVAL;
+  return streamOpenID(filename, (char) tolower(filemode[0]), filetype, CDI_UNDEFID);
+}
+
+static int
+streamOpenA(const char *filename, const char *filemode, int filetype)
+{
+  if (CDI_Debug) Message("Open %s file (mode=%c); filename: %s", strfiletype(filetype), (int) *filemode, filename);
+  if (CDI_Debug) printf("streamOpenA: %s\n", filename);  // seg fault without this line on thunder/squall with "cdo cat x y"
+
+  if (!filename || !filemode || filetype < 0) return CDI_EINVAL;
+
+  stream_t *streamptr = stream_new_entry(CDI_UNDEFID);
+  int fileID = CDI_UNDEFID;
+
+  {
+    int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated)
+        = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func;
+
+    fileID = streamOpenDelegate(filename, 'r', filetype, streamptr, 1);
+  }
+
+  if (fileID == CDI_UNDEFID || fileID == CDI_ELIBNAVAIL || fileID == CDI_ESYSTEM) return fileID;
+
+  int streamID = streamptr->self;
+
+  streamptr->filemode = tolower(*filemode);
+  streamptr->filename = strdup(filename);
+  streamptr->fileID = fileID;
+
+  streamptr->vlistID = vlistCreate();
+  cdiVlistMakeInternal(streamptr->vlistID);
+  // cdiReadByteorder(streamID);
+  long status = cdiInqContents(streamptr);
+  if (status < 0) return (int) status;
+  vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID);
+  vlistptr->ntsteps = streamInqNumSteps(streamID);
+
+  // Needed for NetCDF4
+  for (int varID = 0; varID < vlistptr->nvars; ++varID) streamptr->vars[varID].defmiss = true;
+
+  if (str_is_equal(filemode, "r")) cdiVlistMakeImmutable(streamptr->vlistID);
+
+  {
+    void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted)
+        = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func;
+
+    streamCloseDelegate(streamptr, 0);
+  }
+
+  switch (filetype)
+    {
+#if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API))
+    case CDI_FILETYPE_GRB:
+#ifdef HAVE_LIBGRIB_API
+    case CDI_FILETYPE_GRB2:
+#endif
+      {
+        fileID = gribOpen(filename, filemode);
+        if (fileID != CDI_UNDEFID) gribContainersNew(streamptr);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+      {
+        fileID = fileOpen(filename, filemode);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+      {
+        fileID = fileOpen(filename, filemode);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+      {
+        fileID = fileOpen(filename, filemode);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NC:
+    case CDI_FILETYPE_NC2:
+    case CDI_FILETYPE_NC5:
+      {
+        fileID = cdfOpen(filename, filemode, filetype);
+        streamptr->ncmode = 2;
+        break;
+      }
+    case CDI_FILETYPE_NC4:
+    case CDI_FILETYPE_NC4C:
+      {
+        fileID = cdf4Open(filename, filemode, &filetype);
+        streamptr->ncmode = 2;
+        break;
+      }
+    case CDI_FILETYPE_NCZARR:
+      {
+        Warning("%s not available in append mode!", strfiletype(filetype));
+        return CDI_ELIBNAVAIL;
+      }
+#endif
+    default:
+      {
+        if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype));
+        return CDI_ELIBNAVAIL;
+      }
+    }
+
+  if (fileID == CDI_UNDEFID)
+    streamID = CDI_UNDEFID;
+  else
+    streamptr->fileID = fileID;
+
+  return streamID;
+}
+
+/*
+@Function  streamOpenRead
+@Title     Open a dataset for reading
+
+@Prototype int streamOpenRead(const char *path)
+@Parameter
+    @Item  path  The name of the dataset to be read.
+
+@Description
+The function @func{streamOpenRead} opens an existing dataset for reading.
+
+@Result
+Upon successful completion @func{streamOpenRead} returns an identifier to the
+open stream. Otherwise, a negative number with the error status is returned.
+
+@Errors
+@List
+   @Item  CDI_ESYSTEM     Operating system error.
+   @Item  CDI_EINVAL      Invalid argument.
+   @Item  CDI_EUFILETYPE  Unsupported file type.
+   @Item  CDI_ELIBNAVAIL  Library support not compiled in.
+@EndList
+
+@Example
+Here is an example using @func{streamOpenRead} to open an existing NetCDF
+file named @func{foo.nc} for reading:
+
+@Source
+   ...
+int streamID;
+   ...
+streamID = streamOpenRead("foo.nc");
+if ( streamID < 0 ) handle_error(streamID);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+streamOpenRead(const char *filename)
+{
+  cdiInitialize();
+
+  int byteorder = 0;
+  int filetype = cdiGetFiletype(filename, &byteorder);
+  if (filetype < 0) return filetype;
+
+  int streamID = streamOpen(filename, "r", filetype);
+  if (streamID >= 0)
+    {
+      stream_t *streamptr = stream_to_pointer(streamID);
+      streamptr->byteorder = byteorder;
+
+      long status = stream_create_vlist(streamptr, NULL);
+      if (status < 0)
+        {
+          streamID = (int) status;
+          if (streamptr->record) Free(streamptr->record);
+          reshRemove(streamptr->self, &streamOps);
+        }
+    }
+
+  return streamID;
+}
+
+int
+streamOpenReadQuery(const char *filename, CdiQuery *query)
+{
+  cdiInitialize();
+
+  int byteorder = 0;
+  int filetype = cdiGetFiletype(filename, &byteorder);
+  if (filetype < 0) return filetype;
+
+  if (cdiBaseFiletype(filetype) != CDI_FILETYPE_NETCDF && filetype != CDI_FILETYPE_GRB2) return CDI_EQNAVAIL;
+
+  int streamID = streamOpen(filename, "r", filetype);
+  if (streamID >= 0)
+    {
+      stream_t *streamptr = stream_to_pointer(streamID);
+      streamptr->byteorder = byteorder;
+
+      long status = stream_create_vlist(streamptr, query);
+      if (status < 0)
+        {
+          streamID = (int) status;
+          if (streamptr->record) Free(streamptr->record);
+          reshRemove(streamptr->self, &streamOps);
+        }
+    }
+
+  return streamID;
+}
+
+int
+streamOpenAppend(const char *filename)
+{
+  cdiInitialize();
+
+  int byteorder = 0;
+  int filetype = cdiGetFiletype(filename, &byteorder);
+  if (filetype < 0) return filetype;
+
+  int streamID = streamOpenA(filename, "a", filetype);
+  if (streamID >= 0)
+    {
+      stream_t *streamptr = stream_to_pointer(streamID);
+      streamptr->byteorder = byteorder;
+    }
+
+  return streamID;
+}
+
+/*
+@Function  streamOpenWrite
+@Title     Create a new dataset
+
+@Prototype int streamOpenWrite(const char *path, int filetype)
+@Parameter
+    @Item  path      The name of the new dataset.
+    @Item  filetype  The type of the file format, one of the set of predefined CDI file format types.
+                     The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC},
+                     @func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5},
+                     @func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}.
+
+@Description
+The function @func{streamOpenWrite} creates a new datset.
+@Result
+Upon successful completion @func{streamOpenWrite} returns an identifier to the
+open stream. Otherwise, a negative number with the error status is returned.
+
+@Errors
+@List
+   @Item  CDI_ESYSTEM     Operating system error.
+   @Item  CDI_EINVAL      Invalid argument.
+   @Item  CDI_EUFILETYPE  Unsupported file type.
+   @Item  CDI_ELIBNAVAIL  Library support not compiled in.
+@EndList
+
+@Example
+Here is an example using @func{streamOpenWrite} to create a new NetCDF file named @func{foo.nc} for writing:
+
+@Source
+   ...
+int streamID;
+   ...
+streamID = streamOpenWrite("foo.nc", CDI_FILETYPE_NC);
+if ( streamID < 0 ) handle_error(streamID);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+streamOpenWrite(const char *filename, int filetype)
+{
+  cdiInitialize();
+
+  return streamOpen(filename, "w", filetype);
+}
+
+static void
+streamDefaultValue(stream_t *streamptr)
+{
+  streamptr->self = CDI_UNDEFID;
+  streamptr->accesstype = CDI_UNDEFID;
+  streamptr->accessmode = 0;
+  streamptr->filetype = CDI_FILETYPE_UNDEF;
+  streamptr->byteorder = CDI_UNDEFID;
+  streamptr->fileID = 0;
+  streamptr->filemode = 0;
+  streamptr->numvals = 0;
+  streamptr->filename = NULL;
+  streamptr->record = NULL;
+  streamptr->query = NULL;
+  streamptr->varsAllocated = 0;
+  streamptr->nrecs = 0;
+  streamptr->nvars = 0;
+  streamptr->vars = NULL;
+  streamptr->ncmode = 0;
+  streamptr->curTsID = CDI_UNDEFID;
+  streamptr->rtsteps = 0;
+  streamptr->ntsteps = CDI_UNDEFID;
+  streamptr->maxSteps = CDI_UNDEFID;
+  streamptr->tsteps = NULL;
+  streamptr->tstepsTableSize = 0;
+  streamptr->tstepsNextID = 0;
+  streamptr->vlistID = CDI_UNDEFID;
+  streamptr->globalatts = 0;
+  streamptr->localatts = 0;
+  streamptr->unreduced = cdiDataUnreduced;
+  streamptr->have_missval = cdiHaveMissval;
+  streamptr->comptype = CDI_COMPRESS_NONE;
+  streamptr->complevel = 0;
+  streamptr->shuffle = 0;
+  streamptr->sortname = (cdiSortName > 0);
+  streamptr->lockIO = CDI_Lock_IO;
+  // netcdf4/HDF5 filter
+  streamptr->filterSpec = NULL;
+
+  basetimeInit(&streamptr->basetime);
+
+#ifdef HAVE_LIBNETCDF
+  streamptr->nc_complex_float_id = CDI_UNDEFID;
+  streamptr->nc_complex_double_id = CDI_UNDEFID;
+
+  for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->zaxisID[i] = CDI_UNDEFID;
+  for (int i = 0; i < MAX_ZAXES_PS; i++) streamptr->nczvarID[i] = CDI_UNDEFID;
+
+  for (int i = 0; i < MAX_GRIDS_PS; i++)
+    {
+      streamptr->ncgrid[i].start = CDI_UNDEFID;
+      streamptr->ncgrid[i].count = CDI_UNDEFID;
+      streamptr->ncgrid[i].gridID = CDI_UNDEFID;
+      for (size_t j = 0; j < CDF_SIZE_ncIDs; ++j) streamptr->ncgrid[i].ncIDs[j] = CDI_UNDEFID;
+    }
+
+  streamptr->ncNumDims = 0;
+  for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimID[i] = CDI_UNDEFID;
+  for (int i = 0; i < MAX_DIMS_PS; i++) streamptr->ncDimLen[i] = 0;
+
+  streamptr->vct.ilev = 0;
+  streamptr->vct.mlev = 0;
+  streamptr->vct.ilevID = CDI_UNDEFID;
+  streamptr->vct.mlevID = CDI_UNDEFID;
+
+  streamptr->chunkSizeTdim = 0;
+  streamptr->chunkSizeZdim = 0;
+#endif
+  streamptr->maxGlobalRecs = CDI_UNDEFID;
+
+  streamptr->gribContainers = NULL;
+
+  streamptr->numWorker = 0;
+  streamptr->nextGlobalRecId = 0;
+  streamptr->cachedTsID = -1;
+  streamptr->jobs = NULL;
+  streamptr->jobManager = NULL;
+
+  streamptr->protocolData = NULL;
+
+#ifdef HAVE_LIBFDB5
+  streamptr->fdbNumItems = 0;
+  streamptr->fdbKeyValueList = NULL;
+#endif
+}
+
+static stream_t *
+stream_new_entry(int resH)
+{
+  cdiInitialize(); /* ***************** make MT version !!! */
+
+  stream_t *streamptr = (stream_t *) Malloc(sizeof(stream_t));
+  streamDefaultValue(streamptr);
+
+  if (resH == CDI_UNDEFID)
+    streamptr->self = reshPut(streamptr, &streamOps);
+  else
+    {
+      streamptr->self = resH;
+      reshReplace(resH, streamptr, &streamOps);
+    }
+
+  return streamptr;
+}
+
+void
+cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted)
+{
+  int fileID = streamptr->fileID;
+  int filetype = streamptr->filetype;
+
+  if (streamptr->filterSpec)
+    {
+      free(streamptr->filterSpec);
+      streamptr->filterSpec = NULL;
+    }
+
+  switch (streamptr->protocol)
+    {
+    case CDI_PROTOCOL_ACROSS:
+#ifdef HAVE_ACROSS
+      if (fileID) across_disconnect(fileID);
+      if (streamptr->protocolData)
+        {
+          Free(((across_info_t *) streamptr->protocolData)->expid);
+          Free(streamptr->protocolData);
+          streamptr->protocolData = NULL;
+        }
+#endif
+      return;
+
+    case CDI_PROTOCOL_FDB:
+#ifdef HAVE_LIBFDB5
+      if (streamptr->protocolData) check_fdb_error(fdb_delete_handle(streamptr->protocolData));
+      streamptr->protocolData = NULL;
+#endif
+      return;
+
+    case CDI_PROTOCOL_OTHER:
+    case CDI_PROTOCOL_FILE:
+      // handled below;
+      break;
+    }
+
+  if (fileID == CDI_UNDEFID)
+    {
+      Warning("File %s not open!", streamptr->filename);
+      return;
+    }
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API))
+    case CDI_FILETYPE_GRIB:
+      if (filetype == CDI_FILETYPE_GRB)
+        {
+          gribClose(fileID);
+          if (recordBufIsToBeDeleted) gribContainersDelete(streamptr);
+#ifdef HAVE_LIBCGRIBEX
+          if (recordBufIsToBeDeleted) cgribexDelete(streamptr->record->objectp);
+#endif
+        }
+      else if (filetype == CDI_FILETYPE_GRB2)
+        {
+          gribClose(fileID);
+          if (recordBufIsToBeDeleted) gribContainersDelete(streamptr);
+        }
+      break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+      {
+        fileClose(fileID);
+        if (recordBufIsToBeDeleted) srvDelete(streamptr->record->objectp);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+      {
+        fileClose(fileID);
+        if (recordBufIsToBeDeleted) extDelete(streamptr->record->objectp);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+      {
+        fileClose(fileID);
+        if (recordBufIsToBeDeleted) iegDelete(streamptr->record->objectp);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+      {
+        cdfClose(fileID);
+        if (streamptr->ntsteps == 0 && streamptr->tsteps != NULL)
+          {
+            if (streamptr->tsteps[0].records)
+              {
+                Free(streamptr->tsteps[0].records);
+                streamptr->tsteps[0].records = NULL;
+              }
+            if (streamptr->tsteps[0].recIDs)
+              {
+                Free(streamptr->tsteps[0].recIDs);
+                streamptr->tsteps[0].recIDs = NULL;
+              }
+          }
+        break;
+      }
+#endif
+    default:
+      {
+        Error("%s support not compiled in (fileID = %d)!", strfiletype(filetype), fileID);
+        break;
+      }
+    }
+}
+
+static void
+deallocate_sleveltable_t(sleveltable_t *entry)
+{
+  if (entry->recordID) Free(entry->recordID);
+  if (entry->lindex) Free(entry->lindex);
+  entry->recordID = NULL;
+  entry->lindex = NULL;
+}
+
+static void
+streamDestroy(stream_t *streamptr)
+{
+  xassert(streamptr);
+  int vlistID = streamptr->vlistID;
+
+  void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted)
+      = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func;
+
+  if (streamptr->filetype != CDI_FILETYPE_UNDEF) streamCloseDelegate(streamptr, 1);
+
+  if (streamptr->record)
+    {
+      if (streamptr->record->buffer) Free(streamptr->record->buffer);
+      Free(streamptr->record);
+      streamptr->record = NULL;
+    }
+
+  streamptr->filetype = CDI_FILETYPE_UNDEF;
+  if (streamptr->filename)
+    {
+      Free(streamptr->filename);
+      streamptr->filename = NULL;
+    }
+
+  if (streamptr->filterSpec) free(streamptr->filterSpec);
+
+  if (streamptr->vars)
+    {
+      for (int index = 0; index < streamptr->nvars; index++)
+        {
+          sleveltable_t *pslev = streamptr->vars[index].recordTable;
+          unsigned nsub = streamptr->vars[index].subtypeSize >= 0 ? (unsigned) streamptr->vars[index].subtypeSize : 0U;
+          for (size_t isub = 0; isub < nsub; isub++) deallocate_sleveltable_t(pslev + isub);
+          if (pslev) Free(pslev);
+        }
+      Free(streamptr->vars);
+      streamptr->vars = NULL;
+    }
+
+  if (streamptr->tsteps)
+    {
+      int maxSteps = streamptr->tstepsNextID;
+      for (int index = 0; index < maxSteps; ++index)
+        {
+          tsteps_t *tstep = &(streamptr->tsteps[index]);
+          if (tstep->records) Free(tstep->records);
+          if (tstep->recIDs) Free(tstep->recIDs);
+          taxisDestroyKernel(&(tstep->taxis));
+        }
+
+      Free(streamptr->tsteps);
+      streamptr->tsteps = NULL;
+    }
+
+#ifdef HAVE_LIBFDB5
+  if (streamptr->fdbKeyValueList)
+    {
+      cdi_fdb_delete_kvlist(streamptr->fdbNumItems, streamptr->fdbKeyValueList);
+      streamptr->fdbNumItems = 0;
+      streamptr->fdbKeyValueList = NULL;
+    }
+#endif
+
+  if (vlistID != -1)
+    {
+      int taxisID = (streamptr->filemode != 'w') ? vlistInqTaxis(vlistID) : -1;
+      if (taxisID != -1) taxisDestroy(taxisID);
+      void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func;
+      mycdiVlistDestroy_(vlistID, true);
+    }
+
+  if (streamptr->jobs) Free(streamptr->jobs);
+  if (streamptr->jobManager) AsyncWorker_finalize((AsyncManager *) streamptr->jobManager);
+
+  Free(streamptr);
+}
+
+static void
+streamDestroyP(void *streamptr)
+{
+  streamDestroy((stream_t *) streamptr);
+}
+
+/*
+@Function  streamClose
+@Title     Close an open dataset
+
+@Prototype  void streamClose(int streamID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}.
+
+@Description
+The function @func{streamClose} closes an open dataset.
+
+@EndFunction
+*/
+void
+streamClose(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  bool lockIO = streamptr->lockIO;
+  if (lockIO) CDI_IO_LOCK();
+
+  if (CDI_Debug) Message("streamID = %d filename = %s", streamID, streamptr->filename);
+  streamDestroy(streamptr);
+  reshRemove(streamID, &streamOps);
+  if (CDI_Debug) Message("Removed stream %d from stream list", streamID);
+
+  if (lockIO) CDI_IO_UNLOCK();
+}
+
+void
+cdiStreamSync_(stream_t *streamptr)
+{
+  int fileID = streamptr->fileID;
+  int filetype = streamptr->filetype;
+  int vlistID = streamptr->vlistID;
+  int nvars = vlistNvars(vlistID);
+
+  if (fileID == CDI_UNDEFID)
+    Warning("File %s not open!", streamptr->filename);
+  else if (vlistID == CDI_UNDEFID)
+    Warning("Vlist undefined for file %s!", streamptr->filename);
+  else if (nvars == 0)
+    Warning("No variables defined!");
+  else
+    {
+      if (streamptr->filemode == 'w' || streamptr->filemode == 'a')
+        {
+          switch (cdiBaseFiletype(filetype))
+            {
+#ifdef HAVE_LIBNETCDF
+            case CDI_FILETYPE_NETCDF:
+              {
+                void cdf_sync(int ncid);
+                if (streamptr->ncmode == 2) cdf_sync(fileID);
+                break;
+              }
+#endif
+            default:
+              {
+                fileFlush(fileID);
+                break;
+              }
+            }
+        }
+    }
+}
+
+/*
+@Function  streamSync
+@Title     Synchronize an Open Dataset to Disk
+
+@Prototype  void streamSync(int streamID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+
+@Description
+The function @func{streamSync} offers a way to synchronize the disk copy of a dataset with in-memory buffers.
+
+@EndFunction
+*/
+void
+streamSync(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  void (*myStreamSync_)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_STREAM_SYNC).func;
+  myStreamSync_(streamptr);
+}
+
+int
+cdiStreamDefTimestep_(stream_t *streamptr, int tsID)
+{
+  stream_check_ptr(__func__, streamptr);
+
+  if (CDI_Debug) Message("streamID = %d  tsID = %d", streamptr->self, tsID);
+
+  int vlistID = streamptr->vlistID;
+  if (vlistID == CDI_UNDEFID)
+    Error("Must not call streamDefTimestep for stream (ID=%d) with (not yet) defined vlist", streamptr->self);
+
+  if (tsID > 0)
+    {
+      int newtsID = tstepsNewEntry(streamptr);
+      if (tsID != newtsID) Error("Internal problem: tsID = %d newtsID = %d", tsID, newtsID);
+    }
+
+  int taxisID = vlistInqTaxis(vlistID);
+  if (taxisID != CDI_UNDEFID) ptaxisCopy(&streamptr->tsteps[tsID].taxis, taxisPtr(taxisID));
+
+  streamptr->curTsID = tsID;
+  streamptr->ntsteps = tsID + 1;
+
+#ifdef HAVE_LIBNETCDF
+  int timeIsVarying = vlistHasTime(vlistID);
+  if (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF && timeIsVarying)
+    {
+      /* usually points to cdfDefTimestep in serial mode but
+       * to cdiPioCdfDefTimestep on servers and to a null-op on
+       * clients in client/server mode */
+      void (*myCdfDefTimestep)(stream_t * streamptr, int tsID, size_t)
+          = (void (*)(stream_t *, int, size_t)) namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func;
+      myCdfDefTimestep(streamptr, tsID, 1);
+    }
+#endif
+
+  cdi_create_records(streamptr, tsID);
+
+  return (int) streamptr->ntsteps;
+}
+
+/*
+@Function  streamDefTimestep
+@Title     Define a timestep
+
+@Prototype int streamDefTimestep(int streamID, int tsID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  tsID      Timestep identifier.
+
+@Description
+The function @func{streamDefTimestep} defines a timestep of a stream by the identifier tsID.
+The identifier tsID is the timestep index starting at 0 for the first timestep.
+Before calling this function the functions @func{taxisDefVdate} and @func{taxisDefVtime} should be used
+to define the timestamp for this timestep. All calls to write the data refer to this timestep.
+
+@Result
+@func{streamDefTimestep} returns the number of expected records of the timestep.
+
+@EndFunction
+*/
+int
+streamDefTimestep(int streamID, int tsID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  int (*myStreamDefTimestep_)(stream_t * streamptr, int tsID)
+      = (int (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_TIMESTEP_).func;
+  int status = myStreamDefTimestep_(streamptr, tsID);
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+
+  return status;
+}
+
+int
+streamInqCurTimestepID(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  return streamptr->curTsID;
+}
+
+/*
+@Function  streamInqTimestep
+@Title     Get timestep information
+
+@Prototype int streamInqTimestep(int streamID, int tsID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}.
+    @Item  tsID      Timestep identifier.
+
+@Description
+The function @func{streamInqTimestep} sets the next timestep to the identifier tsID.
+The identifier tsID is the timestep index starting at 0 for the first timestep.
+After a call to this function the functions @func{taxisInqVdate} and @func{taxisInqVtime} can be used
+to read the timestamp for this timestep. All calls to read the data refer to this timestep.
+
+@Result
+@func{streamInqTimestep} returns the number of records of the timestep or 0, if the end of the file is reached.
+
+@EndFunction
+*/
+int
+streamInqTimestep(int streamID, int tsID)
+{
+  int nrecs = 0;
+  stream_t *streamptr = stream_to_pointer(streamID);
+  int vlistID = streamptr->vlistID;
+
+  if (tsID < streamptr->ntsteps) streamptr->tsteps[tsID].curRecID = CDI_UNDEFID;  // fix for netCDF
+  if (tsID < streamptr->rtsteps)
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+      streamptr->tsteps[tsID].curRecID = CDI_UNDEFID;
+      int taxisID = vlistInqTaxis(vlistID);
+      if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID);
+      ptaxisCopy(taxisPtr(taxisID), &streamptr->tsteps[tsID].taxis);
+
+      return nrecs;
+    }
+
+  if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID) return 0;
+
+  int filetype = streamptr->filetype;
+
+  if (CDI_Debug) Message("streamID = %d  tsID = %d  filetype = %d", streamID, tsID, filetype);
+
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB:
+      {
+        switch (streamptr->protocol)
+          {
+          case CDI_PROTOCOL_FDB: nrecs = fdbInqTimestep(streamptr, tsID); break;
+
+          case CDI_PROTOCOL_ACROSS:  // TODO read from ACROSS
+          case CDI_PROTOCOL_OTHER:
+          case CDI_PROTOCOL_FILE: nrecs = grbInqTimestep(streamptr, tsID); break;
+          }
+        break;
+      }
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV:
+      {
+        nrecs = srvInqTimestep(streamptr, tsID);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT:
+      {
+        nrecs = extInqTimestep(streamptr, tsID);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG:
+      {
+        nrecs = iegInqTimestep(streamptr, tsID);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+      {
+        nrecs = cdfInqTimestep(streamptr, tsID);
+        break;
+      }
+#endif
+    default:
+      {
+        Error("%s support not compiled in!", strfiletype(filetype));
+        break;
+      }
+    }
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+
+  int taxisID = vlistInqTaxis(vlistID);
+  if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID);
+
+  ptaxisCopy(taxisPtr(taxisID), &streamptr->tsteps[tsID].taxis);
+
+  return nrecs;
+}
+
+// This function is used in CDO!
+SizeType
+streamNvals(int streamID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+  return streamptr->numvals;
+}
+
+/*
+@Function  streamDefVlist
+@Title     Define the variable list
+
+@Prototype void streamDefVlist(int streamID, int vlistID)
+@Parameter
+    @Item  streamID Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+
+@Description
+The function @func{streamDefVlist} defines the variable list of a stream.
+
+To safeguard against errors by modifying the wrong vlist object,
+this function makes the passed vlist object immutable.
+All further vlist changes have to use the vlist object returned by streamInqVlist().
+
+@EndFunction
+*/
+void
+streamDefVlist(int streamID, int vlistID)
+{
+  void (*myStreamDefVlist)(int streamID, int vlistID) = (void (*)(int, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_VLIST_).func;
+  myStreamDefVlist(streamID, vlistID);
+}
+
+// The single image implementation of streamDefVlist
+void
+cdiStreamDefVlist_(int streamID, int vlistID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  if (streamptr->vlistID == CDI_UNDEFID)
+    {
+      if (streamptr->lockIO) CDI_IO_LOCK();
+
+      int vlistCopy = vlistDuplicate(vlistID);
+      cdiVlistMakeInternal(vlistCopy);
+      cdiVlistMakeImmutable(vlistID);
+      cdiStreamSetupVlist(streamptr, vlistCopy);
+
+      if (streamptr->lockIO) CDI_IO_UNLOCK();
+    }
+  else
+    Warning("vlist already defined for %s!", streamptr->filename);
+}
+
+/*
+@Function  streamInqVlist
+@Title     Get the variable list
+
+@Prototype int streamInqVlist(int streamID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}.
+
+@Description
+The function @func{streamInqVlist} returns the variable list of a stream.
+
+@Result
+@func{streamInqVlist} returns an identifier to the variable list.
+
+@EndFunction
+*/
+int
+streamInqVlist(int streamID)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  return s->vlistID;
+}
+
+void
+streamDefShuffle(int streamID, int shuffle)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  if (s->shuffle != shuffle)
+    {
+      s->shuffle = shuffle;
+      reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+streamDefFilter(int streamID, const char *filterSpec)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  if (filterSpec)
+    {
+      // if (s->filterSpec) Error("Filter spec already defined!");
+      if (s->filterSpec == NULL)
+        {
+          s->filterSpec = strdup(filterSpec);
+          reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE);
+        }
+    }
+}
+
+void
+streamDefCompType(int streamID, int comptype)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  if (s->comptype != comptype)
+    {
+      s->comptype = comptype;
+      reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+streamDefCompLevel(int streamID, int complevel)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  if (s->complevel != complevel)
+    {
+      s->complevel = complevel;
+      reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+streamInqCompType(int streamID)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  return s->comptype;
+}
+
+int
+streamInqCompLevel(int streamID)
+{
+  stream_t *s = stream_to_pointer(streamID);
+  return s->complevel;
+}
+
+int
+streamInqFileID(int streamID)
+{
+  stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps);
+  return s->fileID;
+}
+
+void
+cdiDefAccesstype(int streamID, int type)
+{
+  stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps);
+
+  if (s->accesstype == CDI_UNDEFID)
+    {
+      s->accesstype = type;
+    }
+  else if (s->accesstype != type)
+    Error("Changing access type from %s not allowed!", s->accesstype == TYPE_REC ? "REC to VAR" : "VAR to REC");
+}
+
+int
+cdiInqAccesstype(int streamID)
+{
+  stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps);
+  return s->accesstype;
+}
+
+static int
+streamTxCode(void *s)
+{
+  (void) s;
+  return STREAM;
+}
+
+void
+cdiStreamSetupVlist(stream_t *s, int vlistID)
+{
+  void (*myStreamSetupVlist)(stream_t * s, int vlistID)
+      = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_SETUP_VLIST).func;
+  myStreamSetupVlist(s, vlistID);
+}
+
+void
+cdiStreamSetupVlist_(stream_t *streamptr, int vlistID)
+{
+  streamptr->vlistID = vlistID;
+  int nvars = vlistNvars(vlistID);
+  for (int varID = 0; varID < nvars; ++varID)
+    {
+      int gridID = vlistInqVarGrid(vlistID, varID);
+      int zaxisID = vlistInqVarZaxis(vlistID, varID);
+      int tilesetID = vlistInqVarSubtype(vlistID, varID);
+      stream_new_var(streamptr, gridID, zaxisID, tilesetID);
+      if (streamptr->have_missval) vlistDefVarMissval(vlistID, varID, vlistInqVarMissval(vlistID, varID));
+    }
+
+  if (streamptr->filemode == 'w')
+    {
+      tstepsNewEntry(streamptr);  // timestep 0
+      int vlistIDw = streamptr->vlistID;
+      int timeIsVarying = vlistHasTime(vlistIDw);
+      if (timeIsVarying)
+        {
+          int taxisID = vlistInqTaxis(vlistIDw);
+          if (taxisID == CDI_UNDEFID)
+            {
+              Warning("taxisID undefined for fileID = %d! Using absolute time axis.", streamptr->self);
+              taxisID = taxisCreate(TAXIS_ABSOLUTE);
+              vlistDefTaxis(vlistIDw, taxisID);
+            }
+
+#ifdef HAVE_LIBNETCDF
+          if (taxisInqType(taxisID) == TAXIS_RELATIVE)
+            if (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF)
+              {
+                const taxis_t *taxisptr = taxisPtr(taxisID);
+                if (cdiDateTime_isNull(taxisptr->rDateTime))
+                  {
+                    int vdate = taxisInqVdate(taxisID);
+                    if (vdate == 0) vdate = 10101;
+                    taxisDefRdate(taxisID, vdate);
+                  }
+              }
+#endif
+          ptaxisCopy(&streamptr->tsteps[0].taxis, taxisPtr(taxisID));
+        }
+
+      switch (cdiBaseFiletype(streamptr->filetype))
+        {
+#ifdef HAVE_LIBNETCDF
+        case CDI_FILETYPE_NETCDF:
+          {
+            /* calls cdfDefCoordinateVars in serial mode but
+             * cdiPioClientStreamNOP (i.e. nothing) on client ranks
+             * and cdiPioServerCdfDefVars on server ranks in parallel mode*/
+            void (*myCdfDefVars)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_CDF_STREAM_SETUP).func;
+            myCdfDefVars(streamptr);
+          }
+          break;
+#endif
+#ifdef HAVE_LIBGRIB
+        case CDI_FILETYPE_GRIB: gribContainersNew(streamptr); break;
+#endif
+        default:;
+        }
+    }
+}
+
+void
+cdiStreamGetIndexList(unsigned numIDs, int *IDs)
+{
+  reshGetResHListOfType(numIDs, IDs, &streamOps);
+}
+
+int
+streamInqNvars(int streamID)
+{
+  stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps);
+  return s->nvars;
+}
+
+static int
+streamCompareP(void *streamptr1, void *streamptr2)
+{
+  stream_t *s1 = (stream_t *) streamptr1;
+  stream_t *s2 = (stream_t *) streamptr2;
+  enum
+  {
+    differ = -1,
+    equal = 0,
+  };
+
+  xassert(s1);
+  xassert(s2);
+
+  if (s1->filetype != s2->filetype) return differ;
+  if (s1->byteorder != s2->byteorder) return differ;
+  if (s1->comptype != s2->comptype) return differ;
+  if (s1->complevel != s2->complevel) return differ;
+
+  if (s1->filename)
+    {
+      if (!str_is_equal(s1->filename, s2->filename)) return differ;
+    }
+  else if (s2->filename)
+    return differ;
+
+  return equal;
+}
+
+void
+streamPrintP(void *streamptr, FILE *fp)
+{
+  stream_t *sp = (stream_t *) streamptr;
+
+  if (!sp) return;
+
+  fprintf(fp,
+          "#\n"
+          "# streamID %d\n"
+          "#\n"
+          "self          = %d\n"
+          "accesstype    = %d\n"
+          "accessmode    = %d\n"
+          "filetype      = %d\n"
+          "byteorder     = %d\n"
+          "fileID        = %d\n"
+          "filemode      = %d\n"
+          "filename      = %s\n"
+          "nrecs         = %d\n"
+          "nvars         = %d\n"
+          "varsAllocated = %d\n"
+          "curTsID       = %d\n"
+          "rtsteps       = %d\n"
+          "ntsteps       = %ld\n"
+          "tstepsTableSize= %d\n"
+          "tstepsNextID  = %d\n"
+          "ncmode        = %d\n"
+          "vlistID       = %d\n"
+          "globalatts    = %d\n"
+          "localatts     = %d\n"
+          "unreduced     = %d\n"
+          "sortname      = %d\n"
+          "have_missval  = %d\n"
+          "ztype         = %d\n"
+          "zlevel        = %d\n",
+          sp->self, sp->self, sp->accesstype, sp->accessmode, sp->filetype, sp->byteorder, sp->fileID, sp->filemode, sp->filename,
+          sp->nrecs, sp->nvars, sp->varsAllocated, sp->curTsID, sp->rtsteps, sp->ntsteps, sp->tstepsTableSize, sp->tstepsNextID,
+          sp->ncmode, sp->vlistID, sp->globalatts, sp->localatts, sp->unreduced, sp->sortname, sp->have_missval, sp->comptype,
+          sp->complevel);
+}
+
+enum
+{
+  streamNint = 10,
+};
+
+static int
+streamGetPackSize(void *voidP, void *context)
+{
+  stream_t *streamP = (stream_t *) voidP;
+  int packBufferSize = serializeGetSize(streamNint, CDI_DATATYPE_INT, context) + serializeGetSize(2, CDI_DATATYPE_UINT32, context)
+                       + serializeGetSize((int) strlen(streamP->filename) + 1, CDI_DATATYPE_TXT, context)
+                       + serializeGetSize(1, CDI_DATATYPE_FLT64, context);
+  return packBufferSize;
+}
+
+static void
+streamPack(void *streamptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  stream_t *streamP = (stream_t *) streamptr;
+  int intBuffer[streamNint];
+
+  intBuffer[0] = streamP->self;
+  intBuffer[1] = streamP->filetype;
+  intBuffer[2] = (int) strlen(streamP->filename) + 1;
+  intBuffer[3] = streamP->vlistID;
+  intBuffer[4] = streamP->byteorder;
+  intBuffer[5] = streamP->comptype;
+  intBuffer[6] = streamP->complevel;
+  intBuffer[7] = streamP->unreduced;
+  intBuffer[8] = streamP->sortname;
+  intBuffer[9] = streamP->have_missval;
+
+  serializePack(intBuffer, streamNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context);
+  uint32_t d = cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer);
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+
+  serializePack(&CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+  serializePack(streamP->filename, intBuffer[2], CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
+  d = cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], streamP->filename);
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+}
+
+struct streamAssoc
+streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context)
+{
+  int intBuffer[streamNint];
+  uint32_t d;
+  char filename[CDI_MAX_NAME];
+
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, streamNint, CDI_DATATYPE_INT, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+  xassert(cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer) == d);
+
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &filename, intBuffer[2], CDI_DATATYPE_TXT, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+  xassert(d == cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], filename));
+  int targetStreamID = namespaceAdaptKey(intBuffer[0], originNamespace),
+      streamID = streamOpenID(filename, 'w', intBuffer[1], targetStreamID);
+  xassert(streamID >= 0 && targetStreamID == streamID);
+  streamDefByteorder(streamID, intBuffer[4]);
+  streamDefCompType(streamID, intBuffer[5]);
+  streamDefCompLevel(streamID, intBuffer[6]);
+  stream_t *streamptr = stream_to_pointer(streamID);
+  streamptr->unreduced = intBuffer[7];
+  streamptr->sortname = intBuffer[8];
+  streamptr->have_missval = intBuffer[9];
+  struct streamAssoc retval = { streamID, intBuffer[3] };
+  return retval;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+// the single image implementation
+int
+cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals)
+{
+  // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing.
+  // A value > 0 is returned in this case, otherwise it returns zero.
+  int status = 0;
+
+  if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID);
+
+  check_parg(data);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!");
+
+  // check taxis
+  if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0);
+
+  const int filetype = streamptr->filetype;
+
+  if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvWriteVarDP(streamptr, varID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extWriteVarDP(streamptr, varID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegWriteVarDP(streamptr, varID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype));
+    }
+
+  return status;
+}
+
+/*
+@Function  streamWriteVar
+@Title     Write a variable
+
+@Prototype void streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  varID     Variable identifier.
+    @Item  data      Pointer to a block of double precision floating point data values to be written.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamWriteVar writes the values of one time step of a variable to an open dataset.
+The values are converted to the external data type of the variable, if necessary.
+@EndFunction
+*/
+void
+streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals)
+{
+  void (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals)
+      = (void (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func;
+
+  myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) data, numMissVals);
+}
+
+/*
+@Function  streamWriteVarF
+@Title     Write a variable
+
+@Prototype void streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  varID     Variable identifier.
+    @Item  data      Pointer to a block of single precision floating point data values to be written.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamWriteVarF writes the values of one time step of a variable to an open dataset.
+The values are converted to the external data type of the variable, if necessary.
+@EndFunction
+*/
+void
+streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals)
+{
+  int (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals)
+      = (int (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func;
+
+  if (myCdiStreamWriteVar_(streamID, varID, MEMTYPE_FLOAT, (const void *) data, numMissVals))
+    {
+      // In case the file format does not support single precision writing,
+      // we fall back to double precision writing, converting the data on the fly.
+      const int vlistID = streamInqVlist(streamID);
+      SizeType elementCount = gridInqSize(vlistInqVarGrid(vlistID, varID));
+      elementCount *= (SizeType) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
+      double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer));
+      for (SizeType i = elementCount; i--;) conversionBuffer[i] = data[i];
+      myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) conversionBuffer, numMissVals);
+      Free(conversionBuffer);
+    }
+}
+
+static int
+cdiStreamWriteVarSlice(int streamID, int varID, int levelID, int memtype, const void *data, SizeType numMissVals)
+{
+  // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing.
+  // A value > 0 is returned in this case, otherwise it returns zero.
+  int status = 0;
+
+  if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID);
+
+  check_parg(data);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!");
+
+  // check taxis
+  if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0);
+
+  const int filetype = streamptr->filetype;
+
+  if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype));
+    }
+
+  return status;
+}
+
+/*
+@Function  streamWriteVarSlice
+@Title     Write a horizontal slice of a variable
+
+@Prototype void streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  varID     Variable identifier.
+    @Item  levelID   Level identifier.
+    @Item  data      Pointer to a block of double precision floating point data values to be written.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamWriteVarSlice writes the values of a horizontal slice of a variable to an open dataset.
+The values are converted to the external data type of the variable, if necessary.
+@EndFunction
+*/
+void
+streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals)
+{
+  cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals);
+}
+
+/*
+@Function  streamWriteVarSliceF
+@Title     Write a horizontal slice of a variable
+
+@Prototype void streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  varID     Variable identifier.
+    @Item  levelID   Level identifier.
+    @Item  data      Pointer to a block of single precision floating point data values to be written.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamWriteVarSliceF writes the values of a horizontal slice of a variable to an open dataset.
+The values are converted to the external data type of the variable, if necessary.
+@EndFunction
+*/
+void
+streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals)
+{
+  if (cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, (const void *) data, numMissVals))
+    {
+      // In case the file format does not support single precision writing,
+      // we fall back to double precision writing, converting the data on the fly.
+      const SizeType elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer));
+      for (SizeType i = elementCount; i--;) conversionBuffer[i] = (double) data[i];
+      streamWriteVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals);
+      Free(conversionBuffer);
+    }
+}
+
+void
+streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double *data, SizeType numMissVals)
+{
+  void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data,
+                                    SizeType numMissVals)
+      = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_)
+            .func;
+  myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_DOUBLE, rect, data, numMissVals);
+}
+
+void
+streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float *data, SizeType numMissVals)
+{
+  void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data,
+                                    SizeType numMissVals)
+      = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_)
+            .func;
+  myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_FLOAT, rect, data, numMissVals);
+}
+
+// single image implementation
+void
+cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  // streamDefineTaxis(streamID);
+
+  const int filetype = streamptr->filetype;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#if defined(HAVE_LIBGRIB)
+    case CDI_FILETYPE_GRIB:
+#endif
+#if defined(HAVE_LIBSERVICE)
+    case CDI_FILETYPE_SRV:
+#endif
+#if defined(HAVE_LIBEXTRA)
+    case CDI_FILETYPE_EXT:
+#endif
+#if defined(HAVE_LIBIEG)
+    case CDI_FILETYPE_IEG:
+#endif
+#if defined(HAVE_LIBGRIB) || defined(HAVE_LIBSERVICE) || defined(HAVE_LIBEXTRA) || defined(HAVE_LIBIEG)
+      xabort("streamWriteVarChunk not implemented for filetype %s!", strfiletype(filetype));
+      break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_write_var_chunk(streamptr, varID, memtype, rect, data, (size_t) numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype)); break;
+    }
+}
+
+static void
+stream_write_record(int streamID, int memtype, const void *data, SizeType numMissVals)
+{
+  check_parg(data);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  switch (cdiBaseFiletype(streamptr->filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_write_record(streamptr, memtype, data, (size_t) numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srv_write_record(streamptr, memtype, data); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: ext_write_record(streamptr, memtype, data); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: ieg_write_record(streamptr, memtype, data); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_write_record(streamptr, memtype, data, (size_t) numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(streamptr->filetype));
+    }
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+}
+
+/*
+@Function  streamWriteRecord
+@Title     Write a horizontal slice of a variable
+
+@Prototype void streamWriteRecord(int streamID, const double *data, SizeType numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  data      Pointer to a block of double precision floating point data values to be written.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamWriteRecord writes the values of a horizontal slice (record) of a variable to an open dataset.
+The values are converted to the external data type of the variable, if necessary.
+@EndFunction
+*/
+void
+streamWriteRecord(int streamID, const double *data, SizeType numMissVals)
+{
+  stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, numMissVals);
+}
+
+void
+streamWriteRecordF(int streamID, const float *data, SizeType numMissVals)
+{
+  stream_write_record(streamID, MEMTYPE_FLOAT, (const void *) data, numMissVals);
+}
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+// the single image implementation
+static int
+cdiStreamReadVar(int streamID, int varID, int memtype, void *data, size_t *numMissVals)
+{
+  // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision reading.
+  // A value > 0 is returned in this case, otherwise it returns zero.
+  int status = 0;
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamID, varID);
+
+  check_parg(data);
+  check_parg(numMissVals);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  const int filetype = streamptr->filetype;
+
+  *numMissVals = 0;
+
+  if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_read_var(streamptr, varID, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvReadVarDP(streamptr, varID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extReadVarDP(streamptr, varID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegReadVarDP(streamptr, varID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_read_var(streamptr, varID, memtype, data, numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype));
+    }
+
+  return status;
+}
+
+/*
+@Function  streamReadVar
+@Title     Read a variable
+
+@Prototype void streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead}.
+    @Item  varID     Variable identifier.
+    @Item  data      Pointer to the location into which the data values are read.
+                     The caller must allocate space for the returned values.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamReadVar reads all the values of one time step of a variable
+from an open dataset.
+@EndFunction
+*/
+void
+streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  cdiStreamReadVar(streamID, varID, MEMTYPE_DOUBLE, data, &numMiss);
+  *numMissVals = (SizeType) numMiss;
+}
+
+/*
+@Function  streamReadVarF
+@Title     Read a variable
+
+@Prototype void streamReadVar(int streamID, int varID, float *data, SizeType *numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead}.
+    @Item  varID     Variable identifier.
+    @Item  data      Pointer to the location into which the data values are read.
+                     The caller must allocate space for the returned values.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamReadVar reads all the values of one time step of a variable
+from an open dataset.
+@EndFunction
+*/
+void
+streamReadVarF(int streamID, int varID, float *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  if (cdiStreamReadVar(streamID, varID, MEMTYPE_FLOAT, data, &numMiss))
+    {
+      // In case the file format does not support single precision reading,
+      // we fall back to double precision reading, converting the data on the fly.
+      size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      elementCount *= (size_t) zaxisInqSize(vlistInqVarZaxis(streamInqVlist(streamID), varID));
+      double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
+      streamReadVar(streamID, varID, conversionBuffer, numMissVals);
+      for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i];
+      Free(conversionBuffer);
+    }
+  *numMissVals = (SizeType) numMiss;
+}
+
+static int
+cdiStreamReadVarSlice(int streamID, int varID, int levelID, int memtype, void *data, size_t *numMissVals)
+{
+  // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision reading.
+  // A value > 0 is returned in this case, otherwise it returns zero.
+  int status = 0;
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamID, varID);
+
+  check_parg(data);
+  check_parg(numMissVals);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  const int filetype = streamptr->filetype;
+
+  *numMissVals = 0;
+
+  if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1;
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_read_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_read_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype));
+    }
+
+  return status;
+}
+
+/*
+@Function  streamReadVarSlice
+@Title     Read a horizontal slice of a variable
+
+@Prototype void streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead}.
+    @Item  varID     Variable identifier.
+    @Item  levelID   Level identifier.
+    @Item  data      Pointer to the location into which the data values are read.
+                     The caller must allocate space for the returned values.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamReadVarSlice reads all the values of a horizontal slice of a variable
+from an open dataset.
+@EndFunction
+*/
+void
+streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, data, &numMiss))
+    {
+      Warning("Unexpected error returned from cdiStreamReadVarSlice()!");
+      size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      memset(data, 0, elementCount * sizeof(*data));
+    }
+  *numMissVals = (SizeType) numMiss;
+}
+
+/*
+@Function  streamReadVarSliceF
+@Title     Read a horizontal slice of a variable
+
+@Prototype void streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenRead}.
+    @Item  varID     Variable identifier.
+    @Item  levelID   Level identifier.
+    @Item  data      Pointer to the location into which the data values are read.
+                     The caller must allocate space for the returned values.
+    @Item  numMissVals     Number of missing values.
+
+@Description
+The function streamReadVarSliceF reads all the values of a horizontal slice of a variable
+from an open dataset.
+@EndFunction
+*/
+void
+streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, data, &numMiss))
+    {
+      // In case the file format does not support single precision reading,
+      // we fall back to double precision reading, converting the data on the fly.
+      size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID));
+      double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer));
+      streamReadVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals);
+      for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i];
+      Free(conversionBuffer);
+    }
+  *numMissVals = (SizeType) numMiss;
+}
+
+static void
+stream_read_record(int streamID, int memtype, void *data, size_t *numMissVals)
+{
+  check_parg(data);
+  check_parg(numMissVals);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  if (streamptr->lockIO) CDI_IO_LOCK();
+
+  *numMissVals = 0;
+
+  switch (cdiBaseFiletype(streamptr->filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grb_read_record(streamptr, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srv_read_record(streamptr, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: ext_read_record(streamptr, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: ieg_read_record(streamptr, memtype, data, numMissVals); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdf_read_record(streamptr, memtype, data, numMissVals); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(streamptr->filetype));
+    }
+
+  if (streamptr->lockIO) CDI_IO_UNLOCK();
+}
+
+void
+streamReadRecord(int streamID, double *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  stream_read_record(streamID, MEMTYPE_DOUBLE, (void *) data, &numMiss);
+  *numMissVals = (SizeType) numMiss;
+}
+
+void
+streamReadRecordF(int streamID, float *data, SizeType *numMissVals)
+{
+  size_t numMiss = 0;
+  stream_read_record(streamID, MEMTYPE_FLOAT, (void *) data, &numMiss);
+  *numMissVals = (SizeType) numMiss;
+}
+#ifndef VARSCAN_H
+#define VARSCAN_H
+
+#ifndef GRID_H
+#endif
+
+void varAddRecord(int recID, int param, int gridID, int zaxistype, int lbounds, int level1, int level2, int level_sf,
+                  int level_unit, int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name,
+                  const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index);
+
+void varDefVCT(size_t vctsize, double *vctptr);
+void varDefZAxisReference(int nlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE]);
+
+int varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength,
+                const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname,
+                const char *units, int prec, int mode, int ltype1, int ltype2);
+
+void varDefMissval(int varID, double missval);
+void varDefCompType(int varID, int comptype);
+void varDefCompLevel(int varID, int complevel);
+void varDefInst(int varID, int instID);
+int varInqInst(int varID);
+void varDefModel(int varID, int modelID);
+int varInqModel(int varID);
+void varDefTable(int varID, int tableID);
+int varInqTable(int varID);
+
+void varDefKeyInt(int varID, int key, int value);
+void varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length);
+void varDefKeyString(int varID, int key, const char *string);
+
+void varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword);
+void varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword);
+int varOptGribNentries(int varID);
+
+bool zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds,
+                   const char *longname, const char *units, int ltype1, int ltype2);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef CDF_FILTER_H
+#define CDF_FILTER_H
+
+#include <stdio.h>
+#include <stdbool.h>
+
+bool cdf_get_var_filter(int ncid, int varid, char *filterSpec, size_t maxLength);
+
+#endif
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+#include <ctype.h>
+#include <limits.h>
+#include <strings.h>
+
+
+enum VarStatus
+{
+  UndefVar = -1,
+  CoordVar = 0,
+  DataVar = 1,
+};
+
+enum AxisType
+{
+  X_AXIS = 1,
+  Y_AXIS = 2,
+  Z_AXIS = 3,
+  E_AXIS = 4,
+  T_AXIS = 5,
+};
+
+static int axisTypeChar[] = { '?', 'X', 'Y', 'Z', 'E', 'T' };
+
+typedef struct
+{
+  int dimid;    // NetCDF dim ID
+  int ncvarid;  // NetCDF var ID
+  int dimtype;  // AxisType
+  size_t len;   // Dimension size
+  char name[CDI_MAX_NAME];
+} ncdim_t;
+
+#define MAX_COORDVARS 5
+#define MAX_AUXVARS 4
+#define MAX_DIMS_CDF 8
+
+typedef struct
+{
+  int ncid;
+  int varStatus;
+  bool ignoreVar;
+  bool isCubeSphere;
+  bool isCharAxis;
+  bool isXaxis;
+  bool isYaxis;
+  bool isZaxis;
+  bool isTaxis;
+  bool isLon;
+  bool isLat;
+  bool isClimatology;
+  bool hasCalendar;
+  bool hasFormulaterms;
+  bool printWarning;
+  int timetype;
+  int param;
+  int code;
+  int tabnum;
+  int bounds;
+  int gridID;
+  int zaxisID;
+  int gridtype;
+  int zaxistype;
+  int xdim;
+  int ydim;
+  int zdim;
+  int xvarid;
+  int yvarid;
+  int rpvarid;
+  int zvarid;
+  int tvarid;
+  int psvarid;
+  int p0varid;
+  int ncoordvars;
+  int cvarids[MAX_COORDVARS];
+  int coordvarids[MAX_COORDVARS];
+  int auxvarids[MAX_AUXVARS];
+  int nauxvars;
+  int cellarea;
+  int tableID;
+  int truncation;
+  int position;
+  int numLPE;
+  bool missvalDefined;
+  bool fillvalDefined;
+  int xtype;
+  int gmapid;
+  int positive;
+  int ndims;
+  int dimids[MAX_DIMS_CDF];    // Netcdf dimension IDs
+  int dimtypes[MAX_DIMS_CDF];  // AxisType
+  size_t chunks[MAX_DIMS_CDF];
+  bool isChunked;
+  int chunkType;
+  int chunkSize;
+  size_t chunkCacheSize;
+  size_t chunkCacheNelems;
+  float chunkCachePreemption;
+  size_t gridSize;
+  size_t xSize;
+  size_t ySize;
+  int natts;
+  int *atts;
+  size_t vctsize;
+  double *vct;
+  double missval;
+  double fillval;
+  double addoffset;
+  double scalefactor;
+  bool hasFilter;
+  bool hasDeflate;
+  bool hasSzip;
+  bool isUnsigned;
+  bool validrangeDefined;
+  double validrange[2];
+  int typeOfEnsembleForecast;
+  int numberOfForecastsInEnsemble;
+  int perturbationNumber;
+  int unitsLen;
+  char name[CDI_MAX_NAME];
+  char longname[CDI_MAX_NAME];
+  char stdname[CDI_MAX_NAME];
+  char units[CDI_MAX_NAME];
+  char extra[CDI_MAX_NAME];
+  char filterSpec[CDI_MAX_NAME];
+} ncvar_t;
+
+typedef struct
+{
+  char gridfile[8912];
+  unsigned char uuid[CDI_UUID_SIZE];
+  int number_of_grid_used;
+  int timedimid;
+} GridInfo;
+
+static CdiDateTime
+scan_time_string(const char *ptu)
+{
+  int year = 0, month = 0, day = 0;
+  int hour = 0, minute = 0;
+  double fseconds = 0.0;
+  char ch = ' ';
+
+  if (*ptu) sscanf(ptu, "%d-%d-%d%c%d:%d:%lf", &year, &month, &day, &ch, &hour, &minute, &fseconds);
+
+  if (day > 999 && year < 32)
+    {
+      int tmp = year;
+      year = day;
+      day = tmp;
+    }
+
+  int second = (int) fseconds;
+  double aseconds;
+  double ms = modf(fseconds, &aseconds) * 1000;
+  assert(aseconds == second);
+  CdiDateTime datetime;
+  datetime.date.year = year;
+  datetime.date.month = (short) month;
+  datetime.date.day = (short) day;
+  datetime.time.hour = (short) hour;
+  datetime.time.minute = (short) minute;
+  datetime.time.second = (short) second;
+  datetime.time.ms = (short) ms;
+
+  return datetime;
+}
+
+static int
+scan_time_units(const char *unitstr)
+{
+  int timeunit = get_time_units(strlen(unitstr), unitstr);
+  if (timeunit == -1) Warning("Unsupported TIMEUNIT: %s!", unitstr);
+  return timeunit;
+}
+
+static void
+set_forecast_time(const char *timestr, taxis_t *taxis)
+{
+  if (strlen(timestr) != 0)
+    taxis->fDateTime = scan_time_string(timestr);
+  else
+    cdiDateTime_init(&(taxis->fDateTime));
+}
+
+static int
+set_base_time(const char *timeUnitsStr, taxis_t *taxis)
+{
+  int taxisType = TAXIS_ABSOLUTE;
+
+  size_t len = strlen(timeUnitsStr);
+  while (isspace(*timeUnitsStr) && len)
+    {
+      timeUnitsStr++;
+      len--;
+    }
+  char tmp[32], *tu = tmp;
+  if (len + 1 > sizeof(tmp)) tu = (char *) Malloc(len + 1);
+
+  for (size_t i = 0; i < len; i++) tu[i] = (char) tolower((int) timeUnitsStr[i]);
+  tu[len] = 0;
+
+  int timeUnits = get_time_units(len, tu);
+  if (timeUnits == -1)
+    {
+      Warning("Unsupported TIMEUNIT: %s!", timeUnitsStr);
+      if (tu != tmp) Free(tu);
+      return 1;
+    }
+
+  size_t pos = 0;
+  while (pos < len && !isspace(tu[pos])) ++pos;
+  if (tu[pos])
+    {
+      while (isspace(tu[pos])) ++pos;
+
+      if (strStartsWith(tu + pos, "since")) taxisType = TAXIS_RELATIVE;
+
+      while (pos < len && !isspace(tu[pos])) ++pos;
+      if (tu[pos])
+        {
+          while (isspace(tu[pos])) ++pos;
+
+          if (taxisType == TAXIS_ABSOLUTE)
+            {
+              if (timeUnits == TUNIT_DAY)
+                {
+                  if (!strStartsWith(tu + pos, "%y%m%d.%f"))
+                    {
+                      Warning("Unsupported format %s for TIMEUNIT day!", tu + pos);
+                      timeUnits = -1;
+                    }
+                }
+              else if (timeUnits == TUNIT_MONTH)
+                {
+                  if (!strStartsWith(tu + pos, "%y%m.%f"))
+                    {
+                      Warning("Unsupported format %s for TIMEUNIT month!", tu + pos);
+                      timeUnits = -1;
+                    }
+                }
+              else if (timeUnits == TUNIT_YEAR)
+                {
+                  if (!strStartsWith(tu + pos, "%y.%f"))
+                    {
+                      Warning("Unsupported format %s for TIMEUNIT year!", tu + pos);
+                      timeUnits = -1;
+                    }
+                }
+              else
+                {
+                  Warning("Unsupported format for time units: %s!", tu);
+                }
+            }
+          else if (taxisType == TAXIS_RELATIVE)
+            {
+              taxis->rDateTime = scan_time_string(tu + pos);
+              if (CDI_Debug)
+                Message("rdate = %d  rtime = %d", (int) cdiDate_get(taxis->rDateTime.date), cdiTime_get(taxis->rDateTime.time));
+            }
+        }
+    }
+
+  taxis->type = taxisType;
+  taxis->unit = timeUnits;
+
+  if (tu != tmp) Free(tu);
+
+  if (CDI_Debug) Message("taxisType = %d  timeUnits = %d", taxisType, timeUnits);
+
+  return 0;
+}
+
+bool
+xtypeIsText(int xtype)
+{
+  bool isText = (xtype == NC_CHAR)
+#ifdef HAVE_NETCDF4
+                || (xtype == NC_STRING)
+#endif
+      ;
+  return isText;
+}
+
+static bool
+xtypeIsFloat(nc_type xtype)
+{
+  return (xtype == NC_FLOAT || xtype == NC_DOUBLE);
+}
+
+static bool
+xtypeIsInt(nc_type xtype)
+{
+  bool isInt = xtype == NC_SHORT || xtype == NC_INT || xtype == NC_BYTE
+#ifdef HAVE_NETCDF4
+               || xtype == NC_USHORT || xtype == NC_UINT || xtype == NC_UBYTE
+#endif
+      ;
+
+  return isInt;
+}
+
+static bool
+xtypeIsInt64(nc_type xtype)
+{
+#ifdef HAVE_NETCDF4
+  return (xtype == NC_INT64 || xtype == NC_UINT64);
+#else
+  return false;
+#endif
+}
+
+static int
+cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned)
+{
+  int datatype = -1;
+
+#ifdef HAVE_NETCDF4
+  if (xtype == NC_BYTE && isUnsigned) xtype = NC_UBYTE;
+#endif
+
+  // clang-format off
+  if      (xtype == NC_BYTE  )  datatype = CDI_DATATYPE_INT8;
+  else if (xtype == NC_CHAR  )  datatype = CDI_DATATYPE_UINT8;
+  else if (xtype == NC_SHORT )  datatype = CDI_DATATYPE_INT16;
+  else if (xtype == NC_INT   )  datatype = CDI_DATATYPE_INT32;
+  else if (xtype == NC_FLOAT )  datatype = CDI_DATATYPE_FLT32;
+  else if (xtype == NC_DOUBLE)  datatype = CDI_DATATYPE_FLT64;
+#ifdef HAVE_NETCDF4
+  else if (xtype == NC_UBYTE )  datatype = CDI_DATATYPE_UINT8;
+  else if (xtype == NC_LONG  )  datatype = CDI_DATATYPE_INT32;
+  else if (xtype == NC_USHORT)  datatype = CDI_DATATYPE_UINT16;
+  else if (xtype == NC_UINT  )  datatype = CDI_DATATYPE_UINT32;
+  else if (xtype == NC_INT64 )  datatype = CDI_DATATYPE_FLT64;
+  else if (xtype == NC_UINT64)  datatype = CDI_DATATYPE_FLT64;
+  else
+    {
+      if (xtype != streamptr->nc_complex_float_id && xtype != streamptr->nc_complex_double_id)
+        {
+          bool isUserDefinedType = false;
+#ifdef NC_FIRSTUSERTYPEID
+          isUserDefinedType = (xtype >= NC_FIRSTUSERTYPEID);
+#endif
+          if (isUserDefinedType)
+            {
+              int fileID = streamptr->fileID;
+              size_t nfields = 0, compoundsize = 0;
+              int status = nc_inq_compound(fileID, xtype, NULL, &compoundsize, &nfields);
+              if (status == NC_NOERR && nfields == 2 && (compoundsize == 8 || compoundsize == 16))
+                {
+                  nc_type field_type1 = -1, field_type2 = -1;
+                  int field_dims1 = 0, field_dims2 = 0;
+                  nc_inq_compound_field(fileID, xtype, 0, NULL, NULL, &field_type1, &field_dims1, NULL);
+                  nc_inq_compound_field(fileID, xtype, 1, NULL, NULL, &field_type2, &field_dims2, NULL);
+                  if (field_type1 == field_type2 && field_dims1 == 0 && field_dims2 == 0)
+                    {
+                      if      (field_type1 == NC_FLOAT)  streamptr->nc_complex_float_id = xtype;
+                      else if (field_type1 == NC_DOUBLE) streamptr->nc_complex_double_id = xtype;
+                    }
+                }
+            }
+        }
+      if      (xtype == streamptr->nc_complex_float_id )  datatype = CDI_DATATYPE_CPX32;
+      else if (xtype == streamptr->nc_complex_double_id)  datatype = CDI_DATATYPE_CPX64;
+    }
+#endif
+  // clang-format on
+
+  return datatype;
+}
+
+static void
+cdfGetAttInt(int fileID, int ncvarid, const char *attname, size_t attlen, int *attint)
+{
+  *attint = 0;
+
+  nc_type atttype;
+  size_t nc_attlen;
+  cdf_inq_atttype(fileID, ncvarid, attname, &atttype);
+  cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen);
+
+  if (xtypeIsFloat(atttype) || xtypeIsInt(atttype))
+    {
+      bool needAlloc = (nc_attlen > attlen);
+      int *pintatt = needAlloc ? (int *) Malloc(nc_attlen * sizeof(int)) : attint;
+      cdf_get_att_int(fileID, ncvarid, attname, pintatt);
+      if (needAlloc)
+        {
+          memcpy(attint, pintatt, attlen * sizeof(int));
+          Free(pintatt);
+        }
+    }
+}
+
+static void
+cdfGetAttInt64(int fileID, int ncvarid, const char *attname, size_t attlen, int64_t *attint)
+{
+  *attint = 0;
+
+  nc_type atttype;
+  size_t nc_attlen;
+  cdf_inq_atttype(fileID, ncvarid, attname, &atttype);
+  cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen);
+
+  if (xtypeIsFloat(atttype) || xtypeIsInt(atttype) || xtypeIsInt64(atttype))
+    {
+      long long *plongatt = (long long *) Malloc(nc_attlen * sizeof(long long));
+      cdf_get_att_longlong(fileID, ncvarid, attname, plongatt);
+      for (size_t i = 0; i < attlen; ++i) attint[i] = plongatt[i];
+      Free(plongatt);
+    }
+}
+
+static void
+cdfGetAttDouble(int fileID, int ncvarid, char *attname, size_t attlen, double *attdouble)
+{
+  *attdouble = 0.0;
+
+  nc_type atttype;
+  size_t nc_attlen;
+  cdf_inq_atttype(fileID, ncvarid, attname, &atttype);
+  cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen);
+
+  if (xtypeIsFloat(atttype) || xtypeIsInt(atttype))
+    {
+      bool needAlloc = (nc_attlen > attlen);
+      double *pdoubleatt = needAlloc ? (double *) Malloc(nc_attlen * sizeof(double)) : attdouble;
+      cdf_get_att_double(fileID, ncvarid, attname, pdoubleatt);
+      if (needAlloc)
+        {
+          memcpy(attdouble, pdoubleatt, attlen * sizeof(double));
+          Free(pdoubleatt);
+        }
+    }
+}
+
+static bool
+cdfCheckAttText(int fileID, int ncvarid, const char *attname)
+{
+  nc_type atttype;
+  int status_nc = nc_inq_atttype(fileID, ncvarid, attname, &atttype);
+
+  return (status_nc == NC_NOERR
+          && (atttype == NC_CHAR
+#ifdef HAVE_NETCDF4
+              || atttype == NC_STRING
+#endif
+              ));
+}
+
+static void
+cdfGetAttText(int fileID, int ncvarid, const char *attname, size_t attlen, char *atttext)
+{
+  atttext[0] = 0;
+
+  nc_type atttype;
+  size_t nc_attlen;
+  cdf_inq_atttype(fileID, ncvarid, attname, &atttype);
+  cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen);
+
+  if (atttype == NC_CHAR)
+    {
+      char attbuf[65636];
+      if (nc_attlen < sizeof(attbuf))
+        {
+          cdf_get_att_text(fileID, ncvarid, attname, attbuf);
+
+          if (nc_attlen > (attlen - 1)) nc_attlen = (attlen - 1);
+
+          attbuf[nc_attlen++] = 0;
+          memcpy(atttext, attbuf, nc_attlen);
+        }
+    }
+#ifdef HAVE_NETCDF4
+  else if (atttype == NC_STRING)
+    {
+      if (nc_attlen == 1)
+        {
+          char *attbuf = NULL;
+          cdf_get_att_string(fileID, ncvarid, attname, &attbuf);
+
+          size_t ssize = strlen(attbuf) + 1;
+          if (ssize > attlen) ssize = attlen;
+          memcpy(atttext, attbuf, ssize);
+          atttext[ssize - 1] = 0;
+          Free(attbuf);
+        }
+    }
+#endif
+}
+
+void
+cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor)
+{
+  bool haveAddoffset = IS_NOT_EQUAL(addoffset, 0.0);
+  bool haveScalefactor = IS_NOT_EQUAL(scalefactor, 1.0);
+
+  if (haveAddoffset && haveScalefactor)
+    {
+      for (size_t i = 0; i < size; ++i) data[i] = data[i] * scalefactor + addoffset;
+    }
+  else if (haveScalefactor)
+    {
+      for (size_t i = 0; i < size; ++i) data[i] *= scalefactor;
+    }
+  else if (haveAddoffset)
+    {
+      for (size_t i = 0; i < size; ++i) data[i] += addoffset;
+    }
+}
+
+static int
+cdf_time_dimid(int fileID, int ndims, int nvars, ncdim_t *ncdims)
+{
+  char dimname[CDI_MAX_NAME];
+
+  for (int dimid = 0; dimid < ndims; ++dimid)
+    {
+      dimname[0] = 0;
+      cdf_inq_dimname(fileID, ncdims[dimid].dimid, dimname);
+      if ((dimname[0] == 'T' || dimname[0] == 't') && dimname[1] == 'i' && dimname[2] == 'm' && dimname[3] == 'e') return dimid;
+    }
+
+  for (int varid = 0; varid < nvars; ++varid)
+    {
+      nc_type xtype;
+      int nvdims, nvatts, dimids[9];
+      cdf_inq_var(fileID, varid, NULL, &xtype, &nvdims, dimids, &nvatts);
+      for (int i = 0; i < nvdims; ++i)
+        for (int dimid = 0; dimid < ndims; ++dimid)
+          if (ncdims[dimid].dimid == dimids[i])
+            {
+              dimids[i] = dimid;
+              break;
+            }
+
+      if (nvdims == 1)
+        {
+          char sbuf[CDI_MAX_NAME];
+          for (int iatt = 0; iatt < nvatts; ++iatt)
+            {
+              sbuf[0] = 0;
+              cdf_inq_attname(fileID, varid, iatt, sbuf);
+              if (strStartsWith(sbuf, "units"))
+                {
+                  cdfGetAttText(fileID, varid, "units", sizeof(sbuf), sbuf);
+                  str_to_lower(sbuf);
+
+                  if (is_time_units(sbuf)) return dimids[0];
+                }
+            }
+        }
+    }
+
+  return CDI_UNDEFID;
+}
+
+static void
+init_ncdims(int ndims, ncdim_t *ncdims)
+{
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      ncdim_t *ncdim = &ncdims[ncdimid];
+      ncdim->dimid = CDI_UNDEFID;
+      ncdim->ncvarid = CDI_UNDEFID;
+      ncdim->dimtype = CDI_UNDEFID;
+      ncdim->len = 0;
+      ncdim->name[0] = 0;
+    }
+}
+
+static void
+init_ncvars(int nvars, ncvar_t *ncvars, int ncid)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      ncvar->ncid = ncid;
+      ncvar->varStatus = UndefVar;
+      ncvar->ignoreVar = false;
+      ncvar->isCubeSphere = false;
+      ncvar->isCharAxis = false;
+      ncvar->isXaxis = false;
+      ncvar->isYaxis = false;
+      ncvar->isZaxis = false;
+      ncvar->isTaxis = false;
+      ncvar->isLon = false;
+      ncvar->isLat = false;
+      ncvar->isClimatology = false;
+      ncvar->hasCalendar = false;
+      ncvar->hasFormulaterms = false;
+      ncvar->printWarning = true;
+      ncvar->timetype = TIME_CONSTANT;
+      ncvar->param = CDI_UNDEFID;
+      ncvar->code = CDI_UNDEFID;
+      ncvar->tabnum = 0;
+      ncvar->bounds = CDI_UNDEFID;
+      ncvar->gridID = CDI_UNDEFID;
+      ncvar->zaxisID = CDI_UNDEFID;
+      ncvar->gridtype = CDI_UNDEFID;
+      ncvar->zaxistype = CDI_UNDEFID;
+      ncvar->xdim = CDI_UNDEFID;
+      ncvar->ydim = CDI_UNDEFID;
+      ncvar->zdim = CDI_UNDEFID;
+      ncvar->xvarid = CDI_UNDEFID;
+      ncvar->yvarid = CDI_UNDEFID;
+      ncvar->rpvarid = CDI_UNDEFID;
+      ncvar->zvarid = CDI_UNDEFID;
+      ncvar->tvarid = CDI_UNDEFID;
+      ncvar->psvarid = CDI_UNDEFID;
+      ncvar->p0varid = CDI_UNDEFID;
+      ncvar->ncoordvars = 0;
+      for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->cvarids[i] = CDI_UNDEFID;
+      for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->coordvarids[i] = CDI_UNDEFID;
+      for (int i = 0; i < MAX_AUXVARS; ++i) ncvar->auxvarids[i] = CDI_UNDEFID;
+      ncvar->nauxvars = 0;
+      ncvar->cellarea = CDI_UNDEFID;
+      ncvar->tableID = CDI_UNDEFID;
+      ncvar->truncation = 0;
+      ncvar->position = 0;
+      ncvar->numLPE = 0;
+      ncvar->missvalDefined = false;
+      ncvar->fillvalDefined = false;
+      ncvar->xtype = 0;
+      ncvar->gmapid = CDI_UNDEFID;
+      ncvar->positive = 0;
+      ncvar->ndims = 0;
+      for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimids[i] = CDI_UNDEFID;
+      for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimtypes[i] = CDI_UNDEFID;
+      for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->chunks[i] = 0;
+      ncvar->isChunked = false;
+      ncvar->chunkType = CDI_UNDEFID;
+      ncvar->chunkSize = CDI_UNDEFID;
+      ncvar->chunkCacheSize = 0;
+      ncvar->chunkCacheNelems = 0;
+      ncvar->chunkCachePreemption = 0.0;
+      ncvar->gridSize = 0;
+      ncvar->xSize = 0;
+      ncvar->ySize = 0;
+      ncvar->natts = 0;
+      ncvar->atts = NULL;
+      ncvar->vctsize = 0;
+      ncvar->vct = NULL;
+      ncvar->missval = 0;
+      ncvar->fillval = 0;
+      ncvar->addoffset = 0.0;
+      ncvar->scalefactor = 1.0;
+      ncvar->hasFilter = false;
+      ncvar->hasDeflate = false;
+      ncvar->hasSzip = false;
+      ncvar->isUnsigned = false;
+      ncvar->validrangeDefined = false;
+      ncvar->validrange[0] = VALIDMISS;
+      ncvar->validrange[1] = VALIDMISS;
+      ncvar->typeOfEnsembleForecast = -1;
+      ncvar->numberOfForecastsInEnsemble = -1;
+      ncvar->perturbationNumber = -1;
+      ncvar->unitsLen = 0;
+      memset(ncvar->name, 0, CDI_MAX_NAME);
+      memset(ncvar->longname, 0, CDI_MAX_NAME);
+      memset(ncvar->stdname, 0, CDI_MAX_NAME);
+      memset(ncvar->units, 0, CDI_MAX_NAME);
+      memset(ncvar->extra, 0, CDI_MAX_NAME);
+      memset(ncvar->filterSpec, 0, CDI_MAX_NAME);
+    }
+}
+
+static void
+cdf_set_var(ncvar_t *ncvar, int varStatus)
+{
+  if (ncvar->varStatus != UndefVar && ncvar->varStatus != varStatus && ncvar->printWarning)
+    {
+      if (!ncvar->ignoreVar) Warning("Inconsistent variable definition for %s!", ncvar->name);
+
+      ncvar->printWarning = false;
+      varStatus = CoordVar;
+    }
+
+  ncvar->varStatus = varStatus;
+}
+
+static void
+cdf_set_dim(ncvar_t *ncvar, int dimid, int dimtype)
+{
+  if (ncvar->dimtypes[dimid] != CDI_UNDEFID && ncvar->dimtypes[dimid] != dimtype)
+    {
+      Warning("Inconsistent dimension definition for %s! dimid=%d  type=%c  newtype=%c", ncvar->name, dimid,
+              axisTypeChar[ncvar->dimtypes[dimid]], axisTypeChar[dimtype]);
+    }
+
+  ncvar->dimtypes[dimid] = dimtype;
+}
+
+static void
+scan_hybrid_formulaterms(int ncid, int ncfvarid, int *avarid, int *bvarid, int *psvarid, int *p0varid)
+{
+  *avarid = -1;
+  *bvarid = -1;
+  *psvarid = -1;
+  *p0varid = -1;
+
+  char attstring[1024];
+  cdfGetAttText(ncid, ncfvarid, "formula_terms", sizeof(attstring), attstring);
+  char *pstring = attstring;
+
+  bool lstop = false;
+  for (int i = 0; i < 4; i++)
+    {
+      while (isspace((int) *pstring)) pstring++;
+      if (*pstring == 0) break;
+      char *tagname = pstring;
+      while (!isspace((int) *pstring) && *pstring != 0) pstring++;
+      if (*pstring == 0) lstop = true;
+      *pstring++ = 0;
+
+      while (isspace((int) *pstring)) pstring++;
+      if (*pstring == 0) break;
+      char *varname = pstring;
+      while (!isspace((int) *pstring) && *pstring != 0) pstring++;
+      if (*pstring == 0) lstop = true;
+      *pstring++ = 0;
+
+      int dimvarid;
+      int status_nc = nc_inq_varid(ncid, varname, &dimvarid);
+      if (status_nc == NC_NOERR)
+        {
+          // clang-format off
+          if      (str_is_equal(tagname, "ap:")) *avarid  = dimvarid;
+          else if (str_is_equal(tagname, "a:") ) *avarid  = dimvarid;
+          else if (str_is_equal(tagname, "b:") ) *bvarid  = dimvarid;
+          else if (str_is_equal(tagname, "ps:")) *psvarid = dimvarid;
+          else if (str_is_equal(tagname, "p0:")) *p0varid = dimvarid;
+          // clang-format on
+        }
+      else if (!str_is_equal(tagname, "ps:"))
+        {
+          Warning("%s - %s", nc_strerror(status_nc), varname);
+        }
+
+      if (lstop) break;
+    }
+}
+
+static void
+readVCT(int ncid, int ndims2, size_t dimlen, size_t dimlen2, int avarid2, int bvarid2, double *vct)
+{
+  double *abuf = (double *) Malloc(dimlen * 2 * sizeof(double));
+  double *bbuf = (double *) Malloc(dimlen * 2 * sizeof(double));
+  cdf_get_var_double(ncid, avarid2, abuf);
+  cdf_get_var_double(ncid, bvarid2, bbuf);
+
+  if (ndims2 == 2)
+    {
+      for (size_t i = 0; i < dimlen; ++i)
+        {
+          vct[i] = abuf[i * 2];
+          vct[i + dimlen + 1] = bbuf[i * 2];
+        }
+      vct[dimlen] = abuf[dimlen * 2 - 1];
+      vct[dimlen * 2 + 1] = bbuf[dimlen * 2 - 1];
+    }
+  else
+    {
+      for (size_t i = 0; i < dimlen2; ++i)
+        {
+          vct[i] = abuf[i];
+          vct[i + dimlen + 1] = bbuf[i];
+        }
+    }
+
+  Free(abuf);
+  Free(bbuf);
+}
+
+static bool
+isHybridSigmaPressureCoordinate(int ncid, int ncvarid, ncvar_t *ncvars, const ncdim_t *ncdims)
+{
+  bool status = false;
+  ncvar_t *ncvar = &ncvars[ncvarid];
+
+  if (str_is_equal(ncvar->stdname, "atmosphere_hybrid_sigma_pressure_coordinate"))
+    {
+      CDI_Convention = CDI_CONVENTION_CF;
+
+      status = true;
+      ncvar->zaxistype = ZAXIS_HYBRID;
+      // int ndims = ncvar->ndims;
+      int dimid = ncvar->dimids[0];
+      size_t dimlen = ncdims[dimid].len;
+      int avarid1 = -1, bvarid1 = -1, psvarid1 = -1, p0varid1 = -1;
+      int ncfvarid = ncvarid;
+      if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid1, &bvarid1, &psvarid1, &p0varid1);
+      // printf("avarid1, bvarid1, psvarid1, p0varid1 %d %d %d %d\n", avarid1, bvarid1, psvarid1, p0varid1);
+      if (avarid1 != -1) ncvars[avarid1].varStatus = CoordVar;
+      if (bvarid1 != -1) ncvars[bvarid1].varStatus = CoordVar;
+      if (psvarid1 != -1) ncvar->psvarid = psvarid1;
+      if (p0varid1 != -1) ncvar->p0varid = p0varid1;
+
+      if (ncvar->bounds != CDI_UNDEFID && ncvars[ncvar->bounds].hasFormulaterms)
+        {
+          ncfvarid = ncvar->bounds;
+          int avarid2 = -1, bvarid2 = -1, psvarid2 = -1, p0varid2 = -1;
+          if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid2, &bvarid2, &psvarid2, &p0varid2);
+          // printf("avarid2, bvarid2, psvarid2, p0varid2 %d %d %d %d\n", avarid2, bvarid2, psvarid2, p0varid2);
+          if (avarid2 != -1 && bvarid2 != -1)
+            {
+              ncvars[avarid2].varStatus = CoordVar;
+              ncvars[bvarid2].varStatus = CoordVar;
+
+              int ndims2 = ncvars[avarid2].ndims;
+              int dimid2 = ncvars[avarid2].dimids[0];
+              size_t dimlen2 = ncdims[dimid2].len;
+
+              if ((ndims2 == 2 && dimid == dimid2) || (ndims2 == 1 && dimlen == dimlen2 - 1))
+                {
+                  double px = 1;
+                  if (p0varid1 != -1 && p0varid1 == p0varid2) cdf_get_var_double(ncid, p0varid2, &px);
+
+                  size_t vctsize = (dimlen + 1) * 2;
+                  double *vct = (double *) Malloc(vctsize * sizeof(double));
+
+                  readVCT(ncid, ndims2, dimlen, dimlen2, avarid2, bvarid2, vct);
+
+                  if (p0varid1 != -1 && IS_NOT_EQUAL(px, 1))
+                    for (size_t i = 0; i < dimlen + 1; ++i) vct[i] *= px;
+
+                  ncvar->vct = vct;
+                  ncvar->vctsize = vctsize;
+                }
+            }
+        }
+    }
+
+  return status;
+}
+
+static void
+cdf_set_cdi_attr(int ncid, int ncvarid, int attnum, int cdiID, int varID, bool removeFillValue)
+{
+  nc_type atttype;
+  size_t attlen;
+  char attname[CDI_MAX_NAME];
+
+  cdf_inq_attname(ncid, ncvarid, attnum, attname);
+  cdf_inq_attlen(ncid, ncvarid, attname, &attlen);
+  cdf_inq_atttype(ncid, ncvarid, attname, &atttype);
+
+  if (removeFillValue && str_is_equal("_FillValue", attname)) return;
+
+  if (xtypeIsInt(atttype))
+    {
+      int attint = 0;
+      int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint;
+      cdfGetAttInt(ncid, ncvarid, attname, attlen, pattint);
+      // clang-format off
+      int datatype = (atttype == NC_SHORT)  ? CDI_DATATYPE_INT16 :
+                     (atttype == NC_BYTE)   ? CDI_DATATYPE_INT8 :
+#ifdef HAVE_NETCDF4
+                     (atttype == NC_UBYTE)  ? CDI_DATATYPE_UINT8 :
+                     (atttype == NC_USHORT) ? CDI_DATATYPE_UINT16 :
+                     (atttype == NC_UINT)   ? CDI_DATATYPE_UINT32 :
+#endif
+                                              CDI_DATATYPE_INT32;
+      // clang-format on
+      cdiDefAttInt(cdiID, varID, attname, datatype, (int) attlen, pattint);
+      if (attlen > 1) Free(pattint);
+    }
+  else if (xtypeIsInt64(atttype))
+    {
+      int64_t attint64 = 0;
+      int64_t *pattint64 = (attlen > 1) ? (int64_t *) Malloc(attlen * sizeof(int64_t)) : &attint64;
+      cdfGetAttInt64(ncid, ncvarid, attname, attlen, pattint64);
+      bool defineAtts = true;
+      for (size_t i = 0; i < attlen; ++i)
+        if (pattint64[i] > INT_MAX) defineAtts = false;
+      if (defineAtts)
+        {
+          int attint = 0;
+          int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint;
+          for (size_t i = 0; i < attlen; ++i) pattint[i] = (int) pattint64[i];
+          cdiDefAttInt(cdiID, varID, attname, CDI_DATATYPE_INT32, (int) attlen, pattint);
+          if (attlen > 1) Free(pattint);
+        }
+      if (attlen > 1) Free(pattint64);
+    }
+  else if (xtypeIsFloat(atttype))
+    {
+      double attflt = 0.0;
+      double *pattflt = (attlen > 1) ? (double *) Malloc(attlen * sizeof(double)) : &attflt;
+      cdfGetAttDouble(ncid, ncvarid, attname, attlen, pattflt);
+      int datatype = (atttype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
+      cdiDefAttFlt(cdiID, varID, attname, datatype, (int) attlen, pattflt);
+      if (attlen > 1) Free(pattflt);
+    }
+  else if (xtypeIsText(atttype))
+    {
+      char attstring[8192];
+      cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring);
+      cdiDefAttTxt(cdiID, varID, attname, (int) strlen(attstring), attstring);
+    }
+}
+
+static void
+cdf_print_vars(const ncvar_t *ncvars, int nvars, const char *oname)
+{
+  // clang-format off
+  char axis[7];
+  enum { TAXIS = 't', ZAXIS = 'z', EAXIS = 'e', YAXIS = 'y', XAXIS = 'x' };
+
+  fprintf(stderr, "%s:\n", oname);
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      const ncvar_t *ncvar = &ncvars[ncvarid];
+      int ndim = 0;
+      if (ncvar->varStatus == DataVar)
+        {
+          axis[ndim++] = 'v';
+          axis[ndim++] = ':';
+          for (int i = 0; i < ncvar->ndims; i++)
+            {
+              if      (ncvar->dimtypes[i] == T_AXIS) axis[ndim++] = TAXIS;
+              else if (ncvar->dimtypes[i] == Z_AXIS) axis[ndim++] = ZAXIS;
+              else if (ncvar->dimtypes[i] == E_AXIS) axis[ndim++] = EAXIS;
+              else if (ncvar->dimtypes[i] == Y_AXIS) axis[ndim++] = YAXIS;
+              else if (ncvar->dimtypes[i] == X_AXIS) axis[ndim++] = XAXIS;
+              else                                   axis[ndim++] = '?';
+            }
+        }
+      else
+        {
+          axis[ndim++] = 'c';
+          axis[ndim++] = ':';
+          if      (ncvar->isTaxis) axis[ndim++] = TAXIS;
+          else if (ncvar->isZaxis) axis[ndim++] = ZAXIS;
+          else if (ncvar->isLat  ) axis[ndim++] = YAXIS;
+          else if (ncvar->isYaxis) axis[ndim++] = YAXIS;
+          else if (ncvar->isLon  ) axis[ndim++] = XAXIS;
+          else if (ncvar->isXaxis) axis[ndim++] = XAXIS;
+          else                     axis[ndim++] = '?';
+        }
+
+      axis[ndim++] = 0;
+
+      fprintf(stderr, "%3d %3d  %-6s %s\n", ncvarid, ndim-3, axis, ncvar->name);
+    }
+  // clang-format on
+}
+
+static void
+cdfScanAttrAxis(ncvar_t *ncvars, ncdim_t *ncdims, int ncvarid, const char *attstring, int nvdims, const int *dimidsp)
+{
+  ncvar_t *ncvar = &ncvars[ncvarid];
+  int attlen = (int) strlen(attstring);
+
+  if (nvdims == 0 && attlen == 1)
+    {
+      if (attstring[0] == 'z')
+        {
+          cdf_set_var(ncvar, CoordVar);
+          ncvar->isZaxis = true;
+          return;
+        }
+    }
+
+  if (attlen != nvdims) return;
+
+  static const char accept[] = "-tTzZyYxX";
+  if ((int) strspn(attstring, accept) != attlen) return;
+
+  while (attlen--)
+    {
+      int dimtype;
+      bool setVar = false;
+      switch (attstring[attlen])
+        {
+        case 't':
+        case 'T':
+          if (attlen != 0) Warning("axis attribute 't' not on first position");
+          dimtype = T_AXIS;
+          break;
+        case 'z':
+        case 'Z':
+          ncvar->zdim = dimidsp[attlen];
+          dimtype = Z_AXIS;
+          setVar = (ncvar->ndims == 1);
+          break;
+        case 'y':
+        case 'Y':
+          ncvar->ydim = dimidsp[attlen];
+          dimtype = Y_AXIS;
+          setVar = (ncvar->ndims == 1);
+          break;
+        case 'x':
+        case 'X':
+          ncvar->xdim = dimidsp[attlen];
+          dimtype = X_AXIS;
+          setVar = (ncvar->ndims == 1);
+          break;
+        default: continue;
+        }
+      cdf_set_dim(ncvar, attlen, dimtype);
+
+      if (setVar)
+        {
+          cdf_set_var(ncvar, CoordVar);
+          ncdims[ncvar->dimids[0]].dimtype = dimtype;
+        }
+    }
+}
+
+static int
+cdf_get_cell_varid(char *attstring, int ncid)
+{
+  int nc_cell_id = CDI_UNDEFID;
+
+  char *pstring = attstring;
+  while (isspace((int) *pstring)) pstring++;
+  char *cell_measures = pstring;
+  while (isalnum((int) *pstring)) pstring++;
+  *pstring++ = 0;
+  while (isspace((int) *pstring)) pstring++;
+  char *cell_var = pstring;
+  while (!isspace((int) *pstring) && *pstring != 0) pstring++;
+  *pstring++ = 0;
+  /*
+    printf("cell_measures >%s<\n", cell_measures);
+    printf("cell_var >%s<\n", cell_var);
+  */
+  if (strStartsWith(cell_measures, "area"))
+    {
+      int nc_var_id;
+      int status = nc_inq_varid(ncid, cell_var, &nc_var_id);
+      if (status == NC_NOERR) nc_cell_id = nc_var_id;
+      /*
+      else
+        Warning("%s - %s", nc_strerror(status), cell_var);
+      */
+    }
+
+  return nc_cell_id;
+}
+
+static void
+set_extra_attr(char *buf, int nvdims, const size_t *chunks)
+{
+  size_t pos = strlen(buf);
+  static const char prefix[] = "chunks=";
+  memcpy(buf + pos, prefix, sizeof(prefix));
+  pos += sizeof(prefix) - 1;
+  for (int i = nvdims - 1; i >= 0; --i)
+    {
+      pos += (size_t) (snprintf(buf + pos, CDI_MAX_NAME - pos, "%zu%s", chunks[i], i > 0 ? "x" : ""));
+    }
+  buf[pos] = ' ';
+  buf[pos + 1] = 0;
+}
+
+static bool
+is_valid_coordinate(ncvar_t *ncvar)
+{
+  bool status = true;
+  if (ncvar->ndims > 1 && (str_is_equal(ncvar->name, "zg") || str_is_equal(ncvar->name, "zghalf"))) status = false;
+  return status;
+}
+
+#if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic warning "-Wstrict-overflow"
+#endif
+
+static void
+cdfScanVarAttr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int timedimid, int modelID, int format)
+{
+  int nvdims, nvatts;
+  nc_type xtype, atttype;
+  size_t attlen;
+  char name[CDI_MAX_NAME];
+  char attname[CDI_MAX_NAME];
+  char attstring[8192];
+
+  int nchecked_vars = 0;
+  enum
+  {
+    max_check_vars = 9
+  };
+  char *checked_vars[max_check_vars];
+  for (int i = 0; i < max_check_vars; ++i) checked_vars[i] = NULL;
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int ncid = ncvar->ncid;
+      int *dimidsp = ncvar->dimids;
+
+      cdf_inq_var(ncid, ncvarid, name, &xtype, &nvdims, dimidsp, &nvatts);
+      for (int i = 0; i < nvdims; ++i)
+        for (int dimid = 0; dimid < ndims; ++dimid)
+          if (ncdims[dimid].dimid == dimidsp[i])
+            {
+              dimidsp[i] = dimid;
+              break;
+            }
+      strcpy(ncvar->name, name);
+
+      for (int ncdimid = 0; ncdimid < nvdims; ncdimid++) ncvar->dimtypes[ncdimid] = -1;
+
+      ncvar->xtype = xtype;
+      ncvar->ndims = nvdims;
+
+#ifdef HAVE_NETCDF4
+      if (format == NC_FORMAT_NETCDF4_CLASSIC || format == NC_FORMAT_NETCDF4)
+        {
+          int shuffle = 0, deflate = 0, deflateLevel = 0;
+          nc_inq_var_deflate(ncid, ncvarid, &shuffle, &deflate, &deflateLevel);
+          if (deflate > 0) ncvar->hasDeflate = true;
+
+#ifdef HAVE_NC_DEF_VAR_SZIP
+          int options_mask = 0, pixels_per_block = 0;
+          nc_inq_var_szip(ncid, ncvarid, &options_mask, &pixels_per_block);
+          if (options_mask && pixels_per_block) ncvar->hasSzip = true;
+#endif
+          ncvar->hasFilter = cdf_get_var_filter(ncid, ncvarid, ncvar->filterSpec, CDI_MAX_NAME);
+          // if (ncvar->hasFilter) printf("filterSpec: %s=%s\n", ncvar->name, ncvar->filterSpec);
+
+          size_t chunks[nvdims];
+          int storageIn;
+          if (nc_inq_var_chunking(ncid, ncvarid, &storageIn, chunks) == NC_NOERR)
+            {
+              if (storageIn == NC_CHUNKED)
+                {
+                  ncvar->isChunked = true;
+                  for (int i = 0; i < nvdims; ++i) ncvar->chunks[i] = chunks[i];
+                  if (CDI_Debug)
+                    {
+                      fprintf(stderr, "%s: chunking %d %d %d  chunks ", name, storageIn, NC_CONTIGUOUS, NC_CHUNKED);
+                      for (int i = 0; i < nvdims; ++i) fprintf(stderr, "%zu ", chunks[i]);
+                      fprintf(stderr, "\n");
+                    }
+
+                  set_extra_attr(ncvar->extra, nvdims, chunks);
+                }
+            }
+
+          size_t size;
+          size_t nelems;
+          float preemption;
+          if (nc_get_var_chunk_cache(ncid, ncvarid, &size, &nelems, &preemption) == NC_NOERR)
+            {
+              ncvar->chunkCacheSize = size;
+              ncvar->chunkCacheNelems = nelems;
+              ncvar->chunkCachePreemption = preemption;
+              if (CDI_Debug) fprintf(stderr, "%s: chunkCacheSize=%zu nelems=%zu preemption=%g\n", name, size, nelems, preemption);
+            }
+        }
+#endif
+
+      if (nvdims > 0)
+        {
+          if (timedimid == dimidsp[0])
+            {
+              ncvar->timetype = TIME_VARYING;
+              cdf_set_dim(ncvar, 0, T_AXIS);
+            }
+          else
+            {
+              for (int ncdimid = 1; ncdimid < nvdims; ncdimid++)
+                {
+                  if (timedimid == dimidsp[ncdimid])
+                    {
+                      Warning("Time must be the first dimension! Unsupported array structure, skipped variable %s!", ncvar->name);
+                      ncvar->varStatus = CoordVar;
+                    }
+                }
+            }
+        }
+    }
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int ncid = ncvar->ncid;
+      int *dimidsp = ncvar->dimids;
+
+      cdf_inq_var(ncid, ncvarid, name, &xtype, &nvdims, dimidsp, &nvatts);
+
+      if (ncvar->natts == 0 && nvatts > 0) ncvar->atts = (int *) Malloc((size_t) nvatts * sizeof(int));
+
+      for (int iatt = 0; iatt < nvatts; ++iatt)
+        {
+          int nc_cell_id = CDI_UNDEFID;
+
+          cdf_inq_attname(ncid, ncvarid, iatt, attname);
+          cdf_inq_atttype(ncid, ncvarid, attname, &atttype);
+          cdf_inq_attlen(ncid, ncvarid, attname, &attlen);
+
+          size_t attstringsize = sizeof(attstring);
+          bool isText = xtypeIsText(atttype), isNumber = xtypeIsFloat(atttype) || xtypeIsInt(atttype);
+          bool isRealization = false, isEnsembleMembers = false, isForecastInitType = false;
+          if (isText)
+            {
+              cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring);
+              attstringsize = strlen(attstring) + 1;
+              if (attstringsize > CDI_MAX_NAME) attstringsize = CDI_MAX_NAME;
+            }
+
+          if (isText && str_is_equal(attname, "long_name"))
+            {
+              memcpy(ncvar->longname, attstring, attstringsize);
+            }
+          else if (isText && str_is_equal(attname, "standard_name"))
+            {
+              memcpy(ncvar->stdname, attstring, attstringsize);
+            }
+          else if (isText && str_is_equal(attname, "units"))
+            {
+              ncvar->unitsLen = (int) attstringsize;
+              memcpy(ncvar->units, attstring, attstringsize);
+            }
+          else if (isText && str_is_equal(attname, "calendar"))
+            {
+              ncvar->hasCalendar = true;
+            }
+          else if (isText && str_is_equal(attname, "param"))
+            {
+              int pnum = 0, pcat = 255, pdis = 255;
+              sscanf(attstring, "%d.%d.%d", &pnum, &pcat, &pdis);
+              ncvar->param = cdiEncodeParam(pnum, pcat, pdis);
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "trunc_type"))
+            {
+              if (str_is_equal(attstring, "Triangular")) ncvar->gridtype = GRID_SPECTRAL;
+            }
+          else if (isText && (str_is_equal(attname, "grid_type") || str_is_equal(attname, "CDI_grid_type")))
+            {
+              str_to_lower(attstring);
+              cdf_set_gridtype(attstring, &ncvar->gridtype);
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "CDI_grid_latitudes"))
+            {
+              int nc_yvar_id;
+              int status = nc_inq_varid(ncid, attstring, &nc_yvar_id);
+              if (status == NC_NOERR)
+                {
+                  ncvar->yvarid = nc_yvar_id;
+                  cdf_set_var(&ncvars[ncvar->yvarid], CoordVar);
+                }
+              else
+                Warning("%s - %s", nc_strerror(status), attstring);
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "CDI_grid_reduced_points"))
+            {
+              int nc_rpvar_id;
+              int status = nc_inq_varid(ncid, attstring, &nc_rpvar_id);
+              if (status == NC_NOERR)
+                {
+                  ncvar->rpvarid = nc_rpvar_id;
+                  cdf_set_var(&ncvars[ncvar->rpvarid], CoordVar);
+                }
+              else
+                Warning("%s - %s", nc_strerror(status), attstring);
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "code"))
+            {
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->code);
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "table"))
+            {
+              int tablenum;
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &tablenum);
+              if (tablenum > 0)
+                {
+                  ncvar->tabnum = tablenum;
+                  ncvar->tableID = tableInq(modelID, tablenum, NULL);
+                  if (ncvar->tableID == CDI_UNDEFID) ncvar->tableID = tableDef(modelID, tablenum, NULL);
+                }
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "CDI_grid_num_LPE"))
+            {
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->numLPE);
+            }
+          else if (isText && str_is_equal(attname, "level_type"))
+            {
+              str_to_lower(attstring);
+              cdf_set_zaxistype(attstring, &ncvar->zaxistype);
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "trunc_count"))
+            {
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation);
+            }
+          else if (isNumber && str_is_equal(attname, "truncation"))
+            {
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation);
+            }
+          else if (isNumber && str_is_equal(attname, "number_of_grid_in_reference"))
+            {
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->position);
+            }
+          else if (isNumber && str_is_equal(attname, "add_offset"))
+            {
+              cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->addoffset);
+              /*
+                if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT )
+                if ( ncvar->addoffset != 0 )
+                Warning("attribute add_offset not supported for atttype %d", atttype);
+              */
+              // (also used for lon/lat) cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "scale_factor"))
+            {
+              cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->scalefactor);
+              /*
+                if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT )
+                if ( ncvar->scalefactor != 1 )
+                Warning("attribute scale_factor not supported for atttype %d", atttype);
+              */
+              // (also used for lon/lat) cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "climatology"))
+            {
+              int ncboundsid;
+              int status = nc_inq_varid(ncid, attstring, &ncboundsid);
+              if (status == NC_NOERR)
+                {
+                  ncvar->isClimatology = true;
+                  ncvar->bounds = ncboundsid;
+                  cdf_set_var(&ncvars[ncvar->bounds], CoordVar);
+                  cdf_set_var(ncvar, CoordVar);
+                }
+              else
+                Warning("%s - %s", nc_strerror(status), attstring);
+            }
+          else if (isText && str_is_equal(attname, "bounds"))
+            {
+              int ncboundsid;
+              int status = nc_inq_varid(ncid, attstring, &ncboundsid);
+              if (status == NC_NOERR)
+                {
+                  ncvar->bounds = ncboundsid;
+                  cdf_set_var(&ncvars[ncvar->bounds], CoordVar);
+                  cdf_set_var(ncvar, CoordVar);
+                }
+              else
+                {
+                  static bool printWarning = true;
+                  if (printWarning)
+                    {
+                      printWarning = false;
+                      Warning("%s - %s", nc_strerror(status), attstring);
+                    }
+                }
+            }
+          else if (isText && str_is_equal(attname, "formula_terms"))
+            {
+              ncvar->hasFormulaterms = true;
+            }
+          else if (isText && str_is_equal(attname, "cell_measures")
+                   && (nc_cell_id = cdf_get_cell_varid(attstring, ncid)) != CDI_UNDEFID)
+            {
+              ncvar->cellarea = nc_cell_id;
+              ncvars[nc_cell_id].varStatus = CoordVar;
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && (str_is_equal(attname, "associate") || str_is_equal(attname, "coordinates")))
+            {
+              bool lstop = false;
+              char *pstring = attstring;
+
+              for (int i = 0; i < MAX_COORDVARS && !lstop; i++)
+                {
+                  while (isspace((int) *pstring)) pstring++;
+                  if (*pstring == 0) break;
+                  char *varname = pstring;
+                  while (!isspace((int) *pstring) && *pstring != 0) pstring++;
+                  if (*pstring == 0) lstop = true;
+                  if (*(pstring - 1) == ',') *(pstring - 1) = 0;
+                  *pstring++ = 0;
+
+                  int dimvarid;
+                  int status = nc_inq_varid(ncid, varname, &dimvarid);
+                  if (status == NC_NOERR)
+                    {
+                      if (is_valid_coordinate(&ncvars[dimvarid]))
+                        {
+                          cdf_set_var(&ncvars[dimvarid], CoordVar);
+                          if (!CDI_Ignore_Att_Coordinates)
+                            {
+                              ncvar->coordvarids[i] = dimvarid;
+                              ncvar->ncoordvars++;
+                            }
+                        }
+                    }
+                  else
+                    {
+                      if (!CDI_Ignore_Att_Coordinates) ncvar->ncoordvars++;
+
+                      int k;
+                      for (k = 0; k < nchecked_vars; ++k)
+                        if (str_is_equal(checked_vars[k], varname)) break;
+
+                      if (k == nchecked_vars)
+                        {
+                          if (nchecked_vars < max_check_vars) checked_vars[nchecked_vars++] = strdup(varname);
+                          Warning("%s - >%s<", nc_strerror(status), varname);
+                        }
+                    }
+                }
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "auxiliary_variable"))
+            {
+              bool lstop = false;
+              char *pstring = attstring;
+
+              for (int i = 0; i < MAX_AUXVARS; i++)
+                {
+                  while (isspace((int) *pstring)) pstring++;
+                  if (*pstring == 0) break;
+                  char *varname = pstring;
+                  while (!isspace((int) *pstring) && *pstring != 0) pstring++;
+                  if (*pstring == 0) lstop = true;
+                  *pstring++ = 0;
+
+                  int dimvarid;
+                  int status = nc_inq_varid(ncid, varname, &dimvarid);
+                  if (status == NC_NOERR)
+                    {
+                      cdf_set_var(&ncvars[dimvarid], CoordVar);
+                      //  if ( !CDI_Ignore_Att_Coordinates )
+                      {
+                        ncvar->auxvarids[i] = dimvarid;
+                        ncvar->nauxvars++;
+                      }
+                    }
+                  else
+                    Warning("%s - %s", nc_strerror(status), varname);
+
+                  if (lstop) break;
+                }
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "grid_mapping"))
+            {
+              int nc_gmap_id;
+              int status = nc_inq_varid(ncid, attstring, &nc_gmap_id);
+              if (status == NC_NOERR)
+                {
+                  ncvar->gmapid = nc_gmap_id;
+                  cdf_set_var(&ncvars[ncvar->gmapid], CoordVar);
+                }
+              else
+                Warning("%s - %s", nc_strerror(status), attstring);
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else if (isText && str_is_equal(attname, "positive"))
+            {
+              str_to_lower(attstring);
+
+              if (str_is_equal(attstring, "down"))
+                ncvar->positive = POSITIVE_DOWN;
+              else if (str_is_equal(attstring, "up"))
+                ncvar->positive = POSITIVE_UP;
+
+              if (ncvar->ndims == 1)
+                {
+                  cdf_set_var(ncvar, CoordVar);
+                  cdf_set_dim(ncvar, 0, Z_AXIS);
+                  ncdims[ncvar->dimids[0]].dimtype = Z_AXIS;
+                }
+              else if (ncvar->ndims == 0)
+                {
+                  cdf_set_var(ncvar, CoordVar);
+                  ncvar->isZaxis = true;
+                }
+              else
+                {
+                  ncvar->atts[ncvar->natts++] = iatt;
+                }
+            }
+          else if (isText && str_is_equal(attname, "cdi"))
+            {
+              if (!strcasecmp(attstring, "ignore"))
+                {
+                  ncvar->ignoreVar = true;
+                  cdf_set_var(ncvar, CoordVar);
+                }
+            }
+          else if (isText && str_is_equal(attname, "_Unsigned"))
+            {
+              if (!strcasecmp(attstring, "true"))
+                {
+                  ncvar->isUnsigned = true;
+                  /*
+                  ncvar->validrangeDefined = true;
+                  ncvar->validrange[0] = 0;
+                  ncvar->validrange[1] = 255;
+                  */
+                }
+              // cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "_FillValue"))
+            {
+              cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->fillval);
+              ncvar->fillvalDefined = true;
+              // cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "missing_value"))
+            {
+              cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->missval);
+              ncvar->missvalDefined = true;
+              // cdf_set_var(ncvar, DataVar);
+            }
+          else if (isNumber && str_is_equal(attname, "valid_range") && attlen == 2)
+            {
+              if (ncvar->validrangeDefined == false)
+                {
+                  bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype));
+                  if (!CDI_Ignore_Valid_Range && ignoreDatatype == false)
+                    {
+                      cdfGetAttDouble(ncid, ncvarid, attname, 2, ncvar->validrange);
+                      ncvar->validrangeDefined = (ncvar->validrange[0] <= ncvar->validrange[1]);
+                      if (((int) ncvar->validrange[0]) == 0 && ((int) ncvar->validrange[1]) == 255) ncvar->isUnsigned = true;
+                      // cdf_set_var(ncvar, DataVar);
+                    }
+                  else if (ignoreDatatype)
+                    {
+                      Warning("Inconsistent data type for attribute %s:valid_range, ignored!", name);
+                    }
+                }
+            }
+          else if (isNumber && str_is_equal(attname, "valid_min") && attlen == 1)
+            {
+              bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype));
+              if (!CDI_Ignore_Valid_Range && ignoreDatatype == false)
+                {
+                  cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[0]);
+                  ncvar->validrangeDefined = true;
+                }
+              else if (ignoreDatatype)
+                {
+                  Warning("Inconsistent data type for attribute %s:valid_min, ignored!", name);
+                }
+            }
+          else if (isNumber && str_is_equal(attname, "valid_max") && attlen == 1)
+            {
+              bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype));
+              if (!CDI_Ignore_Valid_Range && ignoreDatatype == false)
+                {
+                  cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[1]);
+                  ncvar->validrangeDefined = true;
+                }
+              else if (ignoreDatatype)
+                {
+                  Warning("Inconsistent data type for attribute %s:valid_max, ignored!", name);
+                }
+            }
+          else if (isNumber
+                   && ((isRealization = str_is_equal(attname, "realization"))
+                       || (isEnsembleMembers = str_is_equal(attname, "ensemble_members"))
+                       || (isForecastInitType = str_is_equal(attname, "forecast_init_type"))))
+            {
+              int temp;
+              cdfGetAttInt(ncid, ncvarid, attname, 1, &temp);
+
+              // clang-format off
+              if      (isRealization)      ncvar->perturbationNumber = temp;
+              else if (isEnsembleMembers)  ncvar->numberOfForecastsInEnsemble = temp;
+              else if (isForecastInitType) ncvar->typeOfEnsembleForecast = temp;
+              // clang-format on
+
+              cdf_set_var(ncvar, DataVar);
+            }
+          else
+            {
+              ncvar->atts[ncvar->natts++] = iatt;
+            }
+        }
+    }
+
+  for (int i = 0; i < max_check_vars; ++i)
+    if (checked_vars[i]) Free(checked_vars[i]);
+}
+#if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9)
+#pragma GCC diagnostic pop
+#endif
+
+static void
+cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar)
+        {
+          int ndims = ncvar->ndims;
+          ncvar->isChunked = true;
+          for (int i = 0; i < ndims; ++i)
+            {
+              size_t chunkSize = ncvar->chunks[i];
+              if (chunkSize > 1)
+                {
+                  int dimType = ncvar->dimtypes[i];
+                  // clang-format off
+                  if      (dimType == T_AXIS && chunkSize > streamptr->chunkSizeTdim) streamptr->chunkSizeTdim = chunkSize;
+                  else if (dimType == Z_AXIS && chunkSize > streamptr->chunkSizeZdim) streamptr->chunkSizeZdim = chunkSize;
+                  // clang-format on
+                }
+            }
+        }
+    }
+}
+
+static void
+cdfVerifyVarAttr(int nvars, ncvar_t *ncvars, ncdim_t *ncdims)
+{
+  nc_type atttype;
+  size_t attlen;
+  char attname[CDI_MAX_NAME];
+  char attstring[8192];
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int ncid = ncvar->ncid;
+      const int *dimidsp = ncvar->dimids;
+      int nvdims = ncvar->ndims;
+      int nvatts = ncvar->natts;
+
+      for (int i = 0; i < nvatts; i++)
+        {
+          int attnum = ncvar->atts[i];
+          cdf_inq_attname(ncid, ncvarid, attnum, attname);
+          cdf_inq_attlen(ncid, ncvarid, attname, &attlen);
+          cdf_inq_atttype(ncid, ncvarid, attname, &atttype);
+
+          size_t attstringsize = sizeof(attstring);
+          bool isText = xtypeIsText(atttype);
+          // bool isNumber = (xtypeIsFloat(atttype) || xtypeIsInt(atttype));
+
+          if (isText)
+            {
+              cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring);
+              attstringsize = strlen(attstring) + 1;
+              if (attstringsize > CDI_MAX_NAME) attstringsize = CDI_MAX_NAME;
+
+              if (str_is_equal(attname, "axis"))
+                {
+                  cdfScanAttrAxis(ncvars, ncdims, ncvarid, attstring, nvdims, dimidsp);
+                }
+              /*
+              else if (str_is_equal(attname, "standard_name"))
+                {
+                  memcpy(ncvar->stdname, attstring, attstringsize);
+                }
+              */
+            }
+        }
+    }
+}
+
+static void
+cdf_set_dimtype(int nvars, ncvar_t *ncvars, ncdim_t *ncdims)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar)
+        {
+          int ndims = ncvar->ndims;
+          for (int i = 0; i < ndims; i++)
+            {
+              int ncdimid = ncvar->dimids[i];
+              int dimtype = ncdims[ncdimid].dimtype;
+              if (dimtype >= X_AXIS && dimtype <= T_AXIS) cdf_set_dim(ncvar, i, dimtype);
+            }
+
+          if (CDI_Debug)
+            {
+              Message("var %d %s", ncvarid, ncvar->name);
+              for (int i = 0; i < ndims; i++) printf("  dim%d type=%d  ", i, ncvar->dimtypes[i]);
+              printf("\n");
+            }
+        }
+    }
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar)
+        {
+          bool lxdim = false, lydim = false, lzdim = false /* , ltdim = false */;
+          int lcdim = 0;
+          int ndims = ncvar->ndims;
+          for (int i = 0; i < ndims; i++)
+            {
+              int dimtype = ncvar->dimtypes[i];
+              lxdim |= (dimtype == X_AXIS);
+              lydim |= (dimtype == Y_AXIS);
+              lzdim |= (dimtype == Z_AXIS);
+              if (ncvar->cvarids[i] != CDI_UNDEFID) lcdim++;
+              // ltdim |= (dimtype == T_AXIS);
+            }
+
+          int allcdims = lcdim;
+
+          if (!lxdim && ncvar->xvarid != CDI_UNDEFID && ncvars[ncvar->xvarid].ndims == 0) lxdim = true;
+          if (!lydim && ncvar->yvarid != CDI_UNDEFID && ncvars[ncvar->yvarid].ndims == 0) lydim = true;
+
+          if (lxdim && (lydim || ncvar->gridtype == GRID_UNSTRUCTURED))
+            for (int i = ndims - 1; i >= 0; i--)
+              {
+                if (ncvar->dimtypes[i] == -1 && !lzdim)
+                  {
+                    if (lcdim)
+                      {
+                        int cdimvar = ncvar->cvarids[allcdims - lcdim];
+                        ncvar->zvarid = cdimvar;
+                        lcdim--;
+                        ncvars[cdimvar].zaxistype = ZAXIS_CHAR;
+                      }
+                    cdf_set_dim(ncvar, i, Z_AXIS);
+                    lzdim = true;
+                    int ncdimid = ncvar->dimids[i];
+                    if (ncdims[ncdimid].dimtype == CDI_UNDEFID) ncdims[ncdimid].dimtype = Z_AXIS;
+                  }
+              }
+        }
+    }
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int ndims = ncvar->ndims;
+      for (int i = 0; i < ndims; i++)
+        {
+          if (ncvar->dimtypes[i] == CDI_UNDEFID)
+            {
+              int ncdimid = ncvar->dimids[i];
+              if (ncdims[ncdimid].dimtype == Z_AXIS)
+                {
+                  ncvar->isZaxis = true;
+                  cdf_set_dim(ncvar, i, Z_AXIS);
+                }
+            }
+        }
+    }
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar)
+        {
+          bool lxdim = false, lydim = false, lzdim = false /*, ltdim = false */;
+          int lcdim = 0;
+          int ndims = ncvar->ndims;
+          for (int i = 0; i < ndims; i++)
+            {
+              int dimtype = ncvar->dimtypes[i];
+              lxdim |= (dimtype == X_AXIS);
+              lydim |= (dimtype == Y_AXIS);
+              lzdim |= (dimtype == Z_AXIS);
+              if (ncvar->cvarids[i] != CDI_UNDEFID) lcdim++;
+              // ltdim |= (dimtype == T_AXIS);
+            }
+
+          int allcdims = lcdim;
+
+          if (!lxdim && ncvar->xvarid != CDI_UNDEFID && ncvars[ncvar->xvarid].ndims == 0) lxdim = true;
+          if (!lydim && ncvar->yvarid != CDI_UNDEFID && ncvars[ncvar->yvarid].ndims == 0) lydim = true;
+
+          //   if ( ndims > 1 )
+          for (int i = ndims - 1; i >= 0; i--)
+            {
+              if (ncvar->dimtypes[i] == -1)
+                {
+                  int dimtype;
+                  if (!lxdim)
+                    {
+                      if (lcdim && ncvar->xvarid == CDI_UNDEFID)
+                        {
+                          int cdimvar = ncvar->cvarids[allcdims - lcdim];
+                          ncvar->xvarid = cdimvar;
+                          lcdim--;
+                        }
+                      dimtype = X_AXIS;
+                      lxdim = true;
+                    }
+                  else if (!lydim && ncvar->gridtype != GRID_UNSTRUCTURED)
+                    // else if ( !lydim && ! (ncvars[ncvar->xvarid].dimids[0] == ncvars[ncvar->yvarid].dimids[0] &&
+                    //                        ncvars[ncvar->xvarid].ndims == 1 && ncvars[ncvar->yvarid].ndims == 1))
+                    {
+                      if (lcdim && ncvar->yvarid == CDI_UNDEFID)
+                        {
+                          int cdimvar = ncvar->cvarids[allcdims - lcdim];
+                          ncvar->yvarid = cdimvar;
+                          lcdim--;
+                        }
+                      dimtype = Y_AXIS;
+                      lydim = true;
+                    }
+                  else if (!lzdim)
+                    {
+                      if (lcdim > 0)
+                        {
+                          int cdimvar = ncvar->cvarids[allcdims - lcdim];
+                          ncvar->zvarid = cdimvar;
+                          lcdim--;
+                          ncvars[cdimvar].zaxistype = ZAXIS_CHAR;
+                        }
+                      dimtype = Z_AXIS;
+                      lzdim = true;
+                    }
+                  else
+                    continue;
+                  cdf_set_dim(ncvar, i, dimtype);
+                }
+            }
+          if (lcdim > 0) Warning("Could not assign all character coordinates to data variable!");
+        }
+    }
+}
+
+static void
+set_vardim_coord(ncvar_t *ncvar, ncdim_t *ncdim, int axisType)
+{
+  cdf_set_var(ncvar, CoordVar);
+  cdf_set_dim(ncvar, 0, axisType);
+  ncdim->dimtype = axisType;
+}
+
+// verify coordinates vars - first scan (dimname == varname)
+static void
+verify_coordinates_vars_1(int ncid, int ndims, ncdim_t *ncdims, ncvar_t *ncvars, int timedimid, bool *isHybridCF)
+{
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      ncdim_t *ncdim = &ncdims[ncdimid];
+      int ncvarid = ncdim->ncvarid;
+      if (ncvarid != -1)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvar->dimids[0] == timedimid)
+            {
+              ncvar->isTaxis = true;
+              ncdim->dimtype = T_AXIS;
+              continue;
+            }
+
+          if (isHybridSigmaPressureCoordinate(ncid, ncvarid, ncvars, ncdims))
+            {
+              *isHybridCF = true;
+              continue;
+            }
+
+          if (ncvar->units[0] != 0)
+            {
+              if (is_lon_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isLon = true;
+                  set_vardim_coord(ncvar, ncdim, X_AXIS);
+                }
+              else if (is_lat_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isLat = true;
+                  set_vardim_coord(ncvar, ncdim, Y_AXIS);
+                }
+              else if (is_x_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isXaxis = true;
+                  set_vardim_coord(ncvar, ncdim, X_AXIS);
+                }
+              else if (is_y_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isYaxis = true;
+                  set_vardim_coord(ncvar, ncdim, Y_AXIS);
+                }
+              else if (is_pressure_units(ncvar->units))
+                {
+                  ncvar->zaxistype = ZAXIS_PRESSURE;
+                }
+              else if (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1"))
+                {
+                  // clang-format off
+                  if      (str_is_equal(ncvar->longname, "hybrid level at layer midpoints"))        ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (str_is_equal(ncvar->longname, "hybrid model level at layer midpoints"))  ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (strStartsWith(ncvar->longname, "hybrid level at midpoints"))             ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (str_is_equal(ncvar->longname, "hybrid level at layer interfaces"))       ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (str_is_equal(ncvar->longname, "hybrid model level at layer interfaces")) ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (strStartsWith(ncvar->longname, "hybrid level at interfaces"))            ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (str_is_equal(ncvar->units, "level"))                                     ncvar->zaxistype = ZAXIS_GENERIC;
+                  // clang-format on
+                }
+              else if (is_DBL_axis(ncvar->longname))
+                {
+                  ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND;
+                }
+              else if (is_height_units(ncvar->units))
+                {
+                  // clang-format off
+                  if      (is_depth_axis(ncvar->stdname, ncvar->longname))    ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA;
+                  else if (is_height_axis(ncvar->stdname, ncvar->longname))   ncvar->zaxistype = ZAXIS_HEIGHT;
+                  else if (is_altitude_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_ALTITUDE;
+                  // clang-format on
+                }
+            }
+          else
+            {
+              // clang-format off
+              if      (is_reference_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_REFERENCE;
+              else if (str_is_equal(ncvar->stdname, "air_pressure"))       ncvar->zaxistype = ZAXIS_PRESSURE;
+              // clang-format on
+            }
+
+          if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0))
+            {
+              if (strStartsWith(ncvar->longname + 1, "ongitude"))
+                {
+                  ncvar->isLon = true;
+                  set_vardim_coord(ncvar, ncdim, X_AXIS);
+                  continue;
+                }
+              else if (strStartsWith(ncvar->longname + 1, "atitude"))
+                {
+                  ncvar->isLat = true;
+                  set_vardim_coord(ncvar, ncdim, Y_AXIS);
+                  continue;
+                }
+            }
+
+          if (ncvar->zaxistype != CDI_UNDEFID)
+            {
+              ncvar->isZaxis = true;
+              set_vardim_coord(ncvar, ncdim, Z_AXIS);
+            }
+        }
+    }
+}
+
+// verify coordinates vars - second scan (all other variables)
+static void
+verify_coordinates_vars_2(stream_t *streamptr, int nvars, ncvar_t *ncvars)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == CoordVar)
+        {
+          if (ncvar->units[0] != 0)
+            {
+              if (is_lon_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isLon = true;
+                  continue;
+                }
+              else if (is_lat_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isLat = true;
+                  continue;
+                }
+              else if (is_x_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isXaxis = true;
+                  continue;
+                }
+              else if (is_y_axis(ncvar->units, ncvar->stdname))
+                {
+                  ncvar->isYaxis = true;
+                  continue;
+                }
+              else if (ncvar->zaxistype == CDI_UNDEFID && (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1")))
+                {
+                  // clang-format off
+                  if      (str_is_equal(ncvar->longname, "hybrid level at layer midpoints"))        ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (str_is_equal(ncvar->longname, "hybrid model level at layer midpoints"))  ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (strStartsWith(ncvar->longname, "hybrid level at midpoints"))             ncvar->zaxistype = ZAXIS_HYBRID;
+                  else if (str_is_equal(ncvar->longname, "hybrid level at layer interfaces"))       ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (str_is_equal(ncvar->longname, "hybrid model level at layer interfaces")) ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (strStartsWith(ncvar->longname, "hybrid level at interfaces"))            ncvar->zaxistype = ZAXIS_HYBRID_HALF;
+                  else if (str_is_equal(ncvar->units, "level"))                                     ncvar->zaxistype = ZAXIS_GENERIC;
+                  // clang-format on
+                  continue;
+                }
+              else if (ncvar->zaxistype == CDI_UNDEFID && is_pressure_units(ncvar->units))
+                {
+                  ncvar->zaxistype = ZAXIS_PRESSURE;
+                  continue;
+                }
+              else if (is_DBL_axis(ncvar->longname))
+                {
+                  ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND;
+                  continue;
+                }
+              else if (is_height_units(ncvar->units))
+                {
+                  // clang-format off
+                  if      (is_depth_axis(ncvar->stdname, ncvar->longname))  ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA;
+                  else if (is_height_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_HEIGHT;
+                  // clang-format on
+                  continue;
+                }
+            }
+          else if (str_is_equal(ncvar->stdname, "region") || str_is_equal(ncvar->stdname, "area_type")
+                   || cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == CDI_DATATYPE_UINT8)
+            {
+              ncvar->isCharAxis = true;
+            }
+          else if (str_is_equal(ncvar->stdname, "air_pressure"))
+            ncvar->zaxistype = ZAXIS_PRESSURE;
+
+          // not needed anymore for rotated grids
+          if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0))
+            {
+              if (strStartsWith(ncvar->longname + 1, "ongitude"))
+                {
+                  ncvar->isLon = true;
+                  continue;
+                }
+              else if (strStartsWith(ncvar->longname + 1, "atitude"))
+                {
+                  ncvar->isLat = true;
+                  continue;
+                }
+            }
+        }
+    }
+}
+
+static void
+grid_set_chunktype(grid_t *grid, ncvar_t *ncvar)
+{
+  if (ncvar->isChunked)
+    {
+      int ndims = ncvar->ndims;
+
+      if (grid->type == GRID_UNSTRUCTURED)
+        {
+          size_t chunkSize = ncvar->chunks[ndims - 1];
+          ncvar->chunkType = (chunkSize == grid->size) ? CDI_CHUNK_GRID : CDI_CHUNK_AUTO;
+          if (ncvar->chunkType == CDI_CHUNK_AUTO && chunkSize > 1) ncvar->chunkSize = (int) chunkSize;
+        }
+      else
+        {
+          if (grid->x.size > 1 && grid->y.size > 1 && ndims > 1 && grid->x.size == ncvar->chunks[ndims - 1]
+              && grid->y.size == ncvar->chunks[ndims - 2])
+            ncvar->chunkType = CDI_CHUNK_GRID;
+          else if (grid->x.size > 1 && grid->x.size == ncvar->chunks[ndims - 1])
+            ncvar->chunkType = CDI_CHUNK_LINES;
+          else
+            ncvar->chunkType = CDI_CHUNK_AUTO;
+        }
+    }
+}
+
+// define all input grids
+static void
+cdf_load_vals(size_t size, int ndims, int varid, ncvar_t *ncvar, double **gridvals, struct xyValGet *valsGet, bool hasTimeDim,
+              bool readPart, size_t *start, size_t *count)
+{
+  if (CDI_Netcdf_Lazy_Grid_Load)
+    {
+      *valsGet = (struct xyValGet){
+        .scalefactor = ncvar->scalefactor,
+        .addoffset = ncvar->addoffset,
+        .start = { start[0], start[1], start[2] },
+        .count = { count[0], count[1], count[2] },
+        .size = size,
+        .datasetNCId = ncvar->ncid,
+        .varNCId = varid,
+        .ndims = (short) ndims,
+      };
+      *gridvals = cdfPendingLoad;
+    }
+  else
+    {
+      *gridvals = (double *) Malloc(size * sizeof(double));
+      if (hasTimeDim || readPart)
+        cdf_get_vara_double(ncvar->ncid, varid, start, count, *gridvals);
+      else
+        cdf_get_var_double(ncvar->ncid, varid, *gridvals);
+      cdf_scale_add(size, *gridvals, ncvar->addoffset, ncvar->scalefactor);
+    }
+}
+
+#ifndef USE_MPI
+static void
+cdf_load_cvals(size_t size, int varid, ncvar_t *ncvar, char ***gridvals, size_t dimlength)
+{
+  size_t startc[] = { 0, 0 };
+  size_t countc[] = { 1, size / dimlength };
+  *gridvals = (char **) Malloc(dimlength * sizeof(char *));
+  for (size_t i = 0; i < dimlength; i++)
+    {
+      (*gridvals)[i] = (char *) Malloc((size / dimlength) * sizeof(char));
+      cdf_get_vara_text(ncvar->ncid, varid, startc, countc, (*gridvals)[i]);
+      startc[0] = i + 1;
+    }
+}
+#endif
+
+static void
+cdf_load_bounds(size_t size, ncvar_t *ncvar, double **gridbounds, struct cdfLazyGridIds *cellBoundsGet, bool readPart,
+                size_t *start, size_t *count)
+{
+  if (CDI_Netcdf_Lazy_Grid_Load)
+    {
+      cellBoundsGet->datasetNCId = ncvar->ncid;
+      cellBoundsGet->varNCId = ncvar->bounds;
+      *gridbounds = cdfPendingLoad;
+    }
+  else
+    {
+      *gridbounds = (double *) Malloc(size * sizeof(double));
+      if (readPart)
+        cdf_get_vara_double(ncvar->ncid, ncvar->bounds, start, count, *gridbounds);
+      else
+        cdf_get_var_double(ncvar->ncid, ncvar->bounds, *gridbounds);
+    }
+}
+
+static void
+cdf_load_bounds_cube_sphere(size_t bxsize, size_t bysize, size_t size, ncvar_t *ncvar, double **gridbounds,
+                            struct cdfLazyGridIds *cellBoundsGet)
+{
+  if (CDI_Netcdf_Lazy_Grid_Load)
+    {
+      cellBoundsGet->datasetNCId = ncvar->ncid;
+      cellBoundsGet->varNCId = ncvar->bounds;
+      *gridbounds = cdfPendingLoad;
+    }
+  else
+    {
+      float *bounds = (float *) Malloc(6 * bxsize * bysize * sizeof(float));
+      cdf_get_var_float(ncvar->ncid, ncvar->bounds, bounds);
+
+      *gridbounds = (double *) Malloc(size * sizeof(double));
+      double *pbounds = *gridbounds;
+
+      size_t m = 0;
+      for (size_t k = 0; k < 6; ++k)
+        for (size_t j = 0; j < (bysize - 1); ++j)
+          for (size_t i = 0; i < (bxsize - 1); ++i)
+            {
+              size_t offset = k * bysize * bxsize;
+              pbounds[m + 0] = bounds[offset + (j + 1) * bxsize + i];
+              pbounds[m + 1] = bounds[offset + j * bxsize + i];
+              pbounds[m + 2] = bounds[offset + j * bxsize + (i + 1)];
+              pbounds[m + 3] = bounds[offset + (j + 1) * bxsize + (i + 1)];
+              m += 4;
+            }
+
+      Free(bounds);
+    }
+}
+
+static void
+cdf_load_cellarea(size_t size, ncvar_t *ncvar, double **gridarea, struct cdfLazyGridIds *cellAreaGet)
+{
+  if (CDI_Netcdf_Lazy_Grid_Load)
+    {
+      cellAreaGet->datasetNCId = ncvar->ncid;
+      cellAreaGet->varNCId = ncvar->cellarea;
+      *gridarea = cdfPendingLoad;
+    }
+  else
+    {
+      *gridarea = (double *) Malloc(size * sizeof(double));
+      cdf_get_var_double(ncvar->ncid, ncvar->cellarea, *gridarea);
+    }
+}
+
+static void
+cdf_copy_grid_axis_attr(ncvar_t *ncvar, struct gridaxis_t *gridaxis)
+{
+  cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_NAME, (const unsigned char *) ncvar->name, (int) strlen(ncvar->name) + 1);
+  if (ncvar->longname[0])
+    cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_LONGNAME, (const unsigned char *) ncvar->longname,
+                      (int) strlen(ncvar->longname) + 1);
+  if (ncvar->units[0])
+    cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_UNITS, (const unsigned char *) ncvar->units, (int) strlen(ncvar->units) + 1);
+#ifndef USE_MPI
+  if (gridaxis->cvals)
+    if (ncvar->stdname[0])
+      cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_STDNAME, (const unsigned char *) ncvar->stdname, (int) strlen(ncvar->stdname) + 1);
+#endif
+}
+
+static int
+cdf_get_xydimid(int ndims, int *dimids, int *dimtypes, int *xdimid, int *ydimid)
+{
+  int nxdims = 0, nydims = 0;
+  int xdimids[2] = { -1, -1 }, ydimids[2] = { -1, -1 };
+
+  for (int i = 0; i < ndims; i++)
+    {
+      if (dimtypes[i] == X_AXIS && nxdims < 2)
+        {
+          xdimids[nxdims] = dimids[i];
+          nxdims++;
+        }
+      else if (dimtypes[i] == Y_AXIS && nydims < 2)
+        {
+          ydimids[nydims] = dimids[i];
+          nydims++;
+        }
+    }
+
+  if (nxdims == 2)
+    {
+      *xdimid = xdimids[1];
+      *ydimid = xdimids[0];
+    }
+  else if (nydims == 2)
+    {
+      *xdimid = ydimids[1];
+      *ydimid = ydimids[0];
+    }
+  else
+    {
+      *xdimid = xdimids[0];
+      *ydimid = ydimids[0];
+    }
+
+  return nydims;
+}
+
+static void
+cdf_check_gridtype(int *gridtype, bool isLon, bool isLat, size_t xsize, size_t ysize, grid_t *grid)
+{
+  if (isLat && (isLon || xsize == 0))
+    {
+      double yinc = 0.0;
+      if (isLon && ysize > 1)
+        {
+          yinc = fabs(grid->y.vals[0] - grid->y.vals[1]);
+          for (size_t i = 2; i < ysize; i++)
+            if ((fabs(grid->y.vals[i - 1] - grid->y.vals[i]) - yinc) > (yinc / 1000))
+              {
+                yinc = 0;
+                break;
+              }
+        }
+      if (ysize < 10000 && IS_EQUAL(yinc, 0.0) && isGaussianLatitudes(ysize, grid->y.vals))
+        {
+          *gridtype = GRID_GAUSSIAN;
+          grid->np = (int) (ysize / 2);
+        }
+      else
+        {
+          *gridtype = GRID_LONLAT;
+        }
+    }
+  else
+    {
+      *gridtype = (isLon && !isLat && ysize == 0) ? GRID_LONLAT : GRID_GENERIC;
+    }
+}
+
+static bool
+cdf_read_xcoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int xvarid, ncvar_t *axisvar,
+                size_t *xsize, size_t ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLon)
+{
+  grid_t *grid = &lazyGrid->base;
+  bool skipvar = true;
+  *isLon = axisvar->isLon;
+  int ndims = axisvar->ndims;
+  size_t size = 0;
+
+  if (ndims == 1 && xtypeIsText(axisvar->xtype))
+    {
+      ncvar->varStatus = CoordVar;
+      Warning("Unsupported x-coordinate type (char/string), skipped variable %s!", ncvar->name);
+      return true;
+    }
+
+  int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned);
+
+  if ((ndims - hasTimeDim) == 2)
+    {
+      // Check size of 2 dimensional coordinates variables
+      int dimid = axisvar->dimids[ndims - 2];
+      size_t dimsize1 = ncdims[dimid].len;
+      dimid = axisvar->dimids[ndims - 1];
+      size_t dimsize2 = ncdims[dimid].len;
+
+      if (datatype == CDI_DATATYPE_UINT8)
+        {
+          ncvar->gridtype = GRID_CHARXY;
+          size = dimsize1 * dimsize2;
+          skipvar = (dimsize1 != *xsize);
+        }
+      else
+        {
+          ncvar->gridtype = GRID_CURVILINEAR;
+          size = (*xsize) * ysize;
+          skipvar = (dimsize1 * dimsize2 != size);
+        }
+    }
+  else if ((ndims - hasTimeDim) == 1)
+    {
+      size = *xsize;
+      // Check size of 1 dimensional coordinates variables
+      int dimid = axisvar->dimids[ndims - 1];
+      size_t dimsize = ncdims[dimid].len;
+      skipvar = readPart ? false : (dimsize != size);
+    }
+  else if (ndims == 0 && *xsize == 0)
+    {
+      size = *xsize = 1;
+      skipvar = false;
+    }
+  else if (ncvar->isCubeSphere)
+    {
+      size = *xsize;
+      skipvar = false;
+    }
+
+  if (skipvar)
+    {
+      Warning("Unsupported array structure, skipped variable %s!", ncvar->name);
+      ncvar->varStatus = UndefVar;
+      return true;
+    }
+
+  if (datatype != -1) grid->datatype = datatype;
+
+  if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load)
+    {
+#ifndef USE_MPI
+      cdf_load_cvals(size, xvarid, axisvar, &grid->x.cvals, *xsize);
+      grid->x.clength = size / (*xsize);
+#endif
+    }
+  else
+    cdf_load_vals(size, ndims, xvarid, axisvar, &grid->x.vals, &lazyGrid->xValsGet, hasTimeDim, readPart, start, count);
+
+  cdf_copy_grid_axis_attr(axisvar, &grid->x);
+
+  return false;
+}
+
+static bool
+cdf_read_ycoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int yvarid, ncvar_t *axisvar,
+                size_t xsize, size_t *ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLat)
+{
+  grid_t *grid = &lazyGrid->base;
+  bool skipvar = true;
+  *isLat = axisvar->isLat;
+  int ndims = axisvar->ndims;
+  size_t size = 0;
+
+  if (ndims == 1 && xtypeIsText(axisvar->xtype))
+    {
+      ncvar->varStatus = CoordVar;
+      Warning("Unsupported y-coordinate type (char/string), skipped variable %s!", ncvar->name);
+      return true;
+    }
+
+  int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned);
+
+  if ((ndims - hasTimeDim) == 2)
+    {
+      // Check size of 2 dimensional coordinates variables
+      int dimid = axisvar->dimids[ndims - 2];
+      size_t dimsize1 = ncdims[dimid].len;
+      dimid = axisvar->dimids[ndims - 1];
+      size_t dimsize2 = ncdims[dimid].len;
+
+      if (datatype == CDI_DATATYPE_UINT8)
+        {
+          ncvar->gridtype = GRID_CHARXY;
+          size = dimsize1 * dimsize2;
+          skipvar = (dimsize1 != *ysize);
+        }
+      else
+        {
+          ncvar->gridtype = GRID_CURVILINEAR;
+          size = xsize * (*ysize);
+          skipvar = (dimsize1 * dimsize2 != size);
+        }
+    }
+  else if ((ndims - hasTimeDim) == 1)
+    {
+      size = (*ysize) ? *ysize : xsize;
+      int dimid = axisvar->dimids[ndims - 1];
+      size_t dimsize = ncdims[dimid].len;
+      skipvar = readPart ? false : (dimsize != size);
+    }
+  else if (ndims == 0 && *ysize == 0)
+    {
+      size = *ysize = 1;
+      skipvar = false;
+    }
+  else if (ncvar->isCubeSphere)
+    {
+      size = *ysize;
+      skipvar = false;
+    }
+
+  if (skipvar)
+    {
+      Warning("Unsupported array structure, skipped variable %s!", ncvar->name);
+      ncvar->varStatus = UndefVar;
+      return true;
+    }
+
+  if (datatype != -1) grid->datatype = datatype;
+
+  if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load)
+    {
+#ifndef USE_MPI
+      cdf_load_cvals(size, yvarid, axisvar, &grid->y.cvals, *ysize);
+      grid->y.clength = size / (*ysize);
+#endif
+    }
+  else
+    cdf_load_vals(size, ndims, yvarid, axisvar, &grid->y.vals, &lazyGrid->yValsGet, hasTimeDim, readPart, start, count);
+
+  cdf_copy_grid_axis_attr(axisvar, &grid->y);
+
+  return false;
+}
+
+typedef struct
+{
+  long start;
+  long count;
+  bool readPart;
+} GridPart;
+
+static void
+gridpart_init(GridPart *gridPart)
+{
+  gridPart->start = -1;
+  gridPart->count = -1;
+  gridPart->readPart = false;
+}
+
+static bool
+cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims,
+                     int timedimid, int xvarid, int yvarid, size_t xsize, size_t ysize, int *vdimid, const GridPart *gridPart)
+{
+  grid_t *grid = &lazyGrid->base;
+  size_t size = 0;
+  size_t start[3] = { 0, 0, 0 }, count[3] = { 1, 1, 1 };
+  bool readPart = false;
+
+  grid->datatype = CDI_DATATYPE_FLT64;
+
+  if (ncvar->gridtype == GRID_TRAJECTORY)
+    {
+      if (ncvar->xvarid == CDI_UNDEFID) Error("Longitude coordinates undefined for %s!", ncvar->name);
+      if (ncvar->yvarid == CDI_UNDEFID) Error("Latitude coordinates undefined for %s!", ncvar->name);
+    }
+  else
+    {
+      bool hasTimeDim = false;
+
+      if (xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID)
+        {
+          int ndims = ncvars[xvarid].ndims;
+          if (ndims != ncvars[yvarid].ndims && !ncvars[xvarid].isCharAxis && !ncvars[yvarid].isCharAxis)
+            {
+              Warning("Inconsistent grid structure for variable %s!", ncvar->name);
+              ncvar->xvarid = xvarid = CDI_UNDEFID;
+              ncvar->yvarid = yvarid = CDI_UNDEFID;
+            }
+          if (ndims > 1)
+            {
+              if (ndims <= 3)
+                {
+                  if (ncvars[xvarid].dimids[0] == timedimid && ncvars[yvarid].dimids[0] == timedimid)
+                    {
+                      static bool ltwarn = true;
+                      size_t ntsteps = 0;
+                      cdf_inq_dimlen(ncvar->ncid, ncdims[timedimid].dimid, &ntsteps);
+                      if (ltwarn && ntsteps > 1) Warning("Time varying grids unsupported, using grid at time step 1!");
+                      ltwarn = false;
+                      hasTimeDim = true;
+                      count[1] = ysize;
+                      count[2] = xsize;
+                    }
+                }
+              else
+                {
+                  Warning("Unsupported grid structure for variable %s (grid dims > 2)!", ncvar->name);
+                  ncvar->xvarid = xvarid = CDI_UNDEFID;
+                  ncvar->yvarid = yvarid = CDI_UNDEFID;
+                }
+            }
+          else if (gridPart && gridPart->readPart)
+            {
+              start[0] = (size_t) gridPart->start;
+              count[0] = (size_t) gridPart->count;
+              readPart = true;
+            }
+        }
+
+      if (xvarid != CDI_UNDEFID)
+        {
+          if (!ncvar->isCubeSphere && (ncvars[xvarid].ndims - hasTimeDim) > 2)
+            {
+              Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[xvarid].name, ncvars[xvarid].ndims);
+              // ncvar->xvarid = CDI_UNDEFID;
+              xvarid = CDI_UNDEFID;
+            }
+        }
+
+      if (yvarid != CDI_UNDEFID)
+        {
+          if (!ncvar->isCubeSphere && (ncvars[yvarid].ndims - hasTimeDim) > 2)
+            {
+              Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[yvarid].name, ncvars[yvarid].ndims);
+              // ncvar->yvarid = CDI_UNDEFID;
+              yvarid = CDI_UNDEFID;
+            }
+        }
+
+      bool isLon = false, isLat = false;
+
+      if (xvarid != CDI_UNDEFID)
+        if (cdf_read_xcoord(streamptr, lazyGrid, ncdims, ncvar, xvarid, &ncvars[xvarid], &xsize, ysize, hasTimeDim, readPart, start,
+                            count, &isLon))
+          return true;
+
+      if (yvarid != CDI_UNDEFID)
+        if (cdf_read_ycoord(streamptr, lazyGrid, ncdims, ncvar, yvarid, &ncvars[yvarid], xsize, &ysize, hasTimeDim, readPart, start,
+                            count, &isLat))
+          return true;
+
+      // clang-format off
+      if      (ncvar->gridtype == GRID_UNSTRUCTURED)     size = xsize;
+      else if (ncvar->gridtype == GRID_GAUSSIAN_REDUCED) size = xsize;
+      else if (ysize == 0)                               size = xsize;
+      else if (xsize == 0)                               size = ysize;
+      else                                               size = xsize * ysize;
+      // clang-format on
+
+      if (ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC)
+        cdf_check_gridtype(&ncvar->gridtype, isLon, isLat, xsize, ysize, grid);
+    }
+
+  int gridtype = grid->type;
+  if (gridtype != GRID_PROJECTION)
+    {
+      gridtype = ncvar->gridtype;
+    }
+  else if (gridtype == GRID_PROJECTION && ncvar->gridtype == GRID_LONLAT)
+    {
+      int gmapvarid = ncvar->gmapid;
+      if (gmapvarid != CDI_UNDEFID && cdfCheckAttText(ncvar->ncid, gmapvarid, "grid_mapping_name"))
+        {
+          char attstring[CDI_MAX_NAME];
+          cdfGetAttText(ncvar->ncid, gmapvarid, "grid_mapping_name", CDI_MAX_NAME, attstring);
+          if (str_is_equal(attstring, "latitude_longitude")) gridtype = ncvar->gridtype;
+        }
+    }
+
+  switch (gridtype)
+    {
+    case GRID_GENERIC:
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_UNSTRUCTURED:
+    case GRID_CURVILINEAR:
+    case GRID_PROJECTION:
+      {
+        grid->size = size;
+        grid->x.size = xsize;
+        grid->y.size = ysize;
+        if (xvarid != CDI_UNDEFID && CDI_Read_Cell_Corners)
+          {
+            grid->x.flag = 1;
+            int bvarid = ncvars[xvarid].bounds;
+            if (bvarid != CDI_UNDEFID)
+              {
+                int ndims = ncvars[xvarid].ndims;
+                int nbdims = ncvars[bvarid].ndims;
+                if (nbdims == 2 || nbdims == 3)
+                  {
+                    if (ncvars[bvarid].dimids[0] == timedimid)
+                      {
+                        static bool ltwarn = true;
+                        if (ltwarn) Warning("Time varying grid x-bounds unsupported, skipped!");
+                        ltwarn = false;
+                      }
+                    else if (ncvar->isCubeSphere)
+                      {
+                        grid->nvertex = 4;
+                        size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len;
+                        size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len;
+                        cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds,
+                                                    &lazyGrid->xBoundsGet);
+                      }
+                    else if (nbdims == ndims + 1)
+                      {
+                        *vdimid = ncvars[bvarid].dimids[nbdims - 1];
+                        grid->nvertex = (int) ncdims[*vdimid].len;
+                        if (readPart)
+                          {
+                            start[1] = 0;
+                            count[1] = (size_t) grid->nvertex;
+                          }
+                        cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet,
+                                        readPart, start, count);
+                      }
+                    else
+                      {
+                        static bool lwarn = true;
+                        if (lwarn) Warning("x-bounds doesn't follow the CF-Convention, skipped!");
+                        lwarn = false;
+                      }
+                  }
+              }
+          }
+        if (yvarid != CDI_UNDEFID && CDI_Read_Cell_Corners)
+          {
+            grid->y.flag = 1;
+            int bvarid = ncvars[yvarid].bounds;
+            if (bvarid != CDI_UNDEFID)
+              {
+                int ndims = ncvars[yvarid].ndims;
+                int nbdims = ncvars[bvarid].ndims;
+                if (nbdims == 2 || nbdims == 3)
+                  {
+                    if (ncvars[bvarid].dimids[0] == timedimid)
+                      {
+                        static bool ltwarn = true;
+                        if (ltwarn) Warning("Time varying grid y-bounds unsupported, skipped!");
+                        ltwarn = false;
+                      }
+                    else if (ncvar->isCubeSphere)
+                      {
+                        grid->nvertex = 4;
+                        size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len;
+                        size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len;
+                        cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds,
+                                                    &lazyGrid->yBoundsGet);
+                      }
+                    else if (nbdims == ndims + 1)
+                      {
+                        if (*vdimid == CDI_UNDEFID)
+                          {
+                            *vdimid = ncvars[bvarid].dimids[nbdims - 1];
+                            grid->nvertex = (int) ncdims[*vdimid].len;
+                          }
+                        if (readPart)
+                          {
+                            start[1] = 0;
+                            count[1] = (size_t) grid->nvertex;
+                          }
+                        cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet,
+                                        readPart, start, count);
+                      }
+                    else
+                      {
+                        static bool lwarn = true;
+                        if (lwarn) Warning("y-bounds doesn't follow the CF-Convention, skipped!");
+                        lwarn = false;
+                      }
+                  }
+              }
+          }
+
+        if (ncvar->cellarea != CDI_UNDEFID) cdf_load_cellarea(size, ncvar, &grid->area, &lazyGrid->cellAreaGet);
+
+        if (gridtype == GRID_GAUSSIAN)
+          {
+            if (ncvar->numLPE > 0) grid->np = ncvar->numLPE;
+          }
+
+        break;
+      }
+    case GRID_GAUSSIAN_REDUCED:
+      {
+        if (ncvar->numLPE > 0 && ncvar->rpvarid != CDI_UNDEFID)
+          {
+            if (ncvars[ncvar->rpvarid].ndims == 1)
+              {
+                grid->size = size;
+                int dimid = ncvars[ncvar->rpvarid].dimids[0];
+                size_t len = ncdims[dimid].len;
+                grid->y.size = len;
+                assert(len <= INT_MAX);
+                grid->reducedPointsSize = (int) len;
+                grid->reducedPoints = (int *) Malloc(len * sizeof(int));
+                cdf_get_var_int(ncvar->ncid, ncvar->rpvarid, grid->reducedPoints);
+                grid->np = ncvar->numLPE;
+
+                int bvarid = (yvarid == CDI_UNDEFID) ? CDI_UNDEFID : ncvars[yvarid].bounds;
+                if (bvarid != CDI_UNDEFID)
+                  {
+                    int nbdims = ncvars[bvarid].ndims;
+                    if (nbdims == 2 || nbdims == 3)
+                      {
+                        if (*vdimid == CDI_UNDEFID)
+                          {
+                            *vdimid = ncvars[bvarid].dimids[nbdims - 1];
+                            grid->nvertex = (int) ncdims[*vdimid].len;
+                          }
+                        cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet,
+                                        false, NULL, NULL);
+                      }
+                  }
+              }
+          }
+        break;
+      }
+    case GRID_SPECTRAL:
+      {
+        grid->size = size;
+        grid->lcomplex = 1;
+        grid->trunc = ncvar->truncation;
+        break;
+      }
+    case GRID_FOURIER:
+      {
+        grid->size = size;
+        grid->trunc = ncvar->truncation;
+        break;
+      }
+    case GRID_TRAJECTORY:
+      {
+        grid->size = 1;
+        break;
+      }
+    case GRID_CHARXY:
+      {
+        grid->size = size;
+        grid->x.size = xsize;
+        grid->y.size = ysize;
+        break;
+      }
+    }
+
+  // if ( grid->type != GRID_PROJECTION && grid->type != ncvar->gridtype )
+  if (grid->type != gridtype)
+    {
+      // int gridtype = ncvar->gridtype;
+      grid->type = gridtype;
+      cdiGridTypeInit(grid, gridtype, grid->size);
+    }
+
+  if (grid->size == 0)
+    {
+      int ndims = ncvar->ndims;
+      int *dimtypes = ncvar->dimtypes;
+      if (ndims == 0 || (ndims == 1 && dimtypes[0] == T_AXIS) || (ndims == 1 && dimtypes[0] == Z_AXIS)
+          || (ndims == 2 && dimtypes[0] == T_AXIS && dimtypes[1] == Z_AXIS))
+        {
+          grid->type = GRID_GENERIC;
+          grid->size = 1;
+          grid->x.size = 0;
+          grid->y.size = 0;
+        }
+      else
+        {
+          Warning("Unsupported grid, skipped variable %s!", ncvar->name);
+          ncvar->varStatus = UndefVar;
+          return true;
+        }
+    }
+
+  return false;
+}
+
+static bool
+cdf_set_unstructured_par(ncvar_t *ncvar, grid_t *grid, int *xdimid, int *ydimid, GridInfo *gridInfo, bool readPart)
+{
+  int ndims = ncvar->ndims;
+  int *dimtypes = ncvar->dimtypes;
+
+  int zdimid = CDI_UNDEFID;
+  int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID;
+
+  for (int i = 0; i < ndims; i++)
+    {
+      // clang-format off
+      if      (dimtypes[i] == X_AXIS) xdimidx = i;
+      else if (dimtypes[i] == Y_AXIS) ydimidx = i;
+      else if (dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i];
+      // clang-format on
+    }
+
+  if (*xdimid != CDI_UNDEFID && *ydimid != CDI_UNDEFID && zdimid == CDI_UNDEFID)
+    {
+      if (grid->x.size > grid->y.size && grid->y.size < 1000)
+        {
+          dimtypes[ydimidx] = Z_AXIS;
+          *ydimid = CDI_UNDEFID;
+          grid->size = grid->x.size;
+          grid->y.size = 0;
+        }
+      else if (grid->y.size > grid->x.size && grid->x.size < 1000)
+        {
+          dimtypes[xdimidx] = Z_AXIS;
+          *xdimid = *ydimid;
+          *ydimid = CDI_UNDEFID;
+          grid->size = grid->y.size;
+          grid->x.size = grid->y.size;
+          grid->y.size = 0;
+        }
+    }
+
+  if (grid->size != grid->x.size)
+    {
+      Warning("Unsupported array structure, skipped variable %s!", ncvar->name);
+      ncvar->varStatus = UndefVar;
+      return true;
+    }
+
+  if (!readPart)
+    {
+      if (gridInfo->number_of_grid_used != CDI_UNDEFID)
+        cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, gridInfo->number_of_grid_used);
+      if (ncvar->position > 0) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, ncvar->position);
+      if (!cdiUUIDIsNull(gridInfo->uuid)) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, gridInfo->uuid, CDI_UUID_SIZE);
+    }
+
+  return false;
+}
+
+static void
+cdf_read_mapping_atts(int ncid, int gmapvarid, int projID)
+{
+  if (cdfCheckAttText(ncid, gmapvarid, "grid_mapping_name"))
+    {
+      char attstring[CDI_MAX_NAME];
+      cdfGetAttText(ncid, gmapvarid, "grid_mapping_name", CDI_MAX_NAME, attstring);
+      cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, attstring);
+    }
+
+  int nvatts;
+  cdf_inq_varnatts(ncid, gmapvarid, &nvatts);
+  bool removeFillValue = true;
+  for (int attnum = 0; attnum < nvatts; ++attnum) cdf_set_cdi_attr(ncid, gmapvarid, attnum, projID, CDI_GLOBAL, removeFillValue);
+}
+
+static void
+cdf_set_grid_to_similar_vars(ncvar_t *ncvar1, ncvar_t *ncvar2, int gridtype, int xdimid, int ydimid)
+{
+  if (ncvar2->varStatus == DataVar && ncvar2->gridID == CDI_UNDEFID)
+    {
+      int xdimid2 = CDI_UNDEFID, ydimid2 = CDI_UNDEFID, zdimid2 = CDI_UNDEFID;
+      int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID;
+
+      const int *dimtypes2 = ncvar2->dimtypes;
+      const int *dimids2 = ncvar2->dimids;
+      int ndims2 = ncvar2->ndims;
+      for (int i = 0; i < ndims2; i++)
+        {
+          if (dimtypes2[i] == X_AXIS)
+            {
+              xdimid2 = dimids2[i];
+              xdimidx = i;
+            }
+          else if (dimtypes2[i] == Y_AXIS)
+            {
+              ydimid2 = dimids2[i];
+              ydimidx = i;
+            }
+          else if (dimtypes2[i] == Z_AXIS)
+            {
+              zdimid2 = dimids2[i];
+            }
+        }
+
+      if (!ncvar2->isCubeSphere)
+        {
+          if (ncvar2->gridtype == CDI_UNDEFID && gridtype == GRID_UNSTRUCTURED)
+            {
+              if (xdimid == xdimid2 && ydimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID)
+                {
+                  ncvar2->dimtypes[ydimidx] = Z_AXIS;
+                  ydimid2 = CDI_UNDEFID;
+                }
+
+              if (xdimid == ydimid2 && xdimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID)
+                {
+                  ncvar2->dimtypes[xdimidx] = Z_AXIS;
+                  xdimid2 = ydimid2;
+                  ydimid2 = CDI_UNDEFID;
+                }
+            }
+          else if (ncvar2->gridtype == GRID_GAUSSIAN_REDUCED && gridtype == GRID_GAUSSIAN_REDUCED)
+            {
+              ydimid = CDI_UNDEFID;
+            }
+        }
+
+      if (xdimid == xdimid2 && (ydimid == ydimid2 || (xdimid == ydimid && ydimid2 == CDI_UNDEFID)))
+        {
+          bool isSameGrid
+              = (ncvar1->xvarid == ncvar2->xvarid && ncvar1->yvarid == ncvar2->yvarid && ncvar1->position == ncvar2->position);
+
+          // if (xvarid != -1 && ncvar2->xvarid != CDI_UNDEFID && xvarid != ncvar2->xvarid) isSameGrid = false;
+          // if (yvarid != -1 && ncvar2->yvarid != CDI_UNDEFID && yvarid != ncvar2->yvarid) isSameGrid = false;
+
+          if (isSameGrid)
+            {
+              if (CDI_Debug) Message("Same gridID %d %s", ncvar1->gridID, ncvar2->name);
+              ncvar2->gridID = ncvar1->gridID;
+              ncvar2->chunkType = ncvar1->chunkType;
+              ncvar2->chunkSize = ncvar1->chunkSize;
+              ncvar2->gridSize = ncvar1->gridSize;
+              ncvar2->xSize = ncvar1->xSize;
+              ncvar2->ySize = ncvar1->ySize;
+            }
+        }
+    }
+}
+
+static void
+destroy_grid(struct cdfLazyGrid *lazyGrid, grid_t *grid)
+{
+  if (lazyGrid)
+    {
+      if (CDI_Netcdf_Lazy_Grid_Load) cdfLazyGridDestroy(lazyGrid);
+      if (grid)
+        {
+          grid_free(grid);
+          Free(grid);
+        }
+    }
+}
+
+static int
+cdf_define_all_grids(stream_t *streamptr, ncgrid_t *ncgrid, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars,
+                     GridInfo *gridInfo)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ++ncvarid)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar && ncvar->gridID == CDI_UNDEFID)
+        {
+          GridPart gridPart;
+          gridpart_init(&gridPart);
+          int ndims = ncvar->ndims;
+          int *dimtypes = ncvar->dimtypes;
+          int vdimid = CDI_UNDEFID;
+          struct addIfNewRes projAdded = { .Id = CDI_UNDEFID, .isNew = 0 }, gridAdded = { .Id = CDI_UNDEFID, .isNew = 0 };
+          int xdimid = CDI_UNDEFID, ydimid = CDI_UNDEFID;
+          int nydims = cdf_get_xydimid(ndims, ncvar->dimids, dimtypes, &xdimid, &ydimid);
+
+          int xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID;
+          int yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID;
+          int xvarid = (ncvar->xvarid != CDI_UNDEFID) ? ncvar->xvarid : xaxisid;
+          int yvarid = (ncvar->yvarid != CDI_UNDEFID) ? ncvar->yvarid : yaxisid;
+
+          size_t xsize = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].len : 0;
+          size_t ysize = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].len : 0;
+
+          if (ydimid == CDI_UNDEFID && yvarid != CDI_UNDEFID)
+            {
+              if (ncvars[yvarid].ndims == 1)
+                {
+                  ydimid = ncvars[yvarid].dimids[0];
+                  ysize = ncdims[ydimid].len;
+                }
+            }
+
+          int gmapvarid = ncvar->gmapid;
+          bool lproj = (gmapvarid != CDI_UNDEFID);
+
+          if (!lproj && xaxisid != CDI_UNDEFID && xaxisid != xvarid && yaxisid != CDI_UNDEFID && yaxisid != yvarid) lproj = true;
+
+          if (ncvar->isCubeSphere && lproj && xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID && ncvars[xvarid].ndims == 3
+              && ncvars[yvarid].ndims == 3)
+            {
+              lproj = false;
+              ncvar->gridtype = GRID_UNSTRUCTURED;
+              xsize = xsize * ysize * 6;
+              ysize = xsize;
+            }
+
+          bool lgrid = !(lproj && ncvar->xvarid == CDI_UNDEFID);
+
+          bool isUnstructured = (xdimid != CDI_UNDEFID && xdimid == ydimid && nydims == 0);
+          if ((ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC) && isUnstructured)
+            ncvar->gridtype = GRID_UNSTRUCTURED;
+
+          struct cdfLazyGrid *lazyGrid = NULL, *lazyProj = NULL;
+
+          {
+            int gridtype = (!lgrid) ? GRID_PROJECTION : ncvar->gridtype;
+            if (CDI_Netcdf_Lazy_Grid_Load)
+              {
+                cdfLazyGridRenew(&lazyGrid, gridtype);
+                if (lgrid && lproj) cdfLazyGridRenew(&lazyProj, GRID_PROJECTION);
+              }
+            else
+              {
+                cdfBaseGridRenew(&lazyGrid, gridtype);
+                if (lgrid && lproj) cdfBaseGridRenew(&lazyProj, GRID_PROJECTION);
+              }
+          }
+          grid_t *grid = &lazyGrid->base;
+          grid_t *proj = (lgrid && lproj) ? &lazyProj->base : NULL;
+
+          xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID;
+          yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID;
+
+          // process query information if available
+          CdiQuery *query = streamptr->query;
+          if (query)
+            {
+              int numCellidx = cdiQueryNumCellidx(query);
+              if (numCellidx > 0)
+                {
+                  // if (ncvar->gridtype != GRID_UNSTRUCTURED)
+                  if (xdimid != CDI_UNDEFID && ydimid != CDI_UNDEFID)
+                    {
+                      Warning("Query parameter cell is only available for 1D grids, skipped variable %s!", ncvar->name);
+                      ncvar->varStatus = UndefVar;
+                      continue;
+                    }
+
+                  size_t start = cdiQueryGetCellidx(query, 0);
+                  size_t count = (numCellidx == 2) ? cdiQueryGetCellidx(query, 1) : 1;
+                  if ((start + count) <= xsize)
+                    {
+                      cdiQueryCellidx(query, start);
+                      if (numCellidx == 2) cdiQueryCellidx(query, count);
+                      xsize = count;
+                      ysize = count;
+                      gridPart.start = (long) start - 1;
+                      gridPart.count = (long) count;
+                      gridPart.readPart = true;
+                    }
+                }
+            }
+
+          if (cdf_read_coordinates(streamptr, lazyGrid, ncvar, ncvars, ncdims, gridInfo->timedimid, xvarid, yvarid, xsize, ysize,
+                                   &vdimid, &gridPart))
+            continue;
+
+          if (gridInfo->number_of_grid_used != CDI_UNDEFID && (grid->type == CDI_UNDEFID || grid->type == GRID_GENERIC)
+              && xdimid != CDI_UNDEFID && xsize > 999)
+            grid->type = GRID_UNSTRUCTURED;
+
+          if (!ncvar->isCubeSphere && grid->type == GRID_UNSTRUCTURED)
+            if (cdf_set_unstructured_par(ncvar, grid, &xdimid, &ydimid, gridInfo, gridPart.readPart)) continue;
+
+          if (lgrid && lproj)
+            {
+              int dimid;
+              cdf_read_coordinates(streamptr, lazyProj, ncvar, ncvars, ncdims, gridInfo->timedimid, xaxisid, yaxisid, xsize, ysize,
+                                   &dimid, NULL);
+            }
+
+          if (CDI_Debug)
+            {
+              Message("grid: type = %d, size = %zu, nx = %zu, ny = %zu", grid->type, grid->size, grid->x.size, grid->y.size);
+              if (proj)
+                Message("proj: type = %d, size = %zu, nx = %zu, ny = %zu", proj->type, proj->size, proj->x.size, proj->y.size);
+            }
+
+          if (lgrid && lproj)
+            {
+              projAdded = cdiVlistAddGridIfNew(vlistID, proj, 2);
+              grid->proj = projAdded.Id;
+            }
+
+          gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 1);
+          ncvar->gridID = gridAdded.Id;
+          ncvar->gridSize = grid->size;
+          ncvar->xSize = grid->x.size;
+          ncvar->ySize = grid->y.size;
+
+          int gridID = ncvar->gridID;
+
+          if (lproj && gmapvarid != CDI_UNDEFID)
+            {
+              bool gridIsNew = lgrid ? projAdded.isNew : gridAdded.isNew;
+              if (gridIsNew)
+                {
+                  int projID = lgrid ? grid->proj : gridID;
+                  int ncid = ncvars[gmapvarid].ncid;
+                  int gmapvartype = ncvars[gmapvarid].xtype;
+                  cdiDefKeyInt(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, gmapvartype);
+                  const char *gmapvarname = ncvars[gmapvarid].name;
+                  cdf_read_mapping_atts(ncid, gmapvarid, projID);
+                  cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname);
+                  gridVerifyProj(projID);
+                }
+            }
+
+          if (grid->type == GRID_UNSTRUCTURED && gridInfo->gridfile[0] != 0 && !gridPart.readPart)
+            gridDefReference(gridID, gridInfo->gridfile);
+
+          if (ncvar->isChunked) grid_set_chunktype(grid, ncvar);
+
+          int gridindex = vlistGridIndex(vlistID, gridID);
+          if (gridPart.readPart)
+            {
+              ncgrid[gridindex].start = gridPart.start;
+              ncgrid[gridindex].count = gridPart.count;
+            }
+          ncgrid[gridindex].gridID = gridID;
+          if (grid->type == GRID_TRAJECTORY)
+            {
+              ncgrid[gridindex].ncIDs[CDF_VARID_X] = xvarid;
+              ncgrid[gridindex].ncIDs[CDF_VARID_Y] = yvarid;
+            }
+          else
+            {
+              if (xdimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_X] = ncdims[xdimid].dimid;
+              if (ydimid != CDI_UNDEFID) ncgrid[gridindex].ncIDs[CDF_DIMID_Y] = ncdims[ydimid].dimid;
+              if (ncvar->isCubeSphere) ncgrid[gridindex].ncIDs[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid;
+            }
+
+          if (xdimid == CDI_UNDEFID && ydimid == CDI_UNDEFID && grid->size == 1) gridDefHasDims(gridID, CoordVar);
+
+          if (xdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, ncdims[xdimid].name);
+          if (ydimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ncdims[ydimid].name);
+          if (vdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, ncdims[vdimid].name);
+
+          if (xvarid != CDI_UNDEFID && ncvars[xvarid].stdname[0])
+            cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, ncvars[xvarid].stdname);
+          if (yvarid != CDI_UNDEFID && ncvars[yvarid].stdname[0])
+            cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, ncvars[yvarid].stdname);
+
+          if (CDI_Debug) Message("gridID %d %d %s", gridID, ncvarid, ncvar->name);
+
+          for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++)
+            cdf_set_grid_to_similar_vars(ncvar, &ncvars[ncvarid2], grid->type, xdimid, ydimid);
+
+          if (gridAdded.isNew) lazyGrid = NULL;
+          if (projAdded.isNew) lazyProj = NULL;
+
+          if (lazyGrid) destroy_grid(lazyGrid, grid);
+          if (lazyProj) destroy_grid(lazyProj, proj);
+        }
+    }
+
+  return 0;
+}
+
+// define all input zaxes
+static int
+cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, size_t vctsize_echam,
+                     double *vct_echam, unsigned char *uuidOfVGrid)
+{
+  char *pname, *plongname, *punits, *pstdname;
+  size_t vctsize = vctsize_echam;
+  double *vct = vct_echam;
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar && ncvar->zaxisID == CDI_UNDEFID)
+        {
+          bool isScalar = false;
+          int zdimid = CDI_UNDEFID;
+          int zvarid = CDI_UNDEFID;
+          size_t zsize = 1;
+          int psvarid = -1;
+          int p0varid = -1;
+
+          int positive = 0;
+          int ndims = ncvar->ndims;
+
+          if (ncvar->zvarid != -1 && ncvars[ncvar->zvarid].ndims == 0)
+            {
+              zvarid = ncvar->zvarid;
+              isScalar = true;
+            }
+          else
+            {
+              for (int i = 0; i < ndims; i++)
+                {
+                  if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i];
+                }
+
+              if (zdimid != CDI_UNDEFID)
+                {
+                  // zvarid = ncdims[zdimid].ncvarid;
+                  zvarid = (ncvar->zvarid != CDI_UNDEFID) ? ncvar->zvarid : ncdims[zdimid].ncvarid;
+                  zsize = ncdims[zdimid].len;
+                }
+            }
+
+          if (CDI_Debug) Message("nlevs = %zu", zsize);
+
+          double *zvar = NULL;
+          char **zcvals = NULL;
+          size_t zclength = 0;
+
+          int zaxisType = CDI_UNDEFID;
+          if (zvarid != CDI_UNDEFID) zaxisType = ncvars[zvarid].zaxistype;
+          if (zaxisType == CDI_UNDEFID) zaxisType = ZAXIS_GENERIC;
+
+          int zdatatype = CDI_DATATYPE_FLT64;
+          double *lbounds = NULL;
+          double *ubounds = NULL;
+
+          if (zvarid != CDI_UNDEFID)
+            {
+              positive = ncvars[zvarid].positive;
+              pname = ncvars[zvarid].name;
+              plongname = ncvars[zvarid].longname;
+              punits = ncvars[zvarid].units;
+              pstdname = ncvars[zvarid].stdname;
+              // clang-format off
+	          if      (ncvars[zvarid].xtype == NC_FLOAT) zdatatype = CDI_DATATYPE_FLT32;
+	          else if (ncvars[zvarid].xtype == NC_INT)   zdatatype = CDI_DATATYPE_INT32;
+	          else if (ncvars[zvarid].xtype == NC_SHORT) zdatatype = CDI_DATATYPE_INT16;
+                // clang-format on
+                // don't change the name !!!
+                /*
+                  if ((len = strlen(pname)) > 2)
+                  if (pname[len-2] == '_' && isdigit((int) pname[len-1])) pname[len-2] = 0;
+                */
+#ifndef USE_MPI
+              if (zaxisType == ZAXIS_CHAR && ncvars[zvarid].ndims == 2)
+                {
+                  zdatatype = CDI_DATATYPE_UINT8;
+                  zclength = ncdims[ncvars[zvarid].dimids[1]].len;
+                  cdf_load_cvals(zsize * zclength, zvarid, ncvar, &zcvals, zsize);
+                }
+#endif
+
+              if ((zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF) && ncvars[zvarid].vct)
+                {
+                  vct = ncvars[zvarid].vct;
+                  vctsize = ncvars[zvarid].vctsize;
+
+                  if (ncvars[zvarid].psvarid != -1) psvarid = ncvars[zvarid].psvarid;
+                  if (ncvars[zvarid].p0varid != -1) p0varid = ncvars[zvarid].p0varid;
+                }
+
+              if (zaxisType != ZAXIS_CHAR)
+                {
+                  zvar = (double *) Malloc(zsize * sizeof(double));
+                  cdf_get_var_double(ncvars[zvarid].ncid, zvarid, zvar);
+                }
+
+              if (ncvars[zvarid].bounds != CDI_UNDEFID)
+                {
+                  int nbdims = ncvars[ncvars[zvarid].bounds].ndims;
+                  if (nbdims == 2 || isScalar)
+                    {
+                      size_t nlevel = isScalar ? 1 : ncdims[ncvars[ncvars[zvarid].bounds].dimids[0]].len;
+                      int nvertex = (int) ncdims[ncvars[ncvars[zvarid].bounds].dimids[1 - isScalar]].len;
+                      if (nlevel == zsize && nvertex == 2)
+                        {
+                          lbounds = (double *) Malloc(4 * nlevel * sizeof(double));
+                          ubounds = lbounds + nlevel;
+                          double *zbounds = lbounds + 2 * nlevel;
+                          cdf_get_var_double(ncvars[zvarid].ncid, ncvars[zvarid].bounds, zbounds);
+                          for (size_t i = 0; i < nlevel; ++i)
+                            {
+                              lbounds[i] = zbounds[i * 2];
+                              ubounds[i] = zbounds[i * 2 + 1];
+                            }
+                        }
+                    }
+                }
+            }
+          else
+            {
+              pname = (zdimid != CDI_UNDEFID) ? ncdims[zdimid].name : NULL;
+              plongname = NULL;
+              punits = NULL;
+              pstdname = NULL;
+
+              if (zsize == 1 && zdimid == CDI_UNDEFID)
+                {
+                  zaxisType = (ncvar->zaxistype != CDI_UNDEFID) ? ncvar->zaxistype : ZAXIS_SURFACE;
+                  // if ( pname )
+                  {
+                    zvar = (double *) Malloc(sizeof(double));
+                    zvar[0] = 0;
+                  }
+                }
+            }
+
+          if (zsize > INT_MAX)
+            {
+              Warning("Size limit exceeded for z-axis dimension (limit=%d)!", INT_MAX);
+              return CDI_EDIMSIZE;
+            }
+
+          ncvar->zaxisID = varDefZaxis(vlistID, zaxisType, (int) zsize, zvar, (const char **) zcvals, zclength, lbounds, ubounds,
+                                       (int) vctsize, vct, pname, plongname, punits, zdatatype, 1, 0, -1);
+
+          int zaxisID = ncvar->zaxisID;
+
+          if (CDI_CMOR_Mode && zsize == 1 && zaxisType != ZAXIS_HYBRID) zaxisDefScalar(zaxisID);
+
+          if (pstdname && *pstdname)
+            cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, (const unsigned char *) pstdname, (int) strlen(pstdname) + 1);
+
+          if (!cdiUUIDIsNull(uuidOfVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfVGrid, CDI_UUID_SIZE);
+
+          if (zaxisType == ZAXIS_HYBRID)
+            {
+              if (psvarid != -1) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, ncvars[psvarid].name);
+              if (p0varid != -1)
+                {
+                  double px = 1;
+                  cdf_get_var_double(ncvars[p0varid].ncid, p0varid, &px);
+                  cdiDefKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, px);
+                  cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, ncvars[p0varid].name);
+                }
+            }
+
+          if (positive > 0) zaxisDefPositive(zaxisID, positive);
+          if (isScalar) zaxisDefScalar(zaxisID);
+
+          if (zdimid != CDI_UNDEFID) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, ncdims[zdimid].name);
+
+          if (zvar) Free(zvar);
+          if (zcvals)
+            {
+              for (size_t i = 0; i < zsize; i++) Free(zcvals[i]);
+              Free(zcvals);
+            }
+          if (lbounds) Free(lbounds);
+
+          if (zvarid != CDI_UNDEFID)
+            {
+              int ncid = ncvars[zvarid].ncid;
+              int nvatts = ncvars[zvarid].natts;
+              for (int iatt = 0; iatt < nvatts; ++iatt)
+                {
+                  int attnum = ncvars[zvarid].atts[iatt];
+                  cdf_set_cdi_attr(ncid, zvarid, attnum, zaxisID, CDI_GLOBAL, false);
+                }
+            }
+
+          int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+          streamptr->zaxisID[zaxisindex] = zdimid >= 0 ? ncdims[zdimid].dimid : zdimid;
+
+          if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid, ncvar->name);
+
+          for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++)
+            if (ncvars[ncvarid2].varStatus == DataVar
+                && ncvars[ncvarid2].zaxisID == CDI_UNDEFID /*&& ncvars[ncvarid2].zaxistype == CDI_UNDEFID*/)
+              {
+                int zvarid2 = CDI_UNDEFID;
+                if (ncvars[ncvarid2].zvarid != CDI_UNDEFID && ncvars[ncvars[ncvarid2].zvarid].ndims == 0)
+                  zvarid2 = ncvars[ncvarid2].zvarid;
+
+                int zdimid2 = CDI_UNDEFID;
+                ndims = ncvars[ncvarid2].ndims;
+                for (int i = 0; i < ndims; i++)
+                  {
+                    if (ncvars[ncvarid2].dimtypes[i] == Z_AXIS) zdimid2 = ncvars[ncvarid2].dimids[i];
+                  }
+
+                if (zdimid == zdimid2 /* && zvarid == zvarid2 */)
+                  {
+                    if ((zdimid != CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID)
+                        || (zdimid == CDI_UNDEFID && zvarid != CDI_UNDEFID && zvarid == zvarid2)
+                        || (zdimid == CDI_UNDEFID && zaxisType == ncvars[ncvarid2].zaxistype)
+                        || (zdimid == CDI_UNDEFID && zvarid2 == CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID))
+                      {
+                        if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid2, ncvars[ncvarid2].name);
+                        ncvars[ncvarid2].zaxisID = zaxisID;
+                      }
+                  }
+              }
+        }
+    }
+
+  return 0;
+}
+
+struct cdf_varinfo
+{
+  int varid;
+  const char *name;
+};
+
+static int
+cdf_cmp_varname(const void *s1, const void *s2)
+{
+  const struct cdf_varinfo *x = (const struct cdf_varinfo *) s1, *y = (const struct cdf_varinfo *) s2;
+  return strcmp(x->name, y->name);
+}
+
+static void
+cdf_sort_varnames(int *varids, int nvars, const ncvar_t *ncvars)
+{
+  struct cdf_varinfo *varInfo = (struct cdf_varinfo *) Malloc((size_t) nvars * sizeof(struct cdf_varinfo));
+
+  for (int varID = 0; varID < nvars; varID++)
+    {
+      int ncvarid = varids[varID];
+      varInfo[varID].varid = ncvarid;
+      varInfo[varID].name = ncvars[ncvarid].name;
+    }
+  qsort(varInfo, (size_t) nvars, sizeof(varInfo[0]), cdf_cmp_varname);
+  for (int varID = 0; varID < nvars; varID++)
+    {
+      varids[varID] = varInfo[varID].varid;
+    }
+  Free(varInfo);
+  if (CDI_Debug)
+    for (int i = 0; i < nvars; i++) Message("sorted varids[%d] = %d", i, varids[i]);
+}
+
+static void
+cdf_define_code_and_param(int vlistID, int varID)
+{
+  if (vlistInqVarCode(vlistID, varID) == -varID - 1)
+    {
+      char name[CDI_MAX_NAME];
+      name[0] = 0;
+      vlistInqVarName(vlistID, varID, name);
+      size_t len = strlen(name);
+      if (len > 3 && isdigit((int) name[3]))
+        {
+          if (strStartsWith(name, "var")) vlistDefVarCode(vlistID, varID, atoi(name + 3));
+        }
+      else if (len > 4 && isdigit((int) name[4]))
+        {
+          if (strStartsWith(name, "code")) vlistDefVarCode(vlistID, varID, atoi(name + 4));
+        }
+      else if (len > 5 && isdigit((int) name[5]))
+        {
+          if (strStartsWith(name, "param"))
+            {
+              int pnum = -1, pcat = 255, pdis = 255;
+              sscanf(name + 5, "%d.%d.%d", &pnum, &pcat, &pdis);
+              vlistDefVarParam(vlistID, varID, cdiEncodeParam(pnum, pcat, pdis));
+            }
+        }
+    }
+}
+
+static void
+cdf_define_institut_and_model_id(int vlistID, int varID)
+{
+  int varInstID = vlistInqVarInstitut(vlistID, varID);
+  int varModelID = vlistInqVarModel(vlistID, varID);
+  int varTableID = vlistInqVarTable(vlistID, varID);
+  int code = vlistInqVarCode(vlistID, varID);
+  if (CDI_Default_TableID != CDI_UNDEFID)
+    {
+      char name[CDI_MAX_NAME];
+      name[0] = 0;
+      char longname[CDI_MAX_NAME];
+      longname[0] = 0;
+      char units[CDI_MAX_NAME];
+      units[0] = 0;
+      tableInqEntry(CDI_Default_TableID, code, -1, name, longname, units);
+      if (name[0])
+        {
+          cdiDeleteKey(vlistID, varID, CDI_KEY_NAME);
+          cdiDeleteKey(vlistID, varID, CDI_KEY_LONGNAME);
+          cdiDeleteKey(vlistID, varID, CDI_KEY_UNITS);
+
+          if (varTableID != CDI_UNDEFID)
+            {
+              cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name);
+              if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname);
+              if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units);
+            }
+          else
+            {
+              varTableID = CDI_Default_TableID;
+            }
+        }
+
+      if (CDI_Default_ModelID != CDI_UNDEFID) varModelID = CDI_Default_ModelID;
+      if (CDI_Default_InstID != CDI_UNDEFID) varInstID = CDI_Default_InstID;
+    }
+  if (varInstID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, varInstID);
+  if (varModelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, varModelID);
+  if (varTableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, varTableID);
+}
+
+static size_t
+cdf_xtype_to_numbytes(int xtype)
+{
+  size_t numBytes = 8;
+
+  // clang-format off
+  if      (xtype == NC_BYTE  )  numBytes = 1;
+  else if (xtype == NC_CHAR  )  numBytes = 1;
+  else if (xtype == NC_SHORT )  numBytes = 2;
+  else if (xtype == NC_INT   )  numBytes = 4;
+  else if (xtype == NC_FLOAT )  numBytes = 4;
+#ifdef HAVE_NETCDF4
+  else if (xtype == NC_UBYTE )  numBytes = 1;
+  else if (xtype == NC_USHORT)  numBytes = 2;
+  else if (xtype == NC_LONG  )  numBytes = 4;
+  else if (xtype == NC_UINT  )  numBytes = 4;
+#endif
+  // clang-format on
+
+  return numBytes;
+}
+
+static inline size_t
+size_of_dim_chunks(size_t n, size_t c)
+{
+  return (n / c + (n % c > 0)) * c;
+}
+
+static size_t
+calc_chunk_cache_size(int timedimid, ncvar_t *ncvar)
+{
+  size_t nx = 0, ny = 0;
+  size_t cx = 0, cy = 0, cz = 0;
+  for (int i = 0; i < ncvar->ndims; i++)
+    {
+      int dimtype = ncvar->dimtypes[i];
+      // clang-format off
+      if      (dimtype == Z_AXIS) { cz = ncvar->chunks[i]; }
+      else if (dimtype == Y_AXIS) { cy = ncvar->chunks[i]; ny = ncvar->ySize; }
+      else if (dimtype == X_AXIS) { cx = ncvar->chunks[i]; nx = ncvar->xSize; }
+      // clang-format on
+    }
+
+  size_t chunkCacheSize = (ncvar->dimids[0] == timedimid) ? ncvar->chunks[0] : 1;
+  if (cz > 0) chunkCacheSize *= cz;
+
+  if (chunkCacheSize == 1) return 0;  // no chunk cache needed because the full field is read
+
+  if (ny > 0 && cy > 0) chunkCacheSize *= size_of_dim_chunks(ny, cy);
+  if (nx > 0 && cx > 0) chunkCacheSize *= size_of_dim_chunks(nx, cx);
+
+  chunkCacheSize *= cdf_xtype_to_numbytes(ncvar->xtype);
+
+  if (CDI_Chunk_Cache_Max > 0 && chunkCacheSize > CDI_Chunk_Cache_Max) chunkCacheSize = CDI_Chunk_Cache_Max;
+
+  return chunkCacheSize;
+}
+
+static void
+cdf_set_var_chunk_cache(ncvar_t *ncvar, int ncvarid, size_t chunkCacheSize)
+{
+  if (CDI_Debug || CDI_Chunk_Cache_Info) Message("%s: chunkCacheSize=%zu", ncvar->name, chunkCacheSize);
+  nc_set_var_chunk_cache(ncvar->ncid, ncvarid, chunkCacheSize, ncvar->chunkCacheNelems, ncvar->chunkCachePreemption);
+}
+
+// define all input data variables
+static void
+cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, int nvars, int num_ncvars, ncvar_t *ncvars,
+                    ncdim_t *ncdims, int timedimid)
+{
+  int *varids = (int *) Malloc((size_t) nvars * sizeof(int));
+  int n = 0;
+  for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++)
+    if (ncvars[ncvarid].varStatus == DataVar) varids[n++] = ncvarid;
+
+  if (CDI_Debug)
+    for (int i = 0; i < nvars; i++) Message("varids[%d] = %d", i, varids[i]);
+
+  if (streamptr->sortname) cdf_sort_varnames(varids, nvars, ncvars);
+
+  for (int varID1 = 0; varID1 < nvars; varID1++)
+    {
+      int ncvarid = varids[varID1];
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int gridID = ncvar->gridID;
+      int zaxisID = ncvar->zaxisID;
+
+      stream_new_var(streamptr, gridID, zaxisID, CDI_UNDEFID);
+      int varID = vlistDefVar(vlistID, gridID, zaxisID, ncvar->timetype);
+
+#ifdef HAVE_NETCDF4
+      if (ncvar->hasFilter) cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC_IN, ncvar->filterSpec);
+      if (ncvar->hasFilter) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_FILTER);
+      if (ncvar->hasDeflate) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_ZIP);
+      if (ncvar->hasSzip) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_SZIP);
+      if (ncvar->isChunked)
+        {
+          if (ncvar->chunkType != CDI_UNDEFID) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, ncvar->chunkType);
+          if (ncvar->chunkSize > 1) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, ncvar->chunkSize);
+
+          size_t cacheSize = (CDI_Chunk_Cache >= 0) ? (size_t) CDI_Chunk_Cache : calc_chunk_cache_size(timedimid, ncvar);
+          cdf_set_var_chunk_cache(ncvar, ncvarid, cacheSize);
+        }
+#endif
+
+      streamptr->vars[varID1].defmiss = false;
+      streamptr->vars[varID1].ncvarid = ncvarid;
+
+      cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, ncvar->name);
+      if (ncvar->param != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, ncvar->param);
+      if (ncvar->code != CDI_UNDEFID) vlistDefVarCode(vlistID, varID, ncvar->code);
+      if (ncvar->code != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, cdiEncodeParam(ncvar->code, ncvar->tabnum, 255));
+      if (ncvar->longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, ncvar->longname);
+      if (ncvar->stdname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, ncvar->stdname);
+      if (ncvar->unitsLen > 0) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, ncvar->units);
+
+      if (ncvar->validrangeDefined) vlistDefVarValidrange(vlistID, varID, ncvar->validrange);
+
+      if (IS_NOT_EQUAL(ncvar->addoffset, 0.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, ncvar->addoffset);
+      if (IS_NOT_EQUAL(ncvar->scalefactor, 1.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, ncvar->scalefactor);
+
+      vlistDefVarDatatype(vlistID, varID, cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned));
+
+      vlistDefVarInstitut(vlistID, varID, instID);
+      vlistDefVarModel(vlistID, varID, modelID);
+      if (ncvar->tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, ncvar->tableID);
+
+      if (ncvar->fillvalDefined == false && ncvar->missvalDefined)
+        {
+          ncvar->fillvalDefined = true;
+          ncvar->fillval = ncvar->missval;
+        }
+
+      if (ncvar->fillvalDefined) vlistDefVarMissval(vlistID, varID, ncvar->fillval);
+
+      if (CDI_Debug)
+        Message("varID = %d  gridID = %d  zaxisID = %d", varID, vlistInqVarGrid(vlistID, varID), vlistInqVarZaxis(vlistID, varID));
+
+      int gridindex = vlistGridIndex(vlistID, gridID);
+      int xdimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
+      int ydimid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+
+      int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+      int zdimid = streamptr->zaxisID[zaxisindex];
+
+      int ndims = ncvar->ndims;
+      static const int ipow10[4] = { 1, 10, 100, 1000 };
+
+      int iodim = (ncvar->timetype != TIME_CONSTANT);
+
+      const int *dimids = ncvar->dimids;
+
+      int ixyz = 0;
+      if ((ndims - iodim) <= 2 && (ydimid == xdimid || ydimid == CDI_UNDEFID))
+        {
+          ixyz = (xdimid == ncdims[dimids[ndims - 1]].dimid) ? 321 : 213;
+        }
+      else
+        {
+          for (int idim = iodim; idim < ndims; idim++)
+            {
+              int dimid = ncdims[dimids[idim]].dimid;
+              // clang-format off
+              if      (xdimid == dimid) ixyz += 1 * ipow10[ndims - idim - 1];
+              else if (ydimid == dimid) ixyz += 2 * ipow10[ndims - idim - 1];
+              else if (zdimid == dimid) ixyz += 3 * ipow10[ndims - idim - 1];
+              // clang-format on
+            }
+        }
+
+      if (ncvar->isCubeSphere) ixyz = 0;
+      vlistDefVarXYZ(vlistID, varID, ixyz);
+      /*
+      printf("ixyz %d\n", ixyz);
+      printf("ndims %d\n", ncvar->ndims);
+      for (int i = 0; i < ncvar->ndims; ++i)
+        printf("dimids: %d %d\n", i, dimids[i]);
+      printf("xdimid, ydimid %d %d\n", xdimid, ydimid);
+      */
+      if (ncvar->numberOfForecastsInEnsemble != -1)
+        {
+          cdiDefKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, ncvar->numberOfForecastsInEnsemble);
+          cdiDefKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, ncvar->perturbationNumber);
+          if (ncvar->numberOfForecastsInEnsemble != -1)
+            cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, ncvar->typeOfEnsembleForecast);
+        }
+
+      if (ncvar->extra[0] != 0) cdiDefKeyString(vlistID, varID, CDI_KEY_CHUNKS, ncvar->extra);
+    }
+
+  for (int varID = 0; varID < nvars; varID++)
+    {
+      int ncvarid = varids[varID];
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      int ncid = ncvar->ncid;
+      int nvatts = ncvar->natts;
+      for (int iatt = 0; iatt < nvatts; ++iatt) cdf_set_cdi_attr(ncid, ncvarid, ncvar->atts[iatt], vlistID, varID, false);
+
+      if (ncvar->atts) Free(ncvar->atts);
+      if (ncvar->vct) Free(ncvar->vct);
+
+      ncvar->atts = NULL;
+      ncvar->vct = NULL;
+    }
+
+  // release mem of not freed attributes
+  for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->atts) Free(ncvar->atts);
+      ncvar->atts = NULL;
+    }
+
+  if (varids) Free(varids);
+
+  for (int varID = 0; varID < nvars; varID++) cdf_define_code_and_param(vlistID, varID);
+  for (int varID = 0; varID < nvars; varID++) cdf_define_institut_and_model_id(vlistID, varID);
+}
+
+static void
+cdf_copy_attint(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname)
+{
+  int attint[8];
+  int *pattint = (attlen > 8) ? (int *) Malloc(attlen * sizeof(int)) : attint;
+  cdfGetAttInt(fileID, NC_GLOBAL, attname, attlen, pattint);
+  int datatype = (xtype == NC_SHORT) ? CDI_DATATYPE_INT16 : CDI_DATATYPE_INT32;
+  cdiDefAttInt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattint);
+  if (attlen > 8) Free(pattint);
+}
+
+static void
+cdf_copy_attflt(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname)
+{
+  double attflt[8];
+  double *pattflt = (attlen > 8) ? (double *) Malloc(attlen * sizeof(double)) : attflt;
+  cdfGetAttDouble(fileID, NC_GLOBAL, attname, attlen, pattflt);
+  int datatype = (xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
+  cdiDefAttFlt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattflt);
+  if (attlen > 8) Free(pattflt);
+}
+
+static bool
+check_cube_sphere(int vlistID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims)
+{
+  bool isGeosData = false;
+  int numNames = 4;
+  const char *attnames[] = { "additional_vars", "file_format_version", "gridspec_file", "grid_mapping_name" };
+  const char *grid_mapping = "gnomonic cubed-sphere";
+  char attstring[256];
+  int nf_dimid = -1, ncontact_dimid = -1;
+
+  int numFound = 0;
+  for (int i = 0; i < numNames; ++i)
+    if (0 == cdiInqAttTxt(vlistID, CDI_GLOBAL, attnames[i], (int) sizeof(attstring), attstring)) numFound++;
+
+  if (numFound == numNames && strStartsWith(attstring, grid_mapping))
+    {
+      for (int i = 0; i < numNames; ++i) cdiDelAtt(vlistID, CDI_GLOBAL, attnames[i]);
+
+      const char *nf_name = "nf";
+      const char *ncontact_name = "ncontact";
+      for (int varid = 0; varid < nvars; ++varid)
+        {
+          ncvar_t *ncvar = &ncvars[varid];
+          if (ncvar->ndims == 1)
+            {
+              int dimid = ncvar->dimids[0];
+              if (ncdims[dimid].len == 6 && str_is_equal(nf_name, ncvar->name))
+                {
+                  isGeosData = true;
+                  nf_dimid = ncvar->dimids[0];
+                }
+              if (ncdims[dimid].len == 4 && str_is_equal(ncontact_name, ncvar->name)) ncontact_dimid = ncvar->dimids[0];
+            }
+          if (isGeosData && ncontact_dimid != -1) break;
+        }
+    }
+
+  if (isGeosData)
+    {
+      ncdims[nf_dimid].dimtype = E_AXIS;
+      for (int varid = 0; varid < nvars; ++varid)
+        {
+          ncvar_t *ncvar = &ncvars[varid];
+          if (str_is_equal("orientation", ncvar->name) || str_is_equal("anchor", ncvar->name)
+              || str_is_equal("contacts", ncvar->name))
+            cdf_set_var(ncvar, CoordVar);
+        }
+
+      for (int varid = 0; varid < nvars; ++varid)
+        {
+          ncvar_t *ncvar = &ncvars[varid];
+          int ndims = ncvar->ndims;
+          if (ndims >= 3 && ncvar->dimids[ndims - 3] == nf_dimid && ncvar->ncoordvars == 2 && ncvar->gmapid != -1)
+            ncvar->isCubeSphere = true;
+        }
+
+      int xvarid = -1, yvarid = -1;
+      int xboundsid = -1, yboundsid = -1;
+      for (int varid = 0; varid < nvars; ++varid)
+        {
+          ncvar_t *ncvar = &ncvars[varid];
+          int ndims = ncvar->ndims;
+          if (ndims == 3)
+            {
+              // clang-format off
+              if      (str_is_equal("lons", ncvar->name)) xvarid = varid;
+              else if (str_is_equal("lats", ncvar->name)) yvarid = varid;
+              else if (str_is_equal("corner_lons", ncvar->name)) xboundsid = varid;
+              else if (str_is_equal("corner_lats", ncvar->name)) yboundsid = varid;
+              // clang-format on
+            }
+          if (xvarid != -1 && xboundsid != -1 && yvarid != -1 && yboundsid != -1)
+            {
+              cdf_set_var(&ncvars[xboundsid], CoordVar);
+              cdf_set_var(&ncvars[yboundsid], CoordVar);
+              ncvars[xvarid].bounds = xboundsid;
+              ncvars[yvarid].bounds = yboundsid;
+              break;
+            }
+        }
+    }
+
+  return isGeosData;
+}
+
+static void
+cdf_scan_global_attr(int fileID, int vlistID, int ngatts, int *instID, int *modelID, bool *ucla_les, unsigned char *uuidOfVGrid,
+                     GridInfo *gridInfo)
+{
+  nc_type xtype = 0;
+  size_t attlen = 0;
+  char attname[CDI_MAX_NAME] = { 0 };
+
+  for (int iatt = 0; iatt < ngatts; iatt++)
+    {
+      cdf_inq_attname(fileID, NC_GLOBAL, iatt, attname);
+      cdf_inq_atttype(fileID, NC_GLOBAL, attname, &xtype);
+      cdf_inq_attlen(fileID, NC_GLOBAL, attname, &attlen);
+
+      if (xtypeIsText(xtype))
+        {
+          enum
+          {
+            attstringsize = 65636
+          };
+          char attstring[attstringsize] = { 0 };
+
+          cdfGetAttText(fileID, NC_GLOBAL, attname, attstringsize, attstring);
+
+          size_t attstrlen = strlen(attstring);
+
+          if (attlen > 0 && attstring[0] != 0)
+            {
+              if (str_is_equal(attname, "institution"))
+                {
+                  *instID = institutInq(0, 0, NULL, attstring);
+                  if (*instID == CDI_UNDEFID) *instID = institutDef(0, 0, NULL, attstring);
+
+                  cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring);
+                }
+              else if (str_is_equal(attname, "source"))
+                {
+                  *modelID = modelInq(-1, 0, attstring);
+                  if (*modelID == CDI_UNDEFID) *modelID = modelDef(-1, 0, attstring);
+
+                  cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring);
+                }
+              else if (str_is_equal(attname, "Source") && strStartsWith(attstring, "UCLA-LES"))
+                {
+                  *ucla_les = true;
+                  cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring);
+                }
+              /*
+              else if ( str_is_equal(attname, "Conventions") )
+                {
+                }
+              */
+              else if (str_is_equal(attname, "_NCProperties"))
+                {
+                }
+              else if (str_is_equal(attname, "CDI"))
+                {
+                }
+              else if (str_is_equal(attname, "CDO"))
+                {
+                }
+              /*
+              else if ( str_is_equal(attname, "forecast_reference_time") )
+                {
+                  memcpy(fcreftime, attstring, attstrlen+1);
+                }
+              */
+              else if (str_is_equal(attname, "grid_file_uri"))
+                {
+                  memcpy(gridInfo->gridfile, attstring, attstrlen + 1);
+                }
+              else if (attstrlen == 36 && str_is_equal(attname, "uuidOfHGrid"))
+                {
+                  cdiStr2UUID(attstring, gridInfo->uuid);
+                }
+              else if (attstrlen == 36 && str_is_equal(attname, "uuidOfVGrid"))
+                {
+                  cdiStr2UUID(attstring, uuidOfVGrid);
+                }
+              else
+                {
+                  if (str_is_equal(attname, "ICON_grid_file_uri") && gridInfo->gridfile[0] == 0)
+                    memcpy(gridInfo->gridfile, attstring, attstrlen + 1);
+
+                  cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring);
+                }
+            }
+          else
+            {
+              cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring);
+            }
+        }
+      else if (xtype == NC_SHORT || xtype == NC_INT)
+        {
+          if (str_is_equal(attname, "number_of_grid_used"))
+            {
+              gridInfo->number_of_grid_used = CDI_UNDEFID;
+              cdfGetAttInt(fileID, NC_GLOBAL, attname, 1, &gridInfo->number_of_grid_used);
+            }
+          else
+            {
+              cdf_copy_attint(fileID, vlistID, xtype, attlen, attname);
+            }
+        }
+      else if (xtype == NC_FLOAT || xtype == NC_DOUBLE)
+        {
+          cdf_copy_attflt(fileID, vlistID, xtype, attlen, attname);
+        }
+    }
+}
+
+static int
+find_leadtime(int nvars, ncvar_t *ncvars, int timedimid)
+{
+  int leadtime_id = CDI_UNDEFID;
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->ndims == 1 && timedimid == ncvar->dimids[0])
+        if (ncvar->stdname[0] && str_is_equal(ncvar->stdname, "forecast_period"))
+          {
+            leadtime_id = ncvarid;
+            break;
+          }
+    }
+
+  return leadtime_id;
+}
+
+static void
+find_time_vars(int nvars, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, stream_t *streamptr, bool *timeHasUnits,
+               bool *timeHasBounds, bool *timeClimatology)
+{
+  int ncvarid;
+
+  if (timedimid == CDI_UNDEFID)
+    {
+      char timeUnitsStr[CDI_MAX_NAME];
+
+      for (ncvarid = 0; ncvarid < nvars; ncvarid++)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvar->ndims == 0 && ncvar->units[0] && str_is_equal(ncvar->name, "time"))
+            {
+              strcpy(timeUnitsStr, ncvar->units);
+              str_to_lower(timeUnitsStr);
+
+              if (is_time_units(timeUnitsStr))
+                {
+                  streamptr->basetime.ncvarid = ncvarid;
+                  break;
+                }
+            }
+        }
+    }
+  else
+    {
+      bool hasTimeVar = false;
+
+      if (ncdims[timedimid].ncvarid != CDI_UNDEFID)
+        {
+          streamptr->basetime.ncvarid = ncdims[timedimid].ncvarid;
+          hasTimeVar = true;
+        }
+
+      for (ncvarid = 0; ncvarid < nvars; ncvarid++)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 1 && timedimid == ncvar->dimids[0]
+              && !xtypeIsText(ncvar->xtype) && is_timeaxis_units(ncvar->units))
+            {
+              ncvar->varStatus = CoordVar;
+
+              if (!hasTimeVar)
+                {
+                  hasTimeVar = true;
+                  streamptr->basetime.ncvarid = ncvarid;
+                }
+              else
+                {
+                  Warning("Found more than one time variable, skipped variable %s!", ncvar->name);
+                }
+            }
+        }
+
+      if (hasTimeVar == false)  // search for WRF time description
+        {
+          for (ncvarid = 0; ncvarid < nvars; ncvarid++)
+            {
+              ncvar_t *ncvar = &ncvars[ncvarid];
+              if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 2 && timedimid == ncvar->dimids[0]
+                  && xtypeIsText(ncvar->xtype) && (ncdims[ncvar->dimids[1]].len == 19 || ncdims[ncvar->dimids[1]].len == 64))
+                {
+                  ncvar->isTaxis = true;
+                  streamptr->basetime.ncvarid = ncvarid;
+                  streamptr->basetime.isWRF = true;
+                  break;
+                }
+            }
+        }
+
+      // time varID
+      ncvarid = streamptr->basetime.ncvarid;
+
+      if (ncvarid == CDI_UNDEFID && ncdims[timedimid].len > 0) Warning("Time variable >%s< not found!", ncdims[timedimid].name);
+    }
+
+  // time varID
+  ncvarid = streamptr->basetime.ncvarid;
+
+  if (ncvarid != CDI_UNDEFID && streamptr->basetime.isWRF == false)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->units[0] != 0) *timeHasUnits = true;
+
+      if (ncvar->bounds != CDI_UNDEFID)
+        {
+          int nbdims = ncvars[ncvar->bounds].ndims;
+          if (nbdims == 2)
+            {
+              int len = (int) ncdims[ncvars[ncvar->bounds].dimids[nbdims - 1]].len;
+              if (len == 2 && timedimid == ncvars[ncvar->bounds].dimids[0])
+                {
+                  *timeHasBounds = true;
+                  streamptr->basetime.ncvarboundsid = ncvar->bounds;
+                  if (ncvar->isClimatology) *timeClimatology = true;
+                }
+            }
+        }
+    }
+}
+
+static void
+read_vct_echam(int fileID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims, double **vct, size_t *pvctsize)
+{
+  // find ECHAM VCT
+  int nvcth_id = CDI_UNDEFID, vcta_id = CDI_UNDEFID, vctb_id = CDI_UNDEFID;
+  // int p0_id = CDI_UNDEFID;
+
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      const char *name = ncvar->name;
+      if (ncvar->ndims == 1)
+        {
+          size_t len = strlen(name);
+          if (len == 4 && name[0] == 'h' && name[1] == 'y')
+            {
+              if (name[2] == 'a' && name[3] == 'i')  // hyai
+                {
+                  vcta_id = ncvarid;
+                  nvcth_id = ncvar->dimids[0];
+                  ncvar->varStatus = CoordVar;
+                }
+              else if (name[2] == 'b' && name[3] == 'i')  // hybi
+                {
+                  vctb_id = ncvarid;
+                  nvcth_id = ncvar->dimids[0];
+                  ncvar->varStatus = CoordVar;
+                }
+              else if ((name[2] == 'a' || name[2] == 'b') && name[3] == 'm')
+                {
+                  ncvar->varStatus = CoordVar;  // hyam or hybm
+                }
+            }
+        }
+      /*
+      else if (ncvar->ndims == 0)
+        {
+          size_t len = strlen(name);
+          if (len == 2 && name[0] == 'P' && name[1] == '0') p0_id = ncvarid;
+        }
+      */
+    }
+
+  // read VCT
+  if (nvcth_id != CDI_UNDEFID && vcta_id != CDI_UNDEFID && vctb_id != CDI_UNDEFID)
+    {
+      size_t vctsize = 2 * ncdims[nvcth_id].len;
+      *vct = (double *) Malloc(vctsize * sizeof(double));
+      cdf_get_var_double(fileID, vcta_id, *vct);
+      cdf_get_var_double(fileID, vctb_id, *vct + vctsize / 2);
+      *pvctsize = vctsize;
+      /*
+      if (p0_id != CDI_UNDEFID)
+        {
+          double p0;
+          cdf_get_var_double(fileID, p0_id, &p0);
+        }
+      */
+    }
+}
+
+static void
+cdf_set_ucla_dimtype(int ndims, ncdim_t *ncdims, ncvar_t *ncvars)
+{
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      ncdim_t *ncdim = &ncdims[ncdimid];
+      int ncvarid = ncdim->ncvarid;
+      if (ncvarid != -1)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncdim->dimtype == CDI_UNDEFID && ncvar->units[0] == 'm')
+            {
+              // clang-format off
+              if      (ncvar->name[0] == 'x') ncdim->dimtype = X_AXIS;
+              else if (ncvar->name[0] == 'y') ncdim->dimtype = Y_AXIS;
+              else if (ncvar->name[0] == 'z') ncdim->dimtype = Z_AXIS;
+              // clang-format on
+            }
+        }
+    }
+}
+
+static int
+cdf_check_variables(stream_t *streamptr, int nvars, ncvar_t *ncvars, size_t ntsteps, int timedimid)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->isTaxis && ncvar->ndims == 2)
+        {
+          ncvar->varStatus = CoordVar;
+          continue;
+        }
+
+      if (ncvar->varStatus == UndefVar && ncvar->ndims > 1 && timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0])
+        cdf_set_var(ncvar, DataVar);
+
+      if (ncvar->varStatus == UndefVar)
+        {
+          if (ncvar->ndims == 0)
+            cdf_set_var(ncvar, nvars == 1 ? DataVar : CoordVar);
+          else if (ncvar->ndims > 0)
+            cdf_set_var(ncvar, DataVar);
+          else
+            {
+              ncvar->varStatus = CoordVar;
+              Warning("Variable %s has an unknown type, skipped!", ncvar->name);
+            }
+        }
+
+      if (ncvar->varStatus == CoordVar) continue;
+
+      if ((ncvar->ndims > 4 && !ncvar->isCubeSphere) || ncvar->ndims > 5)
+        {
+          ncvar->varStatus = CoordVar;
+          Warning("%d dimensional variables are not supported, skipped variable %s!", ncvar->ndims, ncvar->name);
+          continue;
+        }
+
+      if (((ncvar->ndims == 4 && !ncvar->isCubeSphere) || ncvar->ndims == 5) && timedimid == CDI_UNDEFID)
+        {
+          ncvar->varStatus = CoordVar;
+          Warning("%d dimensional variables without time dimension are not supported, skipped variable %s!", ncvar->ndims,
+                  ncvar->name);
+          continue;
+        }
+
+      if (xtypeIsText(ncvar->xtype))
+        {
+          ncvar->varStatus = CoordVar;
+          Warning("Unsupported data type (char/string), skipped variable %s!", ncvar->name);
+          continue;
+        }
+
+      if (cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == -1)
+        {
+          ncvar->varStatus = CoordVar;
+          Warning("Unsupported data type, skipped variable %s!", ncvar->name);
+          continue;
+        }
+
+      if (timedimid != CDI_UNDEFID && ntsteps == 0 && ncvar->ndims > 0)
+        {
+          if (timedimid == ncvar->dimids[0])
+            {
+              ncvar->varStatus = CoordVar;
+              Warning("Number of time steps undefined, skipped variable %s!", ncvar->name);
+              continue;
+            }
+        }
+    }
+
+  return timedimid;
+}
+
+static void
+cdfVerifyVars(int nvars, ncvar_t *ncvars
+              //, ncdim_t *ncdims
+)
+{
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar && ncvar->ndims > 0)
+        {
+          int ndims = 0;
+          for (int i = 0; i < ncvar->ndims; ++i)
+            {
+              // clang-format off
+              if      (ncvar->dimtypes[i] == T_AXIS) ndims++;
+              else if (ncvar->dimtypes[i] == E_AXIS) ndims++;
+              else if (ncvar->dimtypes[i] == Z_AXIS) ndims++;
+              else if (ncvar->dimtypes[i] == Y_AXIS) ndims++;
+              else if (ncvar->dimtypes[i] == X_AXIS) ndims++;
+              // clang-format on
+            }
+
+          if (ncvar->ndims != ndims)
+            {
+              ncvar->varStatus = CoordVar;
+              Warning("Inconsistent number of dimensions, skipped variable %s!", ncvar->name);
+            }
+          /* check failed with cdo option --cmor
+          int zdimid = -1;
+          for (int i = 0; i < ncvar->ndims; ++i)
+            {
+              if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i];
+            }
+
+          int zaxisID = ncvar->zaxisID;
+          if (zaxisInqScalar(zaxisID) && zdimid != -1)
+            {
+              ncvar->varStatus = CoordVar;
+              Warning("Unsupported dimension >%s<, skipped variable %s!", ncdims[zdimid].name, ncvar->name);
+            }
+          */
+        }
+    }
+}
+
+static CdiDateTime
+wrf_read_timestep(int fileID, int nctimevarid, int tsID)
+{
+  enum
+  {
+    // position of terminator separating date and time from rest of
+    dateTimeSepPos = 19,
+    dateTimeStrSize = 128,
+  };
+  size_t start[2] = { (size_t) tsID, 0 }, count[2] = { 1, dateTimeSepPos };
+  char stvalue[dateTimeStrSize];
+  stvalue[0] = 0;
+  cdf_get_vara_text(fileID, nctimevarid, start, count, stvalue);
+  stvalue[dateTimeSepPos] = 0;
+
+  int year = 1, month = 1, day = 1, hour = 0, minute = 0, second = 0;
+  if (strlen(stvalue) == dateTimeSepPos) sscanf(stvalue, "%d-%d-%d_%d:%d:%d", &year, &month, &day, &hour, &minute, &second);
+  return cdiDateTime_set(cdiEncodeDate(year, month, day), cdiEncodeTime(hour, minute, second));
+}
+
+static double
+get_timevalue(int fileID, int nctimevarid, size_t ncStepIndex, double *timevarBuffer)
+{
+  double timevalue = 0.0;
+
+  if (timevarBuffer)
+    {
+      timevalue = timevarBuffer[ncStepIndex];
+    }
+  else
+    {
+      cdf_get_var1_double(fileID, nctimevarid, &ncStepIndex, &timevalue);
+    }
+
+  if (timevalue >= NC_FILL_DOUBLE || timevalue < -NC_FILL_DOUBLE) timevalue = 0.0;
+
+  return timevalue;
+}
+
+static void
+cdf_read_timesteps(size_t numTimesteps, stream_t *streamptr, taxis_t *taxis0)
+{
+  streamptr->curTsID = 0;
+  streamptr->rtsteps = 1;
+
+  if (numTimesteps == 0)
+    {
+      cdi_create_timesteps(numTimesteps, streamptr);
+      cdf_create_records(streamptr, 0);
+    }
+  else
+    {
+      int fileID = streamptr->fileID;
+      int nctimevarid = streamptr->basetime.ncvarid;
+      int nctimeboundsid = streamptr->basetime.ncvarboundsid;
+      bool hasTimesteps = (nctimevarid != CDI_UNDEFID && streamptr->basetime.hasUnits);
+
+      int *ncStepIndices = (int *) Malloc(numTimesteps * sizeof(int));
+      for (size_t tsID = 0; tsID < numTimesteps; ++tsID) ncStepIndices[tsID] = (int) tsID;
+
+      CdiDateTime *vDateTimeList = NULL;
+
+      if (hasTimesteps)
+        {
+          vDateTimeList = (CdiDateTime *) Malloc(numTimesteps * sizeof(CdiDateTime));
+
+          if (streamptr->basetime.isWRF)
+            {
+              for (size_t tsID = 0; tsID < numTimesteps; ++tsID)
+                vDateTimeList[tsID] = wrf_read_timestep(fileID, nctimevarid, (int) tsID);
+            }
+          else
+            {
+              double *timevarBuffer = (double *) Malloc(numTimesteps * sizeof(double));
+              cdf_get_var_double(fileID, nctimevarid, timevarBuffer);
+              for (size_t tsID = 0; tsID < numTimesteps; ++tsID)
+                vDateTimeList[tsID] = cdi_decode_timeval(get_timevalue(fileID, nctimevarid, tsID, timevarBuffer), taxis0);
+              if (timevarBuffer) Free(timevarBuffer);
+            }
+        }
+
+      // process query information if available
+      CdiQuery *query = streamptr->query;
+      if (query && cdiQueryNumStepidx(query) > 0)
+        {
+          /* currently, the query interface does not support more
+           * than INT_MAX-1 steps! */
+          assert(numTimesteps < INT_MAX);
+          for (size_t tsID = 0; tsID < numTimesteps; ++tsID)
+            if (cdiQueryStepidx(query, (int) tsID + 1) < 0) ncStepIndices[tsID] = -1;
+        }
+
+      size_t numSteps = 0;
+      for (size_t tsID = 0; tsID < numTimesteps; ++tsID) numSteps += (ncStepIndices[tsID] >= 0);
+
+      cdi_create_timesteps(numSteps, streamptr);
+
+      for (size_t tsID = 0, stepID = 0; tsID < numTimesteps; ++tsID)
+        {
+          if (ncStepIndices[tsID] >= 0)
+            {
+              streamptr->tsteps[stepID].ncStepIndex = ncStepIndices[tsID];
+              cdf_create_records(streamptr, stepID);
+
+              taxis_t *taxis = &streamptr->tsteps[stepID].taxis;
+              ptaxisCopy(taxis, taxis0);
+
+              if (hasTimesteps) taxis->vDateTime = vDateTimeList[tsID];
+
+              stepID++;
+            }
+        }
+
+      if (ncStepIndices) Free(ncStepIndices);
+
+      if (hasTimesteps)
+        {
+          if (nctimeboundsid != CDI_UNDEFID)
+            {
+              enum
+              {
+                numBnds = 2,
+                tbNdims = 2
+              };
+
+              for (size_t tsID = 0; tsID < numSteps; ++tsID)
+                {
+                  size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
+                  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+                  size_t start[tbNdims] = { ncStepIndex, 0 };
+                  size_t count[tbNdims] = { 1, numBnds };
+                  double timeBnds[numBnds];
+                  cdf_get_vara_double(fileID, nctimeboundsid, start, count, timeBnds);
+                  for (size_t i = 0; i < numBnds; ++i)
+                    if (timeBnds[i] >= NC_FILL_DOUBLE || timeBnds[i] < -NC_FILL_DOUBLE) timeBnds[i] = 0.0;
+
+                  taxis->vDateTime_lb = cdi_decode_timeval(timeBnds[0], taxis);
+                  taxis->vDateTime_ub = cdi_decode_timeval(timeBnds[1], taxis);
+                }
+            }
+
+          int leadtimeid = streamptr->basetime.leadtimeid;
+          if (leadtimeid != CDI_UNDEFID)
+            {
+              for (size_t tsID = 0; tsID < numSteps; ++tsID)
+                {
+                  size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
+                  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+                  cdi_set_forecast_period(get_timevalue(fileID, leadtimeid, ncStepIndex, NULL), taxis);
+                }
+            }
+        }
+
+      if (vDateTimeList) Free(vDateTimeList);
+    }
+}
+
+static void
+stream_set_ncdims(stream_t *streamptr, int ndims, ncdim_t *ncdims)
+{
+  int n = (ndims > MAX_DIMS_PS) ? MAX_DIMS_PS : ndims;
+  streamptr->ncNumDims = n;
+  for (int i = 0; i < n; i++) streamptr->ncDimID[i] = ncdims[i].dimid;
+  for (int i = 0; i < n; i++) streamptr->ncDimLen[i] = ncdims[i].len;
+}
+
+int
+cdfInqContents(stream_t *streamptr)
+{
+  bool timeHasUnits = false;
+  bool timeHasBounds = false;
+  bool timeClimatology = false;
+  int leadtime_id = CDI_UNDEFID;
+  int format = 0;
+  char fcreftime[CDI_MAX_NAME];
+  GridInfo gridInfo;
+  gridInfo.gridfile[0] = 0;
+  memset(gridInfo.uuid, 0, CDI_UUID_SIZE);
+  gridInfo.number_of_grid_used = CDI_UNDEFID;
+  gridInfo.timedimid = CDI_UNDEFID;
+
+  fcreftime[0] = 0;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  if (CDI_Debug) Message("streamID = %d, fileID = %d", streamptr->self, fileID);
+
+#ifdef HAVE_NETCDF4
+  nc_inq_format(fileID, &format);
+#endif
+
+  int ndims = 0, nvars = 0, ngatts = 0, unlimdimid = 0;
+  cdf_inq(fileID, &ndims, &nvars, &ngatts, &unlimdimid);
+
+  if (CDI_Debug) Message("root: ndims %d, nvars %d, ngatts %d", ndims, nvars, ngatts);
+  /*
+  if ( ndims == 0 )
+    {
+      Warning("No dimensions found!");
+      return CDI_EUFSTRUCT;
+    }
+  */
+  // alloc ncdims
+  ncdim_t *ncdims = ndims ? (ncdim_t *) Malloc((size_t) ndims * sizeof(ncdim_t)) : NULL;
+  init_ncdims(ndims, ncdims);
+
+  if (ndims)
+    {
+      int ncdimid = 0;
+      for (int dimid = 0; dimid < NC_MAX_DIMS; ++dimid)
+        {
+          if (nc_inq_dimlen(fileID, dimid, NULL) == NC_NOERR)
+            {
+              ncdims[ncdimid++].dimid = dimid;
+              if (ncdimid == ndims) break;
+            }
+        }
+    }
+
+#ifdef HAVE_NETCDF4
+  if (format == NC_FORMAT_NETCDF4)
+    {
+      int numgrps = 0;
+      int ncids[NC_MAX_VARS];
+      char gname[CDI_MAX_NAME];
+      nc_inq_grps(fileID, &numgrps, ncids);
+      for (int i = 0; i < numgrps; ++i)
+        {
+          int ncid = ncids[i];
+          nc_inq_grpname(ncid, gname);
+          int gndims, gnvars, gngatts, gunlimdimid;
+          cdf_inq(ncid, &gndims, &gnvars, &gngatts, &gunlimdimid);
+
+          if (CDI_Debug) Message("%s: ndims %d, nvars %d, ngatts %d", gname, gndims, gnvars, gngatts);
+
+          if (gndims == 0)
+            {
+            }
+        }
+      if (numgrps) Warning("NetCDF4 groups not supported! Found %d root group%s.", numgrps, (numgrps > 1) ? "s" : "");
+    }
+#endif
+
+  if (nvars == 0)
+    {
+      Warning("No arrays found!");
+      return CDI_EUFSTRUCT;
+    }
+
+  // alloc ncvars
+  ncvar_t *ncvars = (ncvar_t *) Malloc((size_t) nvars * sizeof(ncvar_t));
+  init_ncvars(nvars, ncvars, fileID);
+
+  // scan global attributes
+  int instID = CDI_UNDEFID;
+  int modelID = CDI_UNDEFID;
+  bool ucla_les = false;
+  unsigned char uuidOfVGrid[CDI_UUID_SIZE] = { 0 };
+  cdf_scan_global_attr(fileID, vlistID, ngatts, &instID, &modelID, &ucla_les, uuidOfVGrid, &gridInfo);
+
+  // find time dim
+  int timedimid = (unlimdimid >= 0) ? unlimdimid : cdf_time_dimid(fileID, ndims, nvars, ncdims);
+
+  streamptr->basetime.ncdimid = timedimid;
+
+  size_t ntsteps = 0;
+  if (timedimid != CDI_UNDEFID) cdf_inq_dimlen(fileID, ncdims[timedimid].dimid, &ntsteps);
+  if (ntsteps > INT_MAX)
+    {
+      Warning("Size limit exceeded for time dimension (limit=%d)!", INT_MAX);
+      return CDI_EDIMSIZE;
+    }
+
+  if (CDI_Debug) Message("Number of timesteps = %zu", ntsteps);
+  if (CDI_Debug) Message("Time dimid = %d", streamptr->basetime.ncdimid);
+
+  // read ncdims
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      cdf_inq_dimlen(fileID, ncdims[ncdimid].dimid, &ncdims[ncdimid].len);
+      cdf_inq_dimname(fileID, ncdims[ncdimid].dimid, ncdims[ncdimid].name);
+      if (timedimid == ncdimid) ncdims[ncdimid].dimtype = T_AXIS;
+    }
+
+  stream_set_ncdims(streamptr, ndims, ncdims);
+
+  if (CDI_Debug) cdf_print_vars(ncvars, nvars, "cdfScanVarAttr");
+
+  // scan attributes of all variables
+  cdfScanVarAttr(nvars, ncvars, ndims, ncdims, timedimid, modelID, format);
+
+  cdfVerifyVarAttr(nvars, ncvars, ncdims);
+
+  if (CDI_Convert_Cubesphere)
+    {
+      bool isGeosData = check_cube_sphere(vlistID, nvars, ncvars, ncdims);
+      if (CDI_Debug) Message("isGeosData %d", isGeosData);
+    }
+
+  if (CDI_Debug) cdf_print_vars(ncvars, nvars, "find coordinates vars");
+
+  // find coordinates vars
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvar->ndims == 1)
+            {
+              if (timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0])
+                {
+                  if (ncvar->varStatus != CoordVar) cdf_set_var(ncvar, DataVar);
+                }
+              else
+                {
+                  //  if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar);
+                }
+              // if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar);
+
+              if (ncdimid == ncvar->dimids[0] && ncdims[ncdimid].ncvarid == CDI_UNDEFID)
+                if (str_is_equal(ncvar->name, ncdims[ncdimid].name))
+                  {
+                    ncdims[ncdimid].ncvarid = ncvarid;
+                    ncvar->varStatus = CoordVar;
+                  }
+            }
+        }
+    }
+
+  // find time vars
+  find_time_vars(nvars, ncvars, ncdims, timedimid, streamptr, &timeHasUnits, &timeHasBounds, &timeClimatology);
+
+  leadtime_id = find_leadtime(nvars, ncvars, timedimid);
+  if (leadtime_id != CDI_UNDEFID) ncvars[leadtime_id].varStatus = CoordVar;
+
+  // check ncvars
+  timedimid = cdf_check_variables(streamptr, nvars, ncvars, ntsteps, timedimid);
+
+  // verify coordinates vars - first scan (dimname == varname)
+  bool isHybridCF = false;
+  verify_coordinates_vars_1(fileID, ndims, ncdims, ncvars, timedimid, &isHybridCF);
+
+  // verify coordinates vars - second scan (all other variables)
+  verify_coordinates_vars_2(streamptr, nvars, ncvars);
+
+  if (CDI_Debug) cdf_print_vars(ncvars, nvars, "verify_coordinate_vars");
+
+  if (ucla_les) cdf_set_ucla_dimtype(ndims, ncdims, ncvars);
+
+  /*
+  for (int ncdimid = 0; ncdimid < ndims; ncdimid++)
+    {
+      int ncvarid = ncdims[ncdimid].ncvarid;
+      if (ncvarid != -1)
+        {
+          printf("coord var %d %s %s\n", ncvarid, ncvar->name, ncvar->units);
+          if (ncdims[ncdimid].dimtype == X_AXIS) printf("coord var %d %s is x dim\n", ncvarid, ncvar->name);
+          if (ncdims[ncdimid].dimtype == Y_AXIS) printf("coord var %d %s is y dim\n", ncvarid, ncvar->name);
+          if (ncdims[ncdimid].dimtype == Z_AXIS) printf("coord var %d %s is z dim\n", ncvarid, ncvar->name);
+          if (ncdims[ncdimid].dimtype == T_AXIS) printf("coord var %d %s is t dim\n", ncvarid, ncvar->name);
+
+          if (ncvar->isLon) printf("coord var %d %s is lon\n", ncvarid, ncvar->name);
+          if (ncvar->isLat) printf("coord var %d %s is lat\n", ncvarid, ncvar->name);
+          if (ncvar->isZaxis) printf("coord var %d %s is lev\n", ncvarid, ncvar->name);
+        }
+    }
+  */
+
+  // Set coordinates varids (att: associate)
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    {
+      ncvar_t *ncvar = &ncvars[ncvarid];
+      if (ncvar->varStatus == DataVar && ncvar->ncoordvars)
+        {
+          for (int i = 0; i < ncvar->ncoordvars; i++)
+            {
+              int ncvaridc = ncvar->coordvarids[i];
+              if (ncvaridc != CDI_UNDEFID)
+                {
+                  ncvar_t *ncvarc = &ncvars[ncvaridc];
+                  // clang-format off
+                  if      (ncvarc->isLon || ncvarc->isXaxis) ncvar->xvarid = ncvaridc;
+                  else if (ncvarc->isLat || ncvarc->isYaxis) ncvar->yvarid = ncvaridc;
+                  else if (ncvarc->isZaxis)                  ncvar->zvarid = ncvaridc;
+                  else if (ncvarc->isTaxis)                  ncvar->tvarid = ncvaridc;
+                  else if (ncvarc->isCharAxis)               ncvar->cvarids[i] = ncvaridc;
+                  else if (ncvarc->printWarning)
+                    {
+                      Warning("Coordinates variable %s can't be assigned!", ncvarc->name);
+                      ncvarc->printWarning = false;
+                    }
+                  // clang-format on
+                }
+            }
+        }
+    }
+
+  // set dim type
+  cdf_set_dimtype(nvars, ncvars, ncdims);
+
+  // read ECHAM VCT if present
+  size_t vctsize = 0;
+  double *vct = NULL;
+  if (!isHybridCF) read_vct_echam(fileID, nvars, ncvars, ncdims, &vct, &vctsize);
+
+  // process query information if available
+  CdiQuery *query = streamptr->query;
+  if (query && cdiQueryNumNames(query) > 0)
+    {
+      for (int ncvarid = 0; ncvarid < nvars; ++ncvarid)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvar->varStatus == DataVar && cdiQueryName(query, ncvar->name) < 0) ncvar->varStatus = CoordVar;
+        }
+    }
+
+  if (CDI_Debug) cdf_print_vars(ncvars, nvars, "cdf_define_all_grids");
+
+  // define all grids
+  gridInfo.timedimid = timedimid;
+  int status = cdf_define_all_grids(streamptr, streamptr->ncgrid, vlistID, ncdims, nvars, ncvars, &gridInfo);
+  if (status < 0) return status;
+
+  // define all zaxes
+  status = cdf_define_all_zaxes(streamptr, vlistID, ncdims, nvars, ncvars, vctsize, vct, uuidOfVGrid);
+  if (vct) Free(vct);
+  if (status < 0) return status;
+
+  // verify vars
+  cdfVerifyVars(nvars, ncvars  //, ncdims
+  );
+
+  // select vars
+  int nvarsData = 0;
+  for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+    if (ncvars[ncvarid].varStatus == DataVar) nvarsData++;
+
+  if (CDI_Debug) Message("time varid = %d", streamptr->basetime.ncvarid);
+  if (CDI_Debug) Message("ntsteps = %zu", ntsteps);
+  if (CDI_Debug) Message("nvarsData = %d", nvarsData);
+
+  if (nvarsData == 0)
+    {
+      streamptr->ntsteps = 0;
+      Warning("No data arrays found!");
+      return CDI_EUFSTRUCT;
+    }
+
+  if (ntsteps == 0 && streamptr->basetime.ncdimid == CDI_UNDEFID && streamptr->basetime.ncvarid != CDI_UNDEFID) ntsteps = 1;
+
+  // define all data variables
+  cdf_define_all_vars(streamptr, vlistID, instID, modelID, nvarsData, nvars, ncvars, ncdims, timedimid);
+
+  cdf_set_chunk_info(streamptr, nvars, ncvars);
+
+  // time varID
+  int nctimevarid = streamptr->basetime.ncvarid;
+
+  if (nctimevarid != CDI_UNDEFID && (!timeHasUnits || streamptr->basetime.isWRF)) ncvars[nctimevarid].units[0] = 0;
+  if (nctimevarid != CDI_UNDEFID && timeHasUnits) streamptr->basetime.hasUnits = true;
+
+  taxis_t taxis0;
+  ptaxisInit(&taxis0);
+
+  if (timeHasUnits)
+    {
+      if (set_base_time(ncvars[nctimevarid].units, &taxis0) == 1)
+        {
+          nctimevarid = CDI_UNDEFID;
+          streamptr->basetime.ncvarid = CDI_UNDEFID;
+          streamptr->basetime.hasUnits = false;
+        }
+
+      if (leadtime_id != CDI_UNDEFID && taxis0.type == TAXIS_RELATIVE)
+        {
+          streamptr->basetime.leadtimeid = leadtime_id;
+          taxis0.type = TAXIS_FORECAST;
+
+          int timeunit = -1;
+          if (ncvars[leadtime_id].units[0] != 0) timeunit = scan_time_units(ncvars[leadtime_id].units);
+          if (timeunit == -1) timeunit = taxis0.unit;
+          taxis0.fc_unit = timeunit;
+
+          set_forecast_time(fcreftime, &taxis0);
+        }
+    }
+
+  if (timeHasBounds)
+    {
+      taxis0.hasBounds = true;
+      if (timeClimatology) taxis0.climatology = true;
+    }
+
+  if (nctimevarid != CDI_UNDEFID)
+    {
+      ptaxisDefName(&taxis0, ncvars[nctimevarid].name);
+      if (ncvars[nctimevarid].longname[0]) ptaxisDefLongname(&taxis0, ncvars[nctimevarid].longname);
+      if (ncvars[nctimevarid].units[0]) ptaxisDefUnits(&taxis0, ncvars[nctimevarid].units);
+
+      int xtype = ncvars[nctimevarid].xtype;
+      int datatype = (xtype == NC_INT) ? CDI_DATATYPE_INT32 : ((xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64);
+      ptaxisDefDatatype(&taxis0, datatype);
+    }
+
+  int calendar = CDI_UNDEFID;
+  if (nctimevarid != CDI_UNDEFID && ncvars[nctimevarid].hasCalendar)
+    {
+      char attstring[1024];
+      cdfGetAttText(fileID, nctimevarid, "calendar", sizeof(attstring), attstring);
+      str_to_lower(attstring);
+      calendar = attribute_to_calendar(attstring);
+    }
+
+  if (streamptr->basetime.isWRF) taxis0.type = TAXIS_ABSOLUTE;
+
+  int taxisID;
+  if (taxis0.type == TAXIS_FORECAST)
+    {
+      taxisID = taxisCreate(TAXIS_FORECAST);
+    }
+  else if (taxis0.type == TAXIS_RELATIVE)
+    {
+      taxisID = taxisCreate(TAXIS_RELATIVE);
+    }
+  else
+    {
+      taxisID = taxisCreate(TAXIS_ABSOLUTE);
+      if (!timeHasUnits)
+        {
+          taxisDefTunit(taxisID, TUNIT_DAY);
+          taxis0.unit = TUNIT_DAY;
+        }
+    }
+
+  if (calendar == CDI_UNDEFID && taxis0.type != TAXIS_ABSOLUTE) calendar = CALENDAR_STANDARD;
+
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic warning "-Wstrict-overflow"
+#endif
+  if (calendar != CDI_UNDEFID)
+    {
+      taxis0.calendar = calendar;
+      taxisDefCalendar(taxisID, calendar);
+    }
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5)
+#pragma GCC diagnostic pop
+#endif
+
+  vlistDefTaxis(vlistID, taxisID);
+
+  cdf_read_timesteps(ntsteps, streamptr, &taxis0);
+  taxisDestroyKernel(&taxis0);
+
+  // free ncdims
+  if (ncdims) Free(ncdims);
+
+  // free ncvars
+  if (ncvars)
+    {
+      for (int ncvarid = 0; ncvarid < nvars; ncvarid++)
+        {
+          ncvar_t *ncvar = &ncvars[ncvarid];
+          if (ncvar->atts) Free(ncvar->atts);
+          if (ncvar->vct) Free(ncvar->vct);
+        }
+      Free(ncvars);
+    }
+
+  return 0;
+}
+
+int
+cdfInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID < 0 || tsID >= streamptr->ntsteps) Error("tsID=%d out of range (0-%d)!", tsID, streamptr->ntsteps - 1);
+
+  streamptr->curTsID = tsID;
+  int numRecs = streamptr->tsteps[tsID].nrecs;
+
+  return numRecs;
+}
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+
+static const char bndsName[] = "bnds";
+
+void
+cdfCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
+{
+  int vlistID1 = streamptr1->vlistID;
+  int tsID = streamptr1->curTsID;
+  int vrecID = streamptr1->tsteps[tsID].curRecID;
+  int recID = streamptr1->tsteps[tsID].recIDs[vrecID];
+  int ivarID = streamptr1->tsteps[tsID].records[recID].varID;
+  int gridID = vlistInqVarGrid(vlistID1, ivarID);
+  size_t datasize = (size_t) gridInqSize(gridID);
+  int datatype = vlistInqVarDatatype(vlistID1, ivarID);
+  int memtype = (datatype != CDI_DATATYPE_FLT32) ? MEMTYPE_DOUBLE : MEMTYPE_FLOAT;
+
+  void *data = Malloc(datasize * ((memtype == MEMTYPE_DOUBLE) ? sizeof(double) : sizeof(float)));
+
+  size_t numMissVals;
+  cdf_read_record(streamptr1, memtype, data, &numMissVals);
+  cdf_write_record(streamptr2, memtype, data, numMissVals);
+
+  Free(data);
+}
+
+void
+cdfDefRecord(stream_t *streamptr)
+{
+  (void) streamptr;
+}
+
+static void
+cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex)
+{
+  int dimID;
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  for (int index = 0; index < gridIndex; ++index)
+    {
+      if (ncgrid[index].ncIDs[CDF_DIMID_X] != CDI_UNDEFID)
+        {
+          int gridID0 = ncgrid[index].gridID;
+          int gridtype0 = gridInqType(gridID0);
+          if (gridtype0 == GRID_SPECTRAL || gridtype0 == GRID_FOURIER)
+            {
+              dimID = ncgrid[index].ncIDs[CDF_DIMID_X];
+              goto dimIDEstablished;
+            }
+        }
+    }
+
+  {
+    static const char axisname[] = "nc2";
+    size_t dimlen = 2;
+    int fileID = streamptr->fileID;
+
+    bool switchNCMode = (streamptr->ncmode == 2);
+    if (switchNCMode)
+      {
+        streamptr->ncmode = 1;
+        cdf_redef(fileID);
+      }
+
+    cdf_def_dim(fileID, axisname, dimlen, &dimID);
+
+    if (switchNCMode)
+      {
+        cdf_enddef(fileID, streamptr->self);
+        streamptr->ncmode = 2;
+      }
+  }
+
+dimIDEstablished:
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+}
+
+struct idSearch
+{
+  int numNonMatching, foundID;
+  size_t foundIdx;
+};
+
+static inline struct idSearch
+cdfSearchIDBySize(size_t startIdx, size_t numIDs, const ncgrid_t ncgrid[/*numIDs*/], int ncIDType, int searchType,
+                  SizeType searchSize, int (*typeInq)(int id), SizeType (*sizeInq)(int id))
+{
+  int numNonMatching = 0, foundID = CDI_UNDEFID;
+  size_t foundIdx = SIZE_MAX;
+  for (size_t index = startIdx; index < numIDs; index++)
+    {
+      if (ncgrid[index].ncIDs[ncIDType] != CDI_UNDEFID)
+        {
+          int id0 = ncgrid[index].gridID, id0Type = typeInq(id0);
+          if (id0Type == searchType)
+            {
+              SizeType size0 = sizeInq(id0);
+              if (searchSize == size0)
+                {
+                  foundID = ncgrid[index].ncIDs[ncIDType];
+                  foundIdx = index;
+                  break;
+                }
+              numNonMatching++;
+            }
+        }
+    }
+  return (struct idSearch){ .numNonMatching = numNonMatching, .foundID = foundID, .foundIdx = foundIdx };
+}
+
+static SizeType
+cdfGridInqHalfSize(int gridID)
+{
+  return gridInqSize(gridID) / 2;
+}
+
+static void
+cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, size_t maxlen, int gridRefType)
+{
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  SizeType dimlen = gridInqSize(gridID) / 2;
+
+  struct idSearch search
+      = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize);
+  int dimID = search.foundID;
+  int iz = search.numNonMatching;
+
+  if (dimID == CDI_UNDEFID)
+    {
+      int fileID = streamptr->fileID;
+      size_t len = strlen(axisname);
+      if (iz) snprintf(axisname + len, maxlen - len, "%1d", iz + 1);
+
+      bool switchNCMode = (streamptr->ncmode == 2);
+      if (switchNCMode)
+        {
+          streamptr->ncmode = 1;
+          cdf_redef(fileID);
+        }
+
+      cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID);
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = dimID;
+}
+
+static void
+cdfDefSP(stream_t *streamptr, int gridID, int gridIndex)
+{
+  // char longname[] = "Spherical harmonic coefficient";
+  char axisname[5] = "nsp";
+  cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_SPECTRAL);
+}
+
+static void
+cdfDefFC(stream_t *streamptr, int gridID, int gridIndex)
+{
+  char axisname[5] = "nfc";
+  cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_FOURIER);
+}
+
+static const struct cdfDefGridAxisInqs
+{
+  SizeType (*axisSize)(int gridID);
+  double (*axisVal)(int gridID, SizeType index);
+  const double *(*axisValsPtr)(int gridID);
+  const double *(*axisBoundsPtr)(int gridID);
+  enum cdfIDIdx dimIdx, varIdx;
+  char axisSym;
+  enum gridPropInq valsQueryKey, bndsQueryKey;
+  char axisPanoplyName[4];
+} gridInqsX = {
+  .axisSize = gridInqXsize,
+  .axisVal = gridInqXval,
+  .axisValsPtr = gridInqXvalsPtr,
+  .axisBoundsPtr = gridInqXboundsPtr,
+  .dimIdx = CDF_DIMID_X,
+  .varIdx = CDF_VARID_X,
+  .axisSym = 'X',
+  .valsQueryKey = GRID_PROP_XVALS,
+  .bndsQueryKey = GRID_PROP_XBOUNDS,
+  .axisPanoplyName = "Lon",
+}, gridInqsY = {
+  .axisSize = gridInqYsize,
+  .axisVal = gridInqYval,
+  .axisValsPtr = gridInqYvalsPtr,
+  .axisBoundsPtr = gridInqYboundsPtr,
+  .dimIdx = CDF_DIMID_Y,
+  .varIdx = CDF_VARID_Y,
+  .axisSym = 'Y',
+  .valsQueryKey = GRID_PROP_YVALS,
+  .bndsQueryKey = GRID_PROP_YBOUNDS,
+  .axisPanoplyName = "Lat",
+};
+
+static void
+cdfPutGridStdAtts(int fileID, int ncvarid, int gridID, int dimtype)
+{
+  size_t len;
+
+  int axisKey = (dimtype == 'Z') ? CDI_GLOBAL : ((dimtype == 'X') ? CDI_XAXIS : CDI_YAXIS);
+
+  {
+    char stdname[CDI_MAX_NAME];
+    int length = CDI_MAX_NAME;
+    cdiInqKeyString(gridID, axisKey, CDI_KEY_STDNAME, stdname, &length);
+    if (stdname[0] && (len = strlen(stdname))) cdf_put_att_text(fileID, ncvarid, "standard_name", len, stdname);
+  }
+  {
+    char longname[CDI_MAX_NAME];
+    int length = CDI_MAX_NAME;
+    cdiInqKeyString(gridID, axisKey, CDI_KEY_LONGNAME, longname, &length);
+    if (longname[0] && (len = strlen(longname))) cdf_put_att_text(fileID, ncvarid, "long_name", len, longname);
+  }
+  {
+    char units[CDI_MAX_NAME];
+    int length = CDI_MAX_NAME;
+    cdiInqKeyString(gridID, axisKey, CDI_KEY_UNITS, units, &length);
+    if (units[0] && (len = strlen(units))) cdf_put_att_text(fileID, ncvarid, "units", len, units);
+  }
+}
+
+static int
+grid_inq_xtype(int gridID)
+{
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  return (datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE;
+}
+
+static void
+cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cdfDefGridAxisInqs *inqs)
+{
+  nc_type xtype = grid_inq_xtype(gridID);
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  SizeType dimlen = inqs->axisSize(gridID);
+  if (dimlen != 1) Error("%c size isn't 1 for %s grid!", inqs->axisSym, gridNamePtr(gridInqType(gridID)));
+
+  int ncvarid = ncgrid[gridIndex].ncIDs[inqs->dimIdx];
+  if (ncvarid == CDI_UNDEFID)
+    {
+      int dimNcID = streamptr->basetime.ncvarid;
+      int fileID = streamptr->fileID;
+
+      bool switchNCMode = (streamptr->ncmode == 2);
+      if (switchNCMode)
+        {
+          cdf_redef(fileID);
+          streamptr->ncmode = 1;
+        }
+
+      char axisname[CDI_MAX_NAME];
+      int axistype = (inqs->axisSym == 'X') ? CDI_XAXIS : CDI_YAXIS;
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(gridID, axistype, CDI_KEY_NAME, axisname, &length);
+      cdf_def_var(fileID, axisname, xtype, 1, &dimNcID, &ncvarid);
+      cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym);
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  // var ID for trajectory !!!
+  ncgrid[gridIndex].ncIDs[inqs->dimIdx] = ncvarid;
+}
+
+static void
+cdfDefTrajLon(stream_t *streamptr, int gridID, int gridIndex)
+{
+  cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsX);
+}
+
+static void
+cdfDefTrajLat(stream_t *streamptr, int gridID, int gridIndex)
+{
+  cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsY);
+}
+
+static int
+checkDimName(int fileID, size_t dimlen, char *dimname)
+{
+  // check whether the dimenion name is already defined with the same length
+  unsigned iz = 0;
+  int dimid = CDI_UNDEFID;
+  char name[CDI_MAX_NAME];
+
+  size_t len = strlen(dimname);
+  memcpy(name, dimname, len + 1);
+
+  do
+    {
+      if (iz) snprintf(name + len, CDI_MAX_NAME - len, "_%u", iz + 1);
+
+      int dimid0;
+      int status = nc_inq_dimid(fileID, name, &dimid0);
+      if (status != NC_NOERR) break;
+      size_t dimlen0;
+      cdf_inq_dimlen(fileID, dimid0, &dimlen0);
+      if (dimlen0 == dimlen)
+        {
+          dimid = dimid0;
+          break;
+        }
+      iz++;
+    }
+  while (iz <= 99);
+
+  if (iz) snprintf(dimname + len, CDI_MAX_NAME - len, "_%u", iz + 1);
+
+  return dimid;
+}
+
+static void
+checkGridName(char *axisname, int fileID)
+{
+  int ncdimid;
+  char axisname2[CDI_MAX_NAME];
+
+  // check that the name is not already defined
+  unsigned iz = 0;
+
+  size_t axisnameLen = strlen(axisname);
+  memcpy(axisname2, axisname, axisnameLen + 1);
+
+  do
+    {
+      if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1);
+
+      if (nc_inq_varid(fileID, axisname2, &ncdimid) != NC_NOERR) break;
+
+      ++iz;
+    }
+  while (iz <= 99);
+
+  if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1);
+}
+
+static int
+checkZaxisName(char *axisname, int fileID, int vlistID, int zaxisID, int nzaxis)
+{
+  char axisname2[CDI_MAX_NAME];
+
+  // check that the name is not already defined
+  unsigned iz = 0;
+
+  size_t axisnameLen = strlen(axisname);
+  memcpy(axisname2, axisname, axisnameLen + 1);
+  do
+    {
+      if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1);
+
+      int ncdimid;
+      int status = nc_inq_varid(fileID, axisname2, &ncdimid);
+      if (status != NC_NOERR)
+        {
+          if (iz)
+            {
+              // check that the name does not exist for other zaxes
+              for (int index = 0; index < nzaxis; index++)
+                {
+                  int zaxisID0 = vlistZaxis(vlistID, index);
+                  if (zaxisID != zaxisID0)
+                    {
+                      const char *axisname0 = zaxisInqNamePtr(zaxisID0);
+                      if (str_is_equal(axisname0, axisname2)) goto nextSuffix;
+                    }
+                }
+            }
+          break;
+        }
+
+    nextSuffix:
+      ++iz;
+    }
+  while (iz <= 99);
+
+  if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1);
+
+  return (int) iz;
+}
+
+struct cdfPostDefPutVar
+{
+  int fileID, ncvarid;
+  union
+  {
+    const void *array;
+    int int1;
+  } values;
+};
+
+static void
+cdfDelayedPutVarDouble(void *data)
+{
+  struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data;
+  cdf_put_var_double(put->fileID, put->ncvarid, (const double *) put->values.array);
+}
+
+static void
+cdfDelayedPutVarInt1(void *data)
+{
+  struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data;
+  cdf_put_var_int(put->fileID, put->ncvarid, &put->values.int1);
+}
+
+void
+cdfDelayedPutVarDeepCleanup(void *data)
+{
+  struct cdfPostDefPutVar *what = (struct cdfPostDefPutVar *) data;
+  Free((void *) what->values.array);
+  Free(what);
+}
+
+static void
+cdfPostDefActionApply(size_t numActions, struct cdfPostDefAction *actions)
+{
+  for (size_t i = 0; i < numActions; ++i) actions[i].action(actions[i].data);
+}
+
+static void
+cdfPostDefActionListDelete(struct cdfPostDefActionList *list)
+{
+  struct cdfPostDefAction *actions = list->actions;
+  for (size_t i = 0, len = list->len; i < len; ++i)
+    {
+      void (*cleanup)(void *) = actions[i].cleanup;
+      void *data = actions[i].data;
+      if (cleanup == (void (*)(void *))(void (*)(void)) memFree)
+        Free(data);
+      else
+        cleanup(data);
+    }
+  Free(list);
+}
+
+struct cdfPostDefActionList *
+cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum)
+{
+  size_t appendPos = list ? list->len : 0;
+  if (!list || list->size == list->len)
+    {
+      enum
+      {
+        initialListSize = 1
+      };
+      size_t newSize = list ? (list->size * 2) : initialListSize, newLen = list ? list->len + 1 : 1,
+             newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction);
+      list = (struct cdfPostDefActionList *) Realloc(list, newAllocSize);
+      list->size = newSize;
+      list->len = newLen;
+    }
+  else
+    ++(list->len);
+  list->actions[appendPos] = addendum;
+  return list;
+}
+
+static struct cdfPostDefActionList *
+cdfPostDefActionConcat(struct cdfPostDefActionList *listA, const struct cdfPostDefActionList *listB)
+{
+  size_t appendPos = listA ? listA->len : 0, appendLen = listB ? listB->len : 0;
+  if (appendLen)
+    {
+      size_t newLen = appendPos + appendLen;
+      if (!listA || listA->size < newLen)
+        {
+          enum
+          {
+            initialListSize = 1
+          };
+          size_t newSize = listA ? listA->size : initialListSize;
+          while (newSize < newLen) newSize *= 2;
+          size_t newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction);
+          listA = (struct cdfPostDefActionList *) Realloc(listA, newAllocSize);
+          listA->size = newSize;
+          listA->len = newLen;
+        }
+      else
+        listA->len = newLen;
+      struct cdfPostDefAction *restrict actionsA = listA->actions;
+      const struct cdfPostDefAction *restrict actionsB = listB->actions;
+      for (size_t i = 0; i < appendLen; ++i) actionsA[appendPos + i] = actionsB[i];
+    }
+  return listA;
+}
+
+void
+cdfPostDefActionAddPutVal(struct cdfPostDefActionList **list_, int fileID, int ncvarid, const double *values,
+                          void (*cleanup)(void *))
+{
+  struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals));
+  delayedPutVals->values.array = values;
+  delayedPutVals->fileID = fileID;
+  delayedPutVals->ncvarid = ncvarid;
+  *list_ = cdfPostDefActionAdd(
+      *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarDouble, .cleanup = cleanup });
+}
+
+static inline void
+cdfPostDefActionAddPut1Int(struct cdfPostDefActionList **list_, int fileID, int ncvarid, int iVal, void (*cleanup)(void *))
+{
+  struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals));
+  delayedPutVals->values.int1 = iVal;
+  delayedPutVals->fileID = fileID;
+  delayedPutVals->ncvarid = ncvarid;
+  *list_ = cdfPostDefActionAdd(
+      *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarInt1, .cleanup = cleanup });
+}
+
+static void
+cdfGridCompress(int fileID, int ncvarid, size_t gridsize, int filetype, int comptype, size_t *chunks)
+{
+#ifdef HAVE_NETCDF4
+  if (gridsize >= 32 && comptype == CDI_COMPRESS_ZIP
+      && (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR))
+    {
+      cdf_def_var_chunking(fileID, ncvarid, NC_CHUNKED, chunks);
+      int shuffle = 1, compLevel = 1;
+      cdfDefVarDeflate(fileID, ncvarid, shuffle, compLevel);
+    }
+#endif
+}
+
+static struct cdfPostDefActionList *
+cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid,
+                 const struct cdfDefGridAxisInqs *gridAxisInq, int axisKey, char axisLetter,
+                 void (*finishCyclicBounds)(double *pbounds, SizeType dimlen, const double *pvals))
+{
+  int dimID = CDI_UNDEFID;
+  SizeType dimlen = gridAxisInq->axisSize(gridID);
+  nc_type xtype = grid_inq_xtype(gridID);
+
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  bool hasVals = gridInqPropPresence(gridID, gridAxisInq->valsQueryKey);
+  char dimname[CDI_MAX_NAME + 3];
+  dimname[0] = 0;
+  int length = sizeof(dimname);
+  if (ndims && !hasVals) cdiInqKeyString(gridID, axisKey, CDI_KEY_DIMNAME, dimname, &length);
+
+  for (int index = 0; index < gridIndex; ++index)
+    {
+      int gridID0 = ncgrid[index].gridID;
+      assert(gridID0 != CDI_UNDEFID);
+      int gridtype0 = gridInqType(gridID0);
+      if (gridtype0 == GRID_GAUSSIAN || gridtype0 == GRID_LONLAT || gridtype0 == GRID_PROJECTION || gridtype0 == GRID_GENERIC)
+        {
+          SizeType dimlen0 = gridAxisInq->axisSize(gridID0);
+          char dimname0[CDI_MAX_NAME];
+          dimname0[0] = 0;
+          length = sizeof(dimname0);
+          if (dimname[0]) cdiInqKeyString(gridID0, axisKey, CDI_KEY_DIMNAME, dimname0, &length);
+          bool lname = dimname0[0] ? str_is_equal(dimname, dimname0) : true;
+          if (dimlen == dimlen0 && lname)
+            {
+              double (*inqVal)(int gridID, SizeType index) = gridAxisInq->axisVal;
+              if (IS_EQUAL(inqVal(gridID0, 0), inqVal(gridID, 0))
+                  && IS_EQUAL(inqVal(gridID0, dimlen - 1), inqVal(gridID, dimlen - 1)))
+                {
+                  dimID = ncgrid[index].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y];
+                  break;
+                }
+            }
+        }
+    }
+
+  struct cdfPostDefActionList *delayed = NULL;
+  if (dimID == CDI_UNDEFID)
+    {
+      int ncvarid = CDI_UNDEFID;
+      char axisname[CDI_MAX_NAME];
+      length = CDI_MAX_NAME;
+      cdiInqKeyString(gridID, axisKey, CDI_KEY_NAME, axisname, &length);
+      int fileID = streamptr->fileID;
+      if (axisname[0] == 0) Error("axis name undefined!");
+
+      checkGridName(axisname, fileID);
+      size_t axisnameLen = strlen(axisname);
+
+      bool switchNCMode = (streamptr->ncmode == 2 && (hasVals || ndims));
+      if (switchNCMode)
+        {
+          cdf_redef(fileID);
+          streamptr->ncmode = 1;
+        }
+
+      if (ndims)
+        {
+          if (dimname[0] == 0) strcpy(dimname, axisname);
+          dimID = checkDimName(fileID, (size_t) dimlen, dimname);
+
+          if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID);
+        }
+
+      if (hasVals)
+        {
+          cdf_def_var(fileID, axisname, xtype, ndims, &dimID, &ncvarid);
+
+          int chunkSize = 0;
+          int chunkType = CDI_CHUNK_GRID;
+          cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType);
+          cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize);
+          if (chunkSize > 0) chunkType = CDI_CHUNK_AUTO;
+
+          if (chunkType == CDI_CHUNK_GRID && dimlen > ChunkSizeLim) chunkType = CDI_CHUNK_LINES;
+
+          size_t chunk = calc_chunksize_x(chunkType, chunkSize, (size_t) dimlen, true);
+          cdfGridCompress(fileID, ncvarid, (size_t) dimlen, streamptr->filetype, streamptr->comptype, &chunk);
+
+          cdfPutGridStdAtts(fileID, ncvarid, gridID, axisLetter);
+          {
+            char axisStr[2] = { axisLetter, '\0' };
+            cdf_put_att_text(fileID, ncvarid, "axis", 1, axisStr);
+          }
+          cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp
+              = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func;
+          mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, gridAxisInq->valsQueryKey, &delayed);
+
+          bool genBounds = false, hasBounds = gridInqPropPresence(gridID, gridAxisInq->bndsQueryKey);
+          bool grid_is_cyclic = (gridIsCircular(gridID) > 0);
+          double *restrict pbounds;
+          size_t nvertex = (size_t) gridInqNvertex(gridID);
+          if (CDI_CMOR_Mode && grid_is_cyclic && !hasBounds)
+            {
+              const double *pvals = gridAxisInq->axisValsPtr(gridID);
+              genBounds = true;
+              nvertex = 2;
+              pbounds = (double *) Malloc(2 * (size_t) dimlen * sizeof(double));
+              for (size_t i = 0; i < (size_t) dimlen - 1; ++i)
+                {
+                  pbounds[i * 2 + 1] = (pvals[i] + pvals[i + 1]) * 0.5;
+                  pbounds[i * 2 + 2] = (pvals[i] + pvals[i + 1]) * 0.5;
+                }
+              finishCyclicBounds(pbounds, dimlen, pvals);
+            }
+          else
+            pbounds = (double *) gridAxisInq->axisBoundsPtr(gridID);
+
+          int nvdimID = CDI_UNDEFID;
+          if (pbounds)
+            {
+              if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID);
+            }
+          if ((hasBounds || genBounds) && nvdimID != CDI_UNDEFID)
+            {
+              char boundsname[CDI_MAX_NAME];
+              memcpy(boundsname, axisname, axisnameLen);
+              boundsname[axisnameLen] = '_';
+              memcpy(boundsname + axisnameLen + 1, bndsName, sizeof(bndsName));
+              int dimIDs[2] = { dimID, nvdimID };
+              int ncbvarid;
+              cdf_def_var(fileID, boundsname, xtype, 2, dimIDs, &ncbvarid);
+              cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), boundsname);
+              cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, pbounds,
+                                        genBounds ? cdfDelayedPutVarDeepCleanup : (void (*)(void *))(void (*)(void)) memFree);
+            }
+        }
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+
+      if (ndims == 0 || addVarToGrid) ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid;
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
+
+  return delayed;
+}
+
+static void
+finishCyclicXBounds(double *pbounds, SizeType dimlen, const double *pvals)
+{
+  pbounds[0] = (pvals[0] + pvals[dimlen - 1] - 360) * 0.5;
+  pbounds[2 * dimlen - 1] = (pvals[dimlen - 1] + pvals[0] + 360) * 0.5;
+}
+
+static void
+finishCyclicYBounds(double *pbounds, SizeType dimlen, const double *pvals)
+{
+  pbounds[0] = copysign(90.0, pvals[0]);
+  pbounds[2 * dimlen - 1] = copysign(90.0, pvals[dimlen - 1]);
+}
+
+static struct cdfPostDefActionList *
+cdfDefXaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid)
+{
+  return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsX, CDI_XAXIS, 'X', finishCyclicXBounds);
+}
+
+static struct cdfPostDefActionList *
+cdfDefYaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid)
+{
+  return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsY, CDI_YAXIS, 'Y', finishCyclicYBounds);
+}
+
+static void
+cdfDefGridReference(stream_t *streamptr, int gridID)
+{
+  int fileID = streamptr->fileID;
+
+  int number = 0;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number);
+  if (number > 0) cdf_put_att_int(fileID, NC_GLOBAL, "number_of_grid_used", NC_INT, 1, &number);
+
+  grid_t *gridptr = grid_to_pointer(gridID);
+  const char *gridfile = cdiInqVarKeyStringPtr(&gridptr->keys, CDI_KEY_REFERENCEURI);
+  if (gridfile && gridfile[0] != 0) cdf_put_att_text(fileID, NC_GLOBAL, "grid_file_uri", strlen(gridfile), gridfile);
+}
+
+static void
+cdfDefGridUUID(stream_t *streamptr, int gridID)
+{
+  unsigned char uuid[CDI_UUID_SIZE] = { 0 };
+  int length = CDI_UUID_SIZE;
+  cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+  if (!cdiUUIDIsNull(uuid))
+    {
+      char uuidStr[uuidNumHexChars + 1] = { 0 };
+      if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars)
+        {
+          int fileID = streamptr->fileID;
+          // if (streamptr->ncmode == 2) cdf_redef(fileID);
+          cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfHGrid", uuidNumHexChars, uuidStr);
+          // if (streamptr->ncmode == 2  cdf_enddef(fileID, streamptr->self);
+        }
+    }
+}
+
+void
+cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp,
+                         struct cdfPostDefActionList **delayed)
+{
+  const void *valsPtr = NULL;
+  switch (gridProp)
+    {
+    case GRID_PROP_MASK:
+    case GRID_PROP_MASK_GME: Error("unsupported key: %d", (int) gridProp); break;
+    case GRID_PROP_XVALS: valsPtr = gridInqXvalsPtr(gridID); break;
+    case GRID_PROP_YVALS: valsPtr = gridInqYvalsPtr(gridID); break;
+    case GRID_PROP_AREA: valsPtr = gridInqAreaPtr(gridID); break;
+    case GRID_PROP_XBOUNDS: valsPtr = gridInqXboundsPtr(gridID); break;
+    case GRID_PROP_YBOUNDS: valsPtr = gridInqYboundsPtr(gridID); break;
+    }
+  cdfPostDefActionAddPutVal(delayed, streamptr->fileID, ncvarid, (const double *) valsPtr,
+                            (void (*)(void *))(void (*)(void)) memFree);
+}
+
+static int
+cdfDefIrregularGridAxisSetup(stream_t *streamptr, int gridID, nc_type xtype, int varID, size_t dimlens, int ndims, int dimIDs[],
+                             size_t *chunks, const struct cdfDefGridAxisInqs *inqs, struct cdfPostDefActionList **delayed)
+{
+  int ncvarid = CDI_UNDEFID;
+  int fileID = streamptr->fileID;
+  if (gridInqPropPresence(gridID, inqs->valsQueryKey))
+    {
+      char axisname[CDI_MAX_NAME];
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(gridID, varID, CDI_KEY_NAME, axisname, &length);
+      checkGridName(axisname, fileID);
+      cdf_def_var(fileID, axisname, xtype, ndims - 1, dimIDs, &ncvarid);
+      cdfGridCompress(fileID, ncvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks);
+
+      cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym);
+      cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp
+          = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func;
+      mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, inqs->valsQueryKey, delayed);
+
+      // attribute for Panoply
+      if (!CDI_CMOR_Mode && ndims == 3) cdf_put_att_text(fileID, ncvarid, "_CoordinateAxisType", 3, inqs->axisPanoplyName);
+
+      if (gridInqPropPresence(gridID, inqs->bndsQueryKey) && dimIDs[ndims - 1] != CDI_UNDEFID)
+        {
+          size_t axisnameLen = strlen(axisname);
+          axisname[axisnameLen] = '_';
+          memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName));
+          int ncbvarid;
+          cdf_def_var(fileID, axisname, xtype, ndims, dimIDs, &ncbvarid);
+          cdfGridCompress(fileID, ncbvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks);
+
+          cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname);
+          mycdfPostDefActionGridProp(streamptr, gridID, ncbvarid, inqs->bndsQueryKey, delayed);
+        }
+    }
+  return ncvarid;
+}
+
+struct cdfDefIrregularGridCommonIDs
+{
+  int xdimID, ydimID, ncxvarid, ncyvarid, ncavarid;
+  struct cdfPostDefActionList *delayed;
+};
+
+static struct cdfDefIrregularGridCommonIDs
+cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t ysize, int ndims, const char *xdimname_default,
+                          size_t nvertex, const char *vdimname_default, bool setVdimname)
+{
+  nc_type xtype = grid_inq_xtype(gridID);
+  int xdimID = CDI_UNDEFID;
+  int ydimID = CDI_UNDEFID;
+  int fileID = streamptr->fileID;
+
+  bool switchNCMode = (streamptr->ncmode == 2);
+  if (switchNCMode)
+    {
+      cdf_redef(fileID);
+      streamptr->ncmode = 1;
+    }
+
+  {
+    char xdimname[CDI_MAX_NAME + 3];
+    int length = sizeof(xdimname);
+    cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, xdimname, &length);
+    if (xdimname[0] == 0) strcpy(xdimname, xdimname_default);
+    xdimID = checkDimName(fileID, xsize, xdimname);
+    if (xdimID == CDI_UNDEFID) cdf_def_dim(fileID, xdimname, xsize, &xdimID);
+  }
+
+  if (ndims == 3)
+    {
+      char ydimname[CDI_MAX_NAME + 3];
+      int length = sizeof(ydimname);
+      cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ydimname, &length);
+      if (ydimname[0] == 0)
+        {
+          ydimname[0] = 'y';
+          ydimname[1] = 0;
+        }
+      ydimID = checkDimName(fileID, ysize, ydimname);
+      if (ydimID == CDI_UNDEFID) cdf_def_dim(fileID, ydimname, ysize, &ydimID);
+    }
+
+  int nvdimID = CDI_UNDEFID;
+  int dimIDs[3];
+  dimIDs[ndims - 1] = CDI_UNDEFID;
+  if (setVdimname)
+    {
+      char vdimname[CDI_MAX_NAME + 3];
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, vdimname, &length);
+      if (vdimname[0] == 0) strcpy(vdimname, vdimname_default);
+      nvdimID = dimIDs[ndims - 1] = checkDimName(fileID, nvertex, vdimname);
+      if (nvdimID == CDI_UNDEFID) cdf_def_dim(fileID, vdimname, nvertex, dimIDs + ndims - 1);
+    }
+
+  size_t gridsize = xsize * ysize;
+  size_t chunks[3] = { 1, 1, 1 };
+  int chunkSize = 0;
+  int chunkType = CDI_CHUNK_GRID;
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType);
+  cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize);
+  if (chunkSize > 0 && ydimID == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO;
+
+  if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim) chunkType = CDI_CHUNK_LINES;
+
+  if (ndims == 3)
+    {
+      chunks[0] = calc_chunksize_y(chunkType, gridsize, xsize, ysize);
+      chunks[1] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID));
+      dimIDs[0] = ydimID;
+      dimIDs[1] = xdimID;
+    }
+  else  // ndims == 2
+    {
+      chunks[0] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID));
+      dimIDs[0] = xdimID;
+      cdfDefGridReference(streamptr, gridID);
+      cdfDefGridUUID(streamptr, gridID);
+    }
+
+  struct cdfPostDefActionList *delayed = NULL;
+  int ncxvarid
+      = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_XAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsX, &delayed);
+  int ncyvarid
+      = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_YAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsY, &delayed);
+
+  int ncavarid = CDI_UNDEFID;
+  if (gridInqPropPresence(gridID, GRID_PROP_AREA))
+    {
+      static const char yaxisname_[] = "cell_area";
+      static const char units[] = "m2";
+      static const char longname[] = "area of grid cell";
+      static const char stdname[] = "cell_area";
+
+      cdf_def_var(fileID, yaxisname_, xtype, ndims - 1, dimIDs, &ncavarid);
+
+      cdf_put_att_text(fileID, ncavarid, "standard_name", sizeof(stdname) - 1, stdname);
+      cdf_put_att_text(fileID, ncavarid, "long_name", sizeof(longname) - 1, longname);
+      cdf_put_att_text(fileID, ncavarid, "units", sizeof(units) - 1, units);
+      cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp
+          = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func;
+      mycdfPostDefActionGridProp(streamptr, gridID, ncavarid, GRID_PROP_AREA, &delayed);
+    }
+
+  if (switchNCMode)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  return (struct cdfDefIrregularGridCommonIDs){
+    .xdimID = xdimID, .ydimID = ydimID, .ncxvarid = ncxvarid, .ncyvarid = ncyvarid, .ncavarid = ncavarid, .delayed = delayed
+  };
+}
+
+static struct cdfPostDefActionList *
+cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex)
+{
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  SizeType dimlen = gridInqSize(gridID);
+  SizeType xdimlen = gridInqXsize(gridID);
+  SizeType ydimlen = gridInqYsize(gridID);
+
+  int xdimID = CDI_UNDEFID, ydimID = CDI_UNDEFID;
+  int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID;
+
+  size_t ofs = 0;
+  do
+    {
+      struct idSearch search
+          = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize);
+      size_t index = search.foundIdx;
+      if (index != SIZE_MAX)
+        {
+          int gridID0 = ncgrid[index].gridID;
+          if (IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0))
+              && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1))
+              && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0))
+              && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1)))
+            {
+              xdimID = ncgrid[index].ncIDs[CDF_DIMID_X];
+              ydimID = ncgrid[index].ncIDs[CDF_DIMID_Y];
+              ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X];
+              ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y];
+              break;
+            }
+          ofs = search.foundIdx;
+          if (ofs < (size_t) gridIndex) continue;
+        }
+    }
+  while (false);
+
+  struct cdfPostDefActionList *delayed = NULL;
+  if (xdimID == CDI_UNDEFID || ydimID == CDI_UNDEFID)
+    {
+      struct cdfDefIrregularGridCommonIDs createdIDs = cdfDefIrregularGridCommon(
+          streamptr, gridID, (size_t) xdimlen, (size_t) ydimlen, 3, "x", 4, "nv4",
+          gridInqPropPresence(gridID, GRID_PROP_XBOUNDS) || gridInqPropPresence(gridID, GRID_PROP_YBOUNDS));
+      xdimID = createdIDs.xdimID;
+      ydimID = createdIDs.ydimID;
+      ncxvarid = createdIDs.ncxvarid;
+      ncyvarid = createdIDs.ncyvarid;
+      ncavarid = createdIDs.ncavarid;
+      delayed = createdIDs.delayed;
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = xdimID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_Y] = ydimID;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid;
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex)
+{
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  SizeType dimlen = gridInqSize(gridID);
+
+  int dimID = CDI_UNDEFID;
+  int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID;
+
+  size_t ofs = 0;
+  do
+    {
+      struct idSearch search
+          = cdfSearchIDBySize(ofs, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, gridInqType, gridInqSize);
+      size_t index = search.foundIdx;
+      if (index != SIZE_MAX)
+        {
+          int gridID0 = ncgrid[index].gridID;
+          if (gridInqNvertex(gridID0) == gridInqNvertex(gridID) && IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0))
+              && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1))
+              && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0))
+              && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1)))
+            {
+              dimID = ncgrid[index].ncIDs[CDF_DIMID_X];
+              ncxvarid = ncgrid[index].ncIDs[CDF_VARID_X];
+              ncyvarid = ncgrid[index].ncIDs[CDF_VARID_Y];
+              ncavarid = ncgrid[index].ncIDs[CDF_VARID_A];
+              break;
+            }
+          ofs = search.foundIdx;
+          if (ofs < (size_t) gridIndex) continue;
+        }
+    }
+  while (false);
+
+  struct cdfPostDefActionList *delayed = NULL;
+  if (dimID == CDI_UNDEFID)
+    {
+      size_t nvertex = (size_t) gridInqNvertex(gridID);
+      struct cdfDefIrregularGridCommonIDs createdIDs
+          = cdfDefIrregularGridCommon(streamptr, gridID, (size_t) dimlen, 1, 2, "ncells", nvertex, "vertices", nvertex > 0);
+      dimID = createdIDs.xdimID;
+      ncxvarid = createdIDs.ncxvarid;
+      ncyvarid = createdIDs.ncyvarid;
+      ncavarid = createdIDs.ncavarid;
+      delayed = createdIDs.delayed;
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_X] = ncxvarid;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_Y] = ncyvarid;
+  ncgrid[gridIndex].ncIDs[CDF_VARID_A] = ncavarid;
+  return delayed;
+}
+
+struct attTxtTab
+{
+  const char *txt;
+  size_t txtLen;
+};
+
+struct attTxtTab2
+{
+  const char *attName, *attVal;
+  size_t valLen;
+};
+
+static struct cdfPostDefActionList *
+cdf_def_vct_echam(stream_t *streamptr, int zaxisID)
+{
+  int type = zaxisInqType(zaxisID);
+
+  int ilev;
+  struct cdfPostDefActionList *delayed = NULL;
+  if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0)
+    {
+      int mlev = ilev - 1;
+
+      if (streamptr->vct.ilev > 0)
+        {
+          if (streamptr->vct.ilev != ilev) Error("More than one VCT for each file unsupported!");
+          return delayed;
+        }
+
+      int fileID = streamptr->fileID;
+
+      bool switchNCMode = (streamptr->ncmode == 2);
+      if (switchNCMode)
+        {
+          streamptr->ncmode = 1;
+          cdf_redef(fileID);
+        }
+
+      int ncdimid = -1, ncdimid2 = -1;
+      int hyaiid, hybiid, hyamid = -1, hybmid = -1;
+
+      cdf_def_dim(fileID, "nhyi", (size_t) ilev, &ncdimid2);
+      cdf_def_var(fileID, "hyai", NC_DOUBLE, 1, &ncdimid2, &hyaiid);
+      cdf_def_var(fileID, "hybi", NC_DOUBLE, 1, &ncdimid2, &hybiid);
+      if (mlev > 0)
+        {
+          cdf_def_dim(fileID, "nhym", (size_t) mlev, &ncdimid);
+          cdf_def_var(fileID, "hyam", NC_DOUBLE, 1, &ncdimid, &hyamid);
+          cdf_def_var(fileID, "hybm", NC_DOUBLE, 1, &ncdimid, &hybmid);
+        }
+
+      streamptr->vct.ilev = ilev;
+      streamptr->vct.mlev = mlev;
+      streamptr->vct.mlevID = ncdimid;
+      streamptr->vct.ilevID = ncdimid2;
+
+      {
+        static const char lname_n[] = "long_name", units_n[] = "units", lname_v_ai[] = "hybrid A coefficient at layer interfaces",
+                          units_v_ai[] = "Pa", lname_v_bi[] = "hybrid B coefficient at layer interfaces", units_v_bi[] = "1";
+        static const struct attTxtTab2 tab[] = {
+          { lname_n, lname_v_ai, sizeof(lname_v_ai) - 1 },
+          { units_n, units_v_ai, sizeof(units_v_ai) - 1 },
+          { lname_n, lname_v_bi, sizeof(lname_v_bi) - 1 },
+          { units_n, units_v_bi, sizeof(units_v_bi) - 1 },
+        };
+        enum
+        {
+          tabLen = sizeof(tab) / sizeof(tab[0])
+        };
+        int ids[tabLen] = { hyaiid, hyaiid, hybiid, hybiid };
+        for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal);
+      }
+
+      {
+        static const char lname_n[] = "long_name", units_n[] = "units", lname_v_am[] = "hybrid A coefficient at layer midpoints",
+                          units_v_am[] = "Pa", lname_v_bm[] = "hybrid B coefficient at layer midpoints", units_v_bm[] = "1";
+        static const struct attTxtTab2 tab[] = {
+          { lname_n, lname_v_am, sizeof(lname_v_am) - 1 },
+          { units_n, units_v_am, sizeof(units_v_am) - 1 },
+          { lname_n, lname_v_bm, sizeof(lname_v_bm) - 1 },
+          { units_n, units_v_bm, sizeof(units_v_bm) - 1 },
+        };
+        enum
+        {
+          tabLen = sizeof(tab) / sizeof(tab[0])
+        };
+        int ids[tabLen] = { hyamid, hyamid, hybmid, hybmid };
+        for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal);
+      }
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+
+      const double *vctptr = zaxisInqVctPtr(zaxisID);
+
+      cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, vctptr, (void (*)(void *))(void (*)(void)) memFree);
+      cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, vctptr + ilev, (void (*)(void *))(void (*)(void)) memFree);
+      {
+        double *restrict amidVal = (double *) Malloc((size_t) mlev * sizeof(*amidVal));
+        for (size_t i = 0; i < (size_t) mlev; ++i) amidVal[i] = (vctptr[i] + vctptr[i + 1]) * 0.5;
+        cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, amidVal, cdfDelayedPutVarDeepCleanup);
+      }
+      {
+        double *restrict bmidVal = (double *) Malloc((size_t) mlev * sizeof(*bmidVal));
+        for (size_t i = 0; i < (size_t) mlev; ++i) bmidVal[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5;
+        cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, bmidVal, cdfDelayedPutVarDeepCleanup);
+      }
+    }
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int p0status, double p0value)
+{
+  int type = zaxisInqType(zaxisID);
+
+  struct cdfPostDefActionList *delayed = NULL;
+  int ilev;
+  if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0)
+    {
+      int mlev = ilev - 1;
+
+      if (streamptr->vct.ilev > 0)
+        {
+          if (streamptr->vct.ilev != ilev) Error("more than one VCT for each file unsupported!");
+          return delayed;
+        }
+
+      int fileID = streamptr->fileID;
+
+      bool switchNCMode = (streamptr->ncmode == 2);
+      if (switchNCMode)
+        {
+          cdf_redef(fileID);
+          streamptr->ncmode = 1;
+        }
+
+      int dimIDs[2] = { nclevID, ncbndsID };
+
+      streamptr->vct.mlev = mlev;
+      streamptr->vct.ilev = ilev;
+      streamptr->vct.mlevID = nclevID;
+      streamptr->vct.ilevID = nclevID;
+
+      int hyamid, hybmid;
+      cdf_def_var(fileID, (p0status == 0) ? "a" : "ap", NC_DOUBLE, 1, dimIDs, &hyamid);
+      cdf_def_var(fileID, "b", NC_DOUBLE, 1, dimIDs, &hybmid);
+
+      {
+        static const char anametab[][10] = { "long_name", "units" };
+        static const char lname_v_a[] = "vertical coordinate formula term: ap(k)",
+                          lname_v_b[] = "vertical coordinate formula term: b(k)", units_v_a[] = "Pa", units_v_b[] = "1";
+        static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } },
+                                                 { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } };
+        int termid[] = { hyamid, hybmid };
+        enum
+        {
+          numTerms = sizeof(termid) / sizeof(termid[0]),
+          numAtts = sizeof(anametab) / sizeof(anametab[0]),
+        };
+        for (size_t termIdx = 0; termIdx < numTerms; ++termIdx)
+          for (size_t attIdx = 0; attIdx < numAtts; ++attIdx)
+            cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen,
+                             attvtab[termIdx][attIdx].txt);
+      }
+      double *restrict vctptr = (double *) zaxisInqVctPtr(zaxisID);
+      if (p0status == 0 && IS_NOT_EQUAL(p0value, 0))
+        {
+          double *restrict temp = (double *) Malloc((size_t) 2 * ilev * sizeof(*temp));
+          memcpy(temp, vctptr, (size_t) 2 * ilev * sizeof(*temp));
+          for (size_t i = 0; i < (size_t) ilev; ++i) temp[i] /= p0value;
+          vctptr = temp;
+        }
+
+      {
+        double *restrict mlevValA = (double *) Malloc((size_t) mlev * sizeof(*mlevValA));
+        for (size_t i = 0; i < (size_t) mlev; ++i) mlevValA[i] = (vctptr[i] + vctptr[i + 1]) * 0.5;
+        cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, mlevValA, cdfDelayedPutVarDeepCleanup);
+      }
+      {
+        double *restrict mlevValB = (double *) Malloc((size_t) mlev * sizeof(*mlevValB));
+        for (size_t i = 0; i < (size_t) mlev; ++i) mlevValB[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5;
+        cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, mlevValB, cdfDelayedPutVarDeepCleanup);
+      }
+
+      if (ncbndsID != -1)
+        {
+          int hyaiid, hybiid;
+          cdf_def_var(fileID, (p0status == 0) ? "a_bnds" : "ap_bnds", NC_DOUBLE, 2, dimIDs, &hyaiid);
+          cdf_def_var(fileID, "b_bnds", NC_DOUBLE, 2, dimIDs, &hybiid);
+          static const char anametab[][10] = { "long_name", "units" };
+          static const char lname_v_a[] = "vertical coordinate formula term: ap(k+1/2)",
+                            lname_v_b[] = "vertical coordinate formula term: b(k+1/2)", units_v_a[] = "Pa", units_v_b[] = "1";
+          static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } },
+                                                   { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } };
+          int termid[] = { hyaiid, hybiid };
+          enum
+          {
+            numTerms = sizeof(termid) / sizeof(termid[0]),
+            numAtts = sizeof(anametab) / sizeof(anametab[0]),
+          };
+          for (size_t termIdx = 0; termIdx < numTerms; ++termIdx)
+            for (size_t attIdx = 0; attIdx < numAtts; ++attIdx)
+              cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen,
+                               attvtab[termIdx][attIdx].txt);
+
+          {
+            double *restrict ilevValA = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValA));
+            for (size_t i = 0; i < (size_t) mlev; ++i)
+              {
+                ilevValA[2 * i] = vctptr[i];
+                ilevValA[2 * i + 1] = vctptr[i + 1];
+              }
+            cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, ilevValA, cdfDelayedPutVarDeepCleanup);
+          }
+          {
+            double *restrict ilevValB = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValB));
+            for (size_t i = 0; i < (size_t) mlev; ++i)
+              {
+                ilevValB[2 * i] = vctptr[(size_t) ilev + i];
+                ilevValB[2 * i + 1] = vctptr[(size_t) ilev + i + 1];
+              }
+            cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, ilevValB, cdfDelayedPutVarDeepCleanup);
+          }
+        }
+      if (p0status == 0 && IS_NOT_EQUAL(p0value, 0)) Free(vctptr);
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+    }
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdf_def_zaxis_hybrid_echam(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen,
+                           int *dimID, char *axisname)
+{
+  int fileID = streamptr->fileID;
+  struct cdfPostDefActionList *delayed = NULL;
+
+  bool switchNCMode = (streamptr->ncmode == 2);
+  if (switchNCMode)
+    {
+      streamptr->ncmode = 1;
+      cdf_redef(fileID);
+    }
+
+  cdf_def_dim(fileID, axisname, dimlen, dimID);
+  cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp);
+  int ncvarid = *ncvaridp;
+
+  {
+    static const char sname[] = "hybrid_sigma_pressure";
+    cdf_put_att_text(fileID, ncvarid, "standard_name", sizeof(sname) - 1, sname);
+  }
+  {
+    static const char *attName[] = { "long_name", "formula", "formula_terms" };
+    enum
+    {
+      nAtt = sizeof(attName) / sizeof(attName[0])
+    };
+    static const char lname_m[] = "hybrid level at layer midpoints", formula_m[] = "hyam hybm (mlev=hyam+hybm*aps)",
+                      fterms_m[] = "ap: hyam b: hybm ps: aps", lname_i[] = "hybrid level at layer interfaces",
+                      formula_i[] = "hyai hybi (ilev=hyai+hybi*aps)", fterms_i[] = "ap: hyai b: hybi ps: aps";
+    static const struct attTxtTab tab[2][nAtt]
+        = { { { lname_i, sizeof(lname_i) - 1 }, { formula_i, sizeof(formula_i) - 1 }, { fterms_i, sizeof(fterms_i) - 1 } },
+            { { lname_m, sizeof(lname_m) - 1 }, { formula_m, sizeof(formula_m) - 1 }, { fterms_m, sizeof(fterms_m) - 1 } } };
+
+    size_t tabSelect = type == ZAXIS_HYBRID;
+    for (size_t i = 0; i < nAtt; ++i)
+      cdf_put_att_text(fileID, ncvarid, attName[i], tab[tabSelect][i].txtLen, tab[tabSelect][i].txt);
+  }
+
+  {
+    static const char units[] = "level";
+    cdf_put_att_text(fileID, ncvarid, "units", sizeof(units) - 1, units);
+  }
+  {
+    static const char direction[] = "down";
+    cdf_put_att_text(fileID, ncvarid, "positive", sizeof(direction) - 1, direction);
+  }
+
+  if (zaxisInqLevels(zaxisID, NULL))
+    cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID), (void (*)(void *))(void (*)(void)) memFree);
+
+  {
+    struct cdfPostDefActionList *delayedVct = cdf_def_vct_echam(streamptr, zaxisID);
+    delayed = cdfPostDefActionConcat(delayed, delayedVct);
+    Free(delayedVct);
+  }
+
+  if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID;
+
+  if (switchNCMode)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen,
+                        int *dimID, char *axisname)
+{
+  char psname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, psname, &length);
+  if (psname[0] == 0) strcpy(psname, "ps");
+
+  int fileID = streamptr->fileID;
+
+  bool switchNCMode = (streamptr->ncmode == 2);
+  if (switchNCMode)
+    {
+      streamptr->ncmode = 1;
+      cdf_redef(fileID);
+    }
+
+  char p0name[CDI_MAX_NAME];
+  p0name[0] = 0;
+  static double p0value = 1;
+  int p0varid = CDI_UNDEFID;
+  int p0status = cdiInqKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, &p0value);
+  if (p0status == CDI_NOERR)
+    {
+      length = CDI_MAX_NAME;
+      cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, p0name, &length);
+      if (p0name[0] == 0) strcpy(p0name, "p0");
+      cdf_def_var(fileID, p0name, NC_DOUBLE, 0, 0, &p0varid);
+      static const char longname[] = "reference pressure";
+      cdf_put_att_text(fileID, p0varid, "long_name", sizeof(longname) - 1, longname);
+      static const char units[] = "Pa";
+      cdf_put_att_text(fileID, p0varid, "units", sizeof(units) - 1, units);
+    }
+
+  char zname[CDI_MAX_NAME];
+  char zlongname[CDI_MAX_NAME];
+  char zunits[CDI_MAX_NAME];
+  length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zname, &length);
+  if (zname[0]) strcpy(axisname, zname);
+  zlongname[0] = 0;
+  size_t zlongnameLen;
+  if (zlongname[0] == 0)
+    {
+      static const char default_zlongname[] = "hybrid sigma pressure coordinate";
+      memcpy(zlongname, default_zlongname, sizeof(default_zlongname));
+      zlongnameLen = sizeof(default_zlongname) - 1;
+    }
+  else
+    zlongnameLen = strlen(zlongname);
+  length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length);
+  size_t zunitsLen;
+  if (zunits[0] == 0)
+    {
+      zunits[0] = '1';
+      zunits[1] = '\0';
+      zunitsLen = 1;
+    }
+  else
+    zunitsLen = strlen(zunits);
+
+  cdf_def_dim(fileID, axisname, dimlen, dimID);
+  cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp);
+  int ncvarid = *ncvaridp;
+
+  {
+    static const char sname[] = "standard_name", lname[] = "long_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate",
+                      axis[] = "axis", axis_v[] = "Z", direction[] = "positive", direction_v[] = "down", units[] = "units";
+    struct attTxtTab2 tab[] = {
+      { sname, sname_v, sizeof(sname_v) - 1 },
+      { axis, axis_v, sizeof(axis_v) - 1 },
+      { direction, direction_v, sizeof(direction_v) - 1 },
+      { units, zunits, zunitsLen },
+      { lname, zlongname, zlongnameLen },
+    };
+    enum
+    {
+      nAtt = sizeof(tab) / sizeof(tab[0])
+    };
+    for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncvarid, tab[i].attName, tab[i].valLen, tab[i].attVal);
+  }
+
+  size_t len = 0;
+  char txt[CDI_MAX_NAME * 2 + 30];
+  if (p0status == 0)
+    len = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a b: b p0: ", p0name, "ps: ", psname));
+  else
+    len = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap b: b ps: ", psname));
+  cdf_put_att_text(fileID, ncvarid, "formula_terms", len, txt);
+
+  int ncbvarid = CDI_UNDEFID;
+  int nvdimID = CDI_UNDEFID;
+
+  double *buffer = (double *) Malloc(2 * dimlen * sizeof(double));
+  double *lbounds = buffer;
+  double *ubounds = buffer + dimlen;
+  double *restrict levels;
+
+  bool hasLevels = zaxisInqLevels(zaxisID, NULL) != 0;
+  if (hasLevels)
+    levels = (double *) zaxisInqLevelsPtr(zaxisID);
+  else
+    {
+      levels = (double *) Malloc(sizeof(*levels) * dimlen);
+      for (size_t i = 0; i < dimlen; ++i) levels[i] = (double) (i + 1);
+    }
+
+  if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL))
+    {
+      zaxisInqLbounds(zaxisID, lbounds);
+      zaxisInqUbounds(zaxisID, ubounds);
+    }
+  else
+    {
+      for (size_t i = 0; i < dimlen; ++i) lbounds[i] = levels[i];
+      for (size_t i = 0; i < dimlen - 1; ++i) ubounds[i] = levels[i + 1];
+      ubounds[dimlen - 1] = levels[dimlen - 1] + 1;
+    }
+
+  // if ( zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL) )
+  {
+    size_t nvertex = 2;
+    if (dimlen > 1 && nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID);
+
+    if (nvdimID != CDI_UNDEFID)
+      {
+        size_t axisnameLen = strlen(axisname);
+        axisname[axisnameLen] = '_';
+        memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName));
+        axisnameLen += sizeof(bndsName);
+        int dimIDs[2] = { *dimID, nvdimID };
+        cdf_def_var(fileID, axisname, (nc_type) xtype, 2, dimIDs, &ncbvarid);
+        cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen, axisname);
+        size_t formulatermsLen;
+        if (p0status == 0)
+          formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a_bnds b: b_bnds p0: ", p0name, "ps: ", psname));
+        else
+          formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap_bnds b: b_bnds ps: ", psname));
+
+        {
+          static const char sname[] = "standard_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate",
+                            formulaterms[] = "formula_terms", units[] = "units";
+          struct attTxtTab2 tab[] = {
+            { sname, sname_v, sizeof(sname_v) - 1 },
+            { units, zunits, zunitsLen },
+            { formulaterms, txt, formulatermsLen },
+          };
+          enum
+          {
+            nAtt = sizeof(tab) / sizeof(tab[0])
+          };
+          for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncbvarid, tab[i].attName, tab[i].valLen, tab[i].attVal);
+        }
+      }
+  }
+
+  if (switchNCMode)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  struct cdfPostDefActionList *delayed = NULL;
+
+  if (p0varid != CDI_UNDEFID)
+    cdfPostDefActionAddPutVal(&delayed, fileID, p0varid, &p0value, (void (*)(void *))(void (*)(void)) memFree);
+
+  cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, levels,
+                            hasLevels ? (void (*)(void *))(void (*)(void)) memFree : cdfDelayedPutVarDeepCleanup);
+
+  if (ncbvarid != CDI_UNDEFID)
+    {
+      double *zbounds = (double *) Malloc(2 * dimlen * sizeof(*zbounds));
+      for (size_t i = 0; i < dimlen; ++i)
+        {
+          zbounds[2 * i] = lbounds[i];
+          zbounds[2 * i + 1] = ubounds[i];
+        }
+      cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup);
+    }
+
+  {
+    struct cdfPostDefActionList *delayedVct = cdf_def_vct_cf(streamptr, zaxisID, *dimID, nvdimID, p0status, p0value);
+    delayed = cdfPostDefActionConcat(delayed, delayedVct);
+    Free(delayedVct);
+  }
+
+  if (*dimID == CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = type == ZAXIS_HYBRID ? streamptr->vct.mlevID : streamptr->vct.ilevID;
+
+  free(buffer);
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdf_def_zaxis_hybrid(stream_t *streamptr, int type, int *ncvarid, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID,
+                     char *axisname)
+{
+  struct cdfPostDefActionList *(*def_zaxis_hybrid_delegate)(stream_t * streamptr, int type, int *ncvarid, int zaxisID,
+                                                            int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname)
+      = ((!CDI_CMOR_Mode && CDI_Convention == CDI_CONVENTION_ECHAM) || type == ZAXIS_HYBRID_HALF) ? cdf_def_zaxis_hybrid_echam
+                                                                                                  : cdf_def_zaxis_hybrid_cf;
+  return def_zaxis_hybrid_delegate(streamptr, type, ncvarid, zaxisID, zaxisindex, xtype, dimlen, dimID, axisname);
+}
+
+static void
+cdfDefZaxisUUID(stream_t *streamptr, int zaxisID)
+{
+  unsigned char uuid[CDI_UUID_SIZE] = { 0 };
+  int length = CDI_UUID_SIZE;
+  cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+  if (!cdiUUIDIsNull(uuid))
+    {
+      char uuidStr[uuidNumHexChars + 1] = { 0 };
+      if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars)
+        {
+          int fileID = streamptr->fileID;
+
+          bool switchNCMode = (streamptr->ncmode == 2);
+          if (switchNCMode)
+            {
+              streamptr->ncmode = 1;
+              cdf_redef(fileID);
+            }
+
+          cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfVGrid", uuidNumHexChars, uuidStr);
+
+          if (switchNCMode)
+            {
+              cdf_enddef(fileID, streamptr->self);
+              streamptr->ncmode = 2;
+            }
+        }
+    }
+}
+
+#ifndef USE_MPI
+static void
+cdfDefZaxisChar(stream_t *streamptr, int zaxisID, char *axisname, int *dimID, size_t dimlen, int zaxisindex)
+{
+  int fileID = streamptr->fileID;
+  int ncvarID = CDI_UNDEFID;
+  if (streamptr->ncmode == 2) cdf_redef(fileID);
+
+  // Check StrlenID
+  char strlen[8] = "strlen\0";
+  size_t clen = (size_t) zaxisInqCLen(zaxisID);
+  if (clen == 0)
+    Error("Maximal string length value is 0.\nA given character axis requires a dimension to save the maximal string length.");
+  int strlenID = CDI_UNDEFID;
+  strlenID = checkDimName(fileID, clen, strlen);
+
+  if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, strlen, clen, &strlenID);
+
+  // Check 'areatype'dimID
+  char dimname[CDI_MAX_NAME + 3];
+  int length = sizeof(dimname);
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length);
+  *dimID = checkDimName(fileID, dimlen, dimname);
+  if (dimlen <= 0) Error("No strings delivered for a character axis.");
+  if (dimname[0] == 0)
+    {
+      memcpy(dimname, "area_type", 10);
+      dimname[10] = 0;
+    }
+
+  if (*dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, dimID);
+
+  int dimIDs[2];
+  dimIDs[0] = *dimID;
+  dimIDs[1] = strlenID;
+
+  // Get Stringvalues
+  char **cvals = zaxisInqCValsPtr(zaxisID);
+
+  if (cvals)
+    {
+      // Define variable and its attributes
+      cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncvarID);
+
+      cdfPutGridStdAtts(fileID, ncvarID, zaxisID, 'Z');
+      cdf_put_att_text(fileID, ncvarID, "axis", 1, "Z");
+      cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarID);
+
+      streamptr->nczvarID[zaxisindex] = ncvarID;
+      cdf_enddef(fileID, streamptr->self);
+
+      // Write Stringvalues
+      size_t start[2] = { 0, 0 }, count[2] = { 1, clen };
+      for (size_t i = 0; i < dimlen; i++)
+        {
+          start[0] = i;
+          nc_put_vara_text(fileID, ncvarID, start, count, cvals[i]);
+        }
+    }
+
+  streamptr->ncmode = 2;
+}
+#endif
+
+static int
+zaxis_inq_xtype(int zaxisID)
+{
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  int xtype = NC_DOUBLE;
+  // clang-format off
+  if      (datatype == CDI_DATATYPE_FLT32) xtype = NC_FLOAT;
+  else if (datatype == CDI_DATATYPE_INT32) xtype = NC_INT;
+  else if (datatype == CDI_DATATYPE_INT16) xtype = NC_SHORT;
+  // clang-format on
+  return xtype;
+}
+
+static struct cdfPostDefActionList *
+cdfDefZaxis(stream_t *streamptr, int zaxisID)
+{
+  // char zaxisname0[CDI_MAX_NAME];
+  int ncvarid = CDI_UNDEFID, ncbvarid = CDI_UNDEFID;
+  int xtype = zaxis_inq_xtype(zaxisID);
+
+  size_t dimlen = (size_t) zaxisInqSize(zaxisID);
+  int type = zaxisInqType(zaxisID);
+
+  int ndims = 1;
+  struct cdfPostDefActionList *delayed = NULL;
+
+  if (dimlen == 1)
+    {
+      bool isScalar = zaxisInqScalar(zaxisID) > 0;
+      if (!isScalar && CDI_CMOR_Mode)
+        {
+          isScalar = true;
+          zaxisDefScalar(zaxisID);
+        }
+
+      if (isScalar) ndims = 0;
+      if (CDI_Reduce_Dim) return delayed;
+
+      switch (type)
+        {
+        case ZAXIS_SURFACE:
+        case ZAXIS_CLOUD_BASE:
+        case ZAXIS_CLOUD_TOP:
+        case ZAXIS_ISOTHERM_ZERO:
+        case ZAXIS_TROPOPAUSE:
+        case ZAXIS_TOA:
+        case ZAXIS_SEA_BOTTOM:
+        case ZAXIS_ATMOSPHERE:
+        case ZAXIS_MEANSEA:
+        case ZAXIS_LAKE_BOTTOM:
+        case ZAXIS_SEDIMENT_BOTTOM:
+        case ZAXIS_SEDIMENT_BOTTOM_TA:
+        case ZAXIS_SEDIMENT_BOTTOM_TW:
+        case ZAXIS_MIX_LAYER: return delayed;
+        }
+    }
+
+  int vlistID = streamptr->vlistID;
+  char axisname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, axisname, &length);
+  int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+  int nzaxis = vlistNumZaxis(vlistID);
+  int fileID = streamptr->fileID;
+
+  checkZaxisName(axisname, fileID, vlistID, zaxisID, nzaxis);
+
+  char dimname[CDI_MAX_NAME + 3];
+  dimname[0] = 0;
+  if (dimname[0] == 0) strcpy(dimname, axisname);
+
+  if (type == ZAXIS_REFERENCE) cdfDefZaxisUUID(streamptr, zaxisID);
+
+  int dimID = CDI_UNDEFID;
+  if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF)
+    {
+      delayed = cdf_def_zaxis_hybrid(streamptr, type, &ncvarid, zaxisID, zaxisindex, xtype, dimlen, &dimID, axisname);
+
+      int natts;
+      cdiInqNatts(zaxisID, CDI_GLOBAL, &natts);
+      cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid);
+    }
+#ifndef USE_MPI
+  else if (type == ZAXIS_CHAR)
+    cdfDefZaxisChar(streamptr, zaxisID, axisname, &dimID, dimlen, zaxisindex);
+#endif
+  else
+    {
+      dimID = checkDimName(fileID, dimlen, dimname);
+
+      bool switchNCMode = (streamptr->ncmode == 2);
+      if (switchNCMode)
+        {
+          streamptr->ncmode = 1;
+          cdf_redef(fileID);
+        }
+
+      if (ndims && dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, &dimID);
+
+      if (zaxisInqLevels(zaxisID, NULL))
+        {
+          cdf_def_var(fileID, axisname, (nc_type) xtype, ndims, &dimID, &ncvarid);
+
+          cdfPutGridStdAtts(fileID, ncvarid, zaxisID, 'Z');
+
+          {
+            int positive = zaxisInqPositive(zaxisID);
+            static const char positive_up[] = "up", positive_down[] = "down";
+            static const struct attTxtTab tab[2] = {
+              { positive_up, sizeof(positive_up) - 1 },
+              { positive_down, sizeof(positive_down) - 1 },
+            };
+            if (positive == POSITIVE_UP || positive == POSITIVE_DOWN)
+              {
+                size_t select = (positive == POSITIVE_DOWN);
+                cdf_put_att_text(fileID, ncvarid, "positive", tab[select].txtLen, tab[select].txt);
+              }
+          }
+          cdf_put_att_text(fileID, ncvarid, "axis", 1, "Z");
+          cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID),
+                                    (void (*)(void *))(void (*)(void)) memFree);
+
+          if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL))
+            {
+              int nvdimID = CDI_UNDEFID;
+              size_t nvertex = 2;
+              if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID);
+
+              if (nvdimID != CDI_UNDEFID)
+                {
+                  {
+                    size_t axisnameLen = strlen(axisname);
+                    axisname[axisnameLen] = '_';
+                    memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName));
+                    int dimIDs[2];
+                    dimIDs[0] = dimID;
+                    dimIDs[ndims] = nvdimID;
+                    cdf_def_var(fileID, axisname, (nc_type) xtype, ndims + 1, dimIDs, &ncbvarid);
+                    cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname);
+                  }
+                  {
+                    double *zbounds = (double *) Malloc(4 * dimlen * sizeof(*zbounds)), *lbounds = zbounds + 2 * dimlen,
+                           *ubounds = zbounds + 3 * dimlen;
+                    zaxisInqLbounds(zaxisID, lbounds);
+                    zaxisInqUbounds(zaxisID, ubounds);
+                    for (size_t i = 0; i < dimlen; ++i)
+                      {
+                        zbounds[2 * i] = lbounds[i];
+                        zbounds[2 * i + 1] = ubounds[i];
+                      }
+                    zbounds = (double *) Realloc(zbounds, 2 * dimlen * sizeof(*zbounds));
+                    cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup);
+                  }
+                }
+            }
+          cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid);
+        }
+
+      if (switchNCMode)
+        {
+          cdf_enddef(fileID, streamptr->self);
+          streamptr->ncmode = 2;
+        }
+
+      if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->nczvarID[zaxisindex] = ncvarid;
+    }
+
+  if (dimID != CDI_UNDEFID) streamptr->zaxisID[zaxisindex] = dimID;
+  return delayed;
+}
+
+static struct cdfPostDefActionList *
+cdf_def_mapping(stream_t *streamptr, int gridID)
+{
+  struct cdfPostDefActionList *delayed = NULL;
+
+  int natts;
+  cdiInqNatts(gridID, CDI_GLOBAL, &natts);
+  if (natts == 0) return delayed;
+
+  int datatype = -1;
+  int status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, &datatype);
+  nc_type gmapvartype = (status == CDI_NOERR) ? (nc_type) datatype : NC_INT;
+  char gmapvarname[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length);
+  if (!gmapvarname[0]) strcpy(gmapvarname, "crs");
+
+  int fileID = streamptr->fileID;
+
+  bool switchNCMode = (streamptr->ncmode == 2);
+  if (switchNCMode)
+    {
+      streamptr->ncmode = 1;
+      cdf_redef(fileID);
+    }
+
+  int ncvarid;
+  int ncerrcode = nc_def_var(fileID, gmapvarname, gmapvartype, 0, NULL, &ncvarid);
+  if (ncerrcode == NC_NOERR) cdfDefineAttributes(streamptr->filetype, gridID, CDI_GLOBAL, fileID, ncvarid);
+
+  if (switchNCMode)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  if (ncerrcode == NC_NOERR && !xtypeIsText(gmapvartype))
+    {
+      cdfPostDefActionAddPut1Int(&delayed, fileID, ncvarid, 1, (void (*)(void *))(void (*)(void)) memFree);
+    }
+  return delayed;
+}
+
+#ifndef USE_MPI
+static void
+cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, int strlen)
+{
+  if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return;
+
+  bool isXaxis = (cdiAxisID == CDI_XAXIS);
+
+  SizeType dimlen = isXaxis ? gridInqXsize(gridID) : gridInqYsize(gridID);
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  // Check for all grids up to gridIndex whether it already is defined
+
+  for (int index = 0; index < gridIndex; index++)
+    {
+      int gridID0 = ncgrid[index].gridID;
+      int gridtype0 = gridInqType(gridID0);
+      if (gridtype0 == GRID_CHARXY)
+        {
+          if (gridInqXIsc(gridID0) == strlen && gridInqXsize(gridID0) == dimlen)
+            return;
+          else if (gridInqYIsc(gridID0) == strlen && gridInqYsize(gridID0) == dimlen)
+            return;
+        }
+    }
+
+  int fileID = streamptr->fileID;
+
+  if (streamptr->ncmode == 2) cdf_redef(fileID);
+
+  // Define Dims
+
+  char dimname[CDI_MAX_NAME + 3];
+  int length = sizeof(dimname);
+  cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_DIMNAME, dimname, &length);
+  if (dimname[0] == 0)
+    {
+      memcpy(dimname, "region", 7);
+      dimname[6] = 0;
+    }
+  int dimID = checkDimName(fileID, (size_t) dimlen, dimname);
+  if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID);
+
+  // Define strlength dim
+
+  strcpy(dimname, "strlen");
+  int strlenID = checkDimName(fileID, strlen, dimname);
+  if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, strlen, &strlenID);
+
+  // Define Variable
+
+  int dimIDs[2];
+  dimIDs[0] = dimID;
+  dimIDs[1] = strlenID;
+
+  char axisname[CDI_MAX_NAME];
+  char **cvals = (char **) Malloc((size_t) dimlen * sizeof(char *));
+  for (size_t i = 0; i < (size_t) dimlen; i++) cvals[i] = (char *) Malloc(strlen * sizeof(char));
+  int ncaxisid;
+  length = CDI_MAX_NAME;
+  cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_NAME, axisname, &length);
+  gridInqXCvals(gridID, cvals);
+
+  int status = nc_inq_varid(fileID, axisname, &ncaxisid);
+  if (status == NC_NOERR) return;
+
+  cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncaxisid);
+  cdfPutGridStdAtts(fileID, ncaxisid, gridID, isXaxis ? 'X' : 'Y');
+
+  cdf_enddef(fileID, streamptr->self);
+
+  // Write Var
+
+  size_t start[2] = { 0, 0 }, count[2] = { 1, strlen };
+  for (size_t i = 0; i < (size_t) dimlen; i++)
+    {
+      start[0] = i;
+      (void) nc_put_vara_text(fileID, ncaxisid, start, count, cvals[i]);
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID;
+  ncgrid[gridIndex].ncIDs[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid;
+
+  streamptr->ncmode = 2;
+}
+#endif
+
+static void
+cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex)
+{
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+
+  ncgrid[gridIndex].gridID = gridID;
+
+  {
+    SizeType dimlen = gridInqSize(gridID);
+
+    struct idSearch search
+        = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize);
+    int iz = search.numNonMatching;
+    int dimID = search.foundID;
+
+    if (dimID == CDI_UNDEFID)
+      {
+        int fileID = streamptr->fileID;
+
+        char axisname[16] = "rgrid";
+        size_t len = strlen(axisname);
+        if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1);
+
+        bool switchNCMode = (streamptr->ncmode == 2);
+        if (switchNCMode)
+          {
+            streamptr->ncmode = 1;
+            cdf_redef(fileID);
+          }
+
+        cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID);
+
+        if (switchNCMode)
+          {
+            cdf_enddef(fileID, streamptr->self);
+            streamptr->ncmode = 2;
+          }
+      }
+
+    ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+  }
+
+  {
+    SizeType dimlen = gridInqYsize(gridID);
+
+    struct idSearch search
+        = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize);
+    int iz = search.numNonMatching;
+    int dimID = search.foundID;
+
+    if (dimID == CDI_UNDEFID)
+      {
+        int fileID = streamptr->fileID;
+
+        char axisname[32] = "reduced_points";
+        size_t len = strlen(axisname);
+        if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1);
+
+        if (streamptr->ncmode == 2) cdf_redef(fileID);
+
+        cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID);
+
+        int ncvarid = CDI_UNDEFID;
+        cdf_def_var(fileID, axisname, NC_INT, 1, &dimID, &ncvarid);
+
+        cdf_enddef(fileID, streamptr->self);
+        streamptr->ncmode = 2;
+
+        int *reducedPoints = (int *) Malloc((size_t) dimlen * sizeof(int));
+        gridInqReducedPoints(gridID, reducedPoints);
+        cdf_put_var_int(fileID, ncvarid, reducedPoints);
+        Free(reducedPoints);
+
+        ncgrid[gridIndex].ncIDs[CDF_VARID_RP] = ncvarid;
+      }
+
+    ncgrid[gridIndex].ncIDs[CDF_DIMID_RP] = dimID;
+  }
+}
+
+static void
+cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex)
+{
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+  int dimID = CDI_UNDEFID;
+
+  SizeType dimlen = gridInqSize(gridID);
+
+  if (gridInqYsize(gridID) == 0)
+    {
+      struct idSearch search
+          = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
+      dimID = search.foundID;
+    }
+
+  if (gridInqXsize(gridID) == 0)
+    {
+      struct idSearch search
+          = cdfSearchIDBySize(0, (size_t) gridIndex, ncgrid, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize);
+      dimID = search.foundID;
+    }
+
+  if (dimID == CDI_UNDEFID)
+    {
+      int fileID = streamptr->fileID;
+      char dimname[CDI_MAX_NAME];
+      int length = sizeof(dimname);
+      cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length);
+      if (dimname[0] == 0) strcpy(dimname, "gsize");
+
+      dimID = checkDimName(fileID, (size_t) dimlen, dimname);
+
+      if (dimID == CDI_UNDEFID)
+        {
+          bool switchNCMode = (streamptr->ncmode == 2);
+          if (switchNCMode)
+            {
+              streamptr->ncmode = 1;
+              cdf_redef(fileID);
+            }
+
+          cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID);
+
+          if (switchNCMode)
+            {
+              cdf_enddef(fileID, streamptr->self);
+              streamptr->ncmode = 2;
+            }
+        }
+    }
+
+  ncgrid[gridIndex].gridID = gridID;
+  ncgrid[gridIndex].ncIDs[CDF_DIMID_X] = dimID;
+}
+
+static struct cdfPostDefActionList *
+cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex)
+{
+  struct cdfPostDefActionList *delayed = NULL;
+
+  if (streamptr->ncgrid[gridIndex].ncIDs[CDF_DIMID_X] != CDI_UNDEFID) return delayed;
+
+  int gridtype = gridInqType(gridID);
+  SizeType size = gridInqSize(gridID);
+
+  if (CDI_Debug) Message("gridtype = %d  size = %zu", gridtype, size);
+
+  if (CDI_Reduce_Dim && size == 1)  // no grid information
+    {
+      streamptr->ncgrid[gridIndex].gridID = gridID;
+      return delayed;
+    }
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || gridtype == GRID_PROJECTION)
+    {
+      int ndims = !(gridtype == GRID_LONLAT && size == 1 && !gridInqHasDims(gridID));
+      SizeType xsize = gridInqXsize(gridID);
+      SizeType ysize = gridInqYsize(gridID);
+
+      if (xsize)
+        {
+          struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, ndims, false);
+          delayed = cdfPostDefActionConcat(delayed, xdelayed);
+          Free(xdelayed);
+        }
+      if (ysize)
+        {
+          struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, ndims, false);
+          delayed = cdfPostDefActionConcat(delayed, ydelayed);
+          Free(ydelayed);
+        }
+
+      if (ndims == 1 && xsize == 0 && ysize == 0 && gridtype == GRID_PROJECTION)
+        cdf_define_generic_dim(streamptr, gridID, gridIndex);
+
+      struct cdfPostDefActionList *mdelayed = cdf_def_mapping(streamptr, gridID);
+      delayed = cdfPostDefActionConcat(delayed, mdelayed);
+      Free(mdelayed);
+    }
+  else if (gridtype == GRID_GENERIC)
+    {
+      SizeType xsize = gridInqXsize(gridID);
+      SizeType ysize = gridInqYsize(gridID);
+      if (size == 1 && xsize == 0 && ysize == 0)
+        {
+          // no grid information
+          streamptr->ncgrid[gridIndex].gridID = gridID;
+        }
+      else
+        {
+
+          if (xsize > 0)
+            {
+              struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false);
+              delayed = cdfPostDefActionConcat(delayed, xdelayed);
+              Free(xdelayed);
+            }
+          if (ysize > 0)
+            {
+              struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false);
+              delayed = cdfPostDefActionConcat(delayed, ydelayed);
+              Free(ydelayed);
+            }
+
+          if (xsize == 0 && ysize == 0) cdf_define_generic_dim(streamptr, gridID, gridIndex);
+        }
+    }
+  else if (gridtype == GRID_CURVILINEAR)
+    {
+      delayed = cdfDefCurvilinear(streamptr, gridID, gridIndex);
+    }
+  else if (gridtype == GRID_UNSTRUCTURED)
+    {
+      delayed = cdfDefUnstructured(streamptr, gridID, gridIndex);
+    }
+  else if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      cdfDefReducedGrid(streamptr, gridID, gridIndex);
+      if (gridInqYsize(gridID))
+        {
+          struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, true);
+          delayed = cdfPostDefActionConcat(delayed, ydelayed);
+          Free(ydelayed);
+        }
+    }
+  else if (gridtype == GRID_SPECTRAL)
+    {
+      cdfDefComplex(streamptr, gridID, gridIndex);
+      cdfDefSP(streamptr, gridID, gridIndex);
+    }
+  else if (gridtype == GRID_FOURIER)
+    {
+      cdfDefComplex(streamptr, gridID, gridIndex);
+      cdfDefFC(streamptr, gridID, gridIndex);
+    }
+  else if (gridtype == GRID_TRAJECTORY)
+    {
+      cdfDefTrajLon(streamptr, gridID, gridIndex);
+      cdfDefTrajLat(streamptr, gridID, gridIndex);
+    }
+#ifndef USE_MPI
+  else if (gridtype == GRID_CHARXY)
+    {
+      int strlen = 0;
+      if ((strlen = gridInqXIsc(gridID)))
+        cdfDefCharacter(streamptr, gridID, gridIndex, CDI_XAXIS, strlen);
+      else if (gridInqXsize(gridID))
+        {
+          struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false);
+          delayed = cdfPostDefActionConcat(delayed, xdelayed);
+          Free(xdelayed);
+        }
+
+      if ((strlen = gridInqYIsc(gridID)))
+        cdfDefCharacter(streamptr, gridID, gridIndex, CDI_YAXIS, strlen);
+      else if (gridInqYsize(gridID))
+        {
+          struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false);
+          delayed = cdfPostDefActionConcat(delayed, ydelayed);
+          Free(ydelayed);
+        }
+    }
+#endif
+  else
+    {
+      Error("Unsupported grid type: %s", gridNamePtr(gridtype));
+    }
+  return delayed;
+}
+
+void
+cdfDefCoordinateVars(stream_t *streamptr)
+{
+  int vlistID = streamptr->vlistID;
+  if (vlistID == CDI_UNDEFID) Error("Internal problem! vlist undefined for streamptr %p", streamptr);
+
+  if (vlistHasTime(vlistID)) cdfDefTime(streamptr);
+
+  int ngrids = vlistNumGrids(vlistID);
+  if (2 * ngrids > MAX_GRIDS_PS) Error("Internal problem! Too many grids per stream (max=%d)\n", MAX_GRIDS_PS);
+
+  struct cdfPostDefActionList *delayed = NULL;
+
+  ncgrid_t *ncgrid = streamptr->ncgrid;
+  for (int index = 0; index < 2 * ngrids; ++index)
+    {
+      ncgrid[index].gridID = CDI_UNDEFID;
+      for (size_t i = 0; i < CDF_SIZE_ncIDs; ++i) ncgrid[index].ncIDs[i] = CDI_UNDEFID;
+    }
+
+  for (int index = 0; index < ngrids; ++index)
+    {
+      int gridID = vlistGrid(vlistID, index);
+      struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, gridID, index);
+      delayed = cdfPostDefActionConcat(delayed, griddelayed);
+      Free(griddelayed);
+    }
+  {
+    int index = ngrids - 1;
+    for (int i = 0; i < ngrids; ++i)
+      {
+        int gridID = vlistGrid(vlistID, i);
+        int projID = gridInqProj(gridID);
+        if (projID != CDI_UNDEFID)
+          {
+            struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, projID, ++index);
+            delayed = cdfPostDefActionConcat(delayed, griddelayed);
+            Free(griddelayed);
+          }
+      }
+  }
+
+  int nzaxis = vlistNumZaxis(vlistID);
+  for (int index = 0; index < nzaxis; ++index)
+    {
+      int zaxisID = vlistZaxis(vlistID, index);
+      if (streamptr->zaxisID[index] == CDI_UNDEFID)
+        {
+          struct cdfPostDefActionList *zaxisdelayed = cdfDefZaxis(streamptr, zaxisID);
+          delayed = cdfPostDefActionConcat(delayed, zaxisdelayed);
+          Free(zaxisdelayed);
+        }
+    }
+
+  if (streamptr->ncmode != 2)
+    {
+      cdf_enddef(streamptr->fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  int nvars = vlistNvars(vlistID);
+  for (int varID = 0; varID < nvars; varID++) cdfDefVar(streamptr, varID);
+
+  cdfEndDef(streamptr);
+  if (delayed)
+    {
+      cdfPostDefActionApply(delayed->len, delayed->actions);
+      cdfPostDefActionListDelete(delayed);
+    }
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+
+
+static int
+cdfDefTimeBounds(int fileID, int nctimevarid, int nctimedimid, const char *taxis_name, taxis_t *taxis)
+{
+  int dims[2];
+
+  dims[0] = nctimedimid;
+
+  static const char bndsName[] = "bnds";
+  if (nc_inq_dimid(fileID, bndsName, &dims[1]) != NC_NOERR) cdf_def_dim(fileID, bndsName, 2, &dims[1]);
+
+  const char *bndsAttName, *bndsAttVal;
+  size_t bndsAttValLen;
+  char tmpstr[CDI_MAX_NAME];
+  if (taxis->climatology)
+    {
+      static const char climatology_bndsName[] = "climatology_bnds", climatology_bndsAttName[] = "climatology";
+      bndsAttName = climatology_bndsAttName;
+      bndsAttValLen = sizeof(climatology_bndsName) - 1;
+      bndsAttVal = climatology_bndsName;
+    }
+  else
+    {
+      size_t taxisnameLen = strlen(taxis_name);
+      memcpy(tmpstr, taxis_name, taxisnameLen);
+      tmpstr[taxisnameLen] = '_';
+      memcpy(tmpstr + taxisnameLen + 1, bndsName, sizeof(bndsName));
+      size_t tmpstrLen = taxisnameLen + sizeof(bndsName);
+      static const char generic_bndsAttName[] = "bounds";
+      bndsAttName = generic_bndsAttName;
+      bndsAttValLen = tmpstrLen;
+      bndsAttVal = tmpstr;
+    }
+
+  int time_bndsid = -1;
+  cdf_def_var(fileID, bndsAttVal, NC_DOUBLE, 2, dims, &time_bndsid);
+  cdf_put_att_text(fileID, nctimevarid, bndsAttName, bndsAttValLen, bndsAttVal);
+
+  return time_bndsid;
+}
+
+static const char *
+cdfGetTimeUnits(taxis_t *taxis)
+{
+  const char *unitstr;
+  if (taxis->units && taxis->units[0])
+    {
+      unitstr = taxis->units;
+    }
+  else
+    {
+      if (taxis->type == TAXIS_ABSOLUTE)
+        {
+          static const char *const unitstrfmt[3] = { "year as %Y.%f", "month as %Y%m.%f", "day as %Y%m%d.%f" };
+          size_t fmtidx = ((taxis->unit == TUNIT_YEAR) ? 0 : ((taxis->unit == TUNIT_MONTH) ? 1 : 2));
+          unitstr = unitstrfmt[fmtidx];
+        }
+      else
+        {
+          int year = taxis->rDateTime.date.year;
+          int month = taxis->rDateTime.date.month;
+          int day = taxis->rDateTime.date.day;
+          int hour = taxis->rDateTime.time.hour;
+          int minute = taxis->rDateTime.time.minute;
+          int second = taxis->rDateTime.time.second;
+
+          int timeunit = (taxis->unit != -1) ? taxis->unit : TUNIT_HOUR;
+          if (timeunit == TUNIT_QUARTER)
+            timeunit = TUNIT_MINUTE;
+          else if (timeunit == TUNIT_30MINUTES)
+            timeunit = TUNIT_MINUTE;
+          else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS)
+            timeunit = TUNIT_HOUR;
+
+          char *unitstr_ = ptaxisAllocUnits(taxis, CDF_MAX_TIME_UNIT_STR);
+          assert(month >= 1 && month <= 12 && day > 0 && day <= 31 && hour >= 0 && hour <= 24 && minute >= 0 && minute < 60
+                 && second >= 0 && second <= 60);
+          snprintf(unitstr_, CDF_MAX_TIME_UNIT_STR, "%s since %d-%d-%d %02d:%02d:%02d", tunitNamePtr(timeunit), year, month & 31,
+                   day & 63, hour & 63, minute & 63, second & 63);
+          unitstr = unitstr_;
+        }
+    }
+  return unitstr;
+}
+
+static const char *
+cdfGetForecastTimeUnits(int timeunit)
+{
+  if (timeunit == -1)
+    timeunit = TUNIT_HOUR;
+  else if (timeunit == TUNIT_QUARTER)
+    timeunit = TUNIT_MINUTE;
+  else if (timeunit == TUNIT_30MINUTES)
+    timeunit = TUNIT_MINUTE;
+  else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS)
+    timeunit = TUNIT_HOUR;
+
+  return tunitNamePtr(timeunit);
+}
+
+static void
+cdfDefCalendar(int fileID, int ncvarid, int calendar)
+{
+  static const struct
+  {
+    int calCode;
+    const char *calStr;
+  } calTab[] = {
+    { CALENDAR_STANDARD, "standard" }, { CALENDAR_GREGORIAN, "gregorian" }, { CALENDAR_PROLEPTIC, "proleptic_gregorian" },
+    { CALENDAR_NONE, "none" },         { CALENDAR_360DAYS, "360_day" },     { CALENDAR_365DAYS, "365_day" },
+    { CALENDAR_366DAYS, "366_day" },
+  };
+  enum
+  {
+    calTabSize = sizeof calTab / sizeof calTab[0]
+  };
+
+  for (size_t i = 0; i < calTabSize; ++i)
+    if (calTab[i].calCode == calendar)
+      {
+        const char *calstr = calTab[i].calStr;
+        size_t len = strlen(calstr);
+        cdf_put_att_text(fileID, ncvarid, "calendar", len, calstr);
+        break;
+      }
+}
+
+void
+cdfDefTime(stream_t *streamptr)
+{
+  static const char defaultTimeAxisName[] = "time";
+
+  if (streamptr->basetime.ncvarid != CDI_UNDEFID) return;
+
+  int fileID = streamptr->fileID;
+
+  if (streamptr->ncmode == 0) streamptr->ncmode = 1;
+  if (streamptr->ncmode == 2) cdf_redef(fileID);
+
+  taxis_t *taxis = taxisPtr(vlistInqTaxis(streamptr->vlistID));
+
+  const char *taxisName = (taxis->name && taxis->name[0]) ? taxis->name : defaultTimeAxisName;
+
+  size_t timeDimLen = NC_UNLIMITED;
+  if (streamptr->filetype == CDI_FILETYPE_NCZARR)
+    {
+      if (streamptr->maxSteps == CDI_UNDEFID)
+        fprintf(stderr, "Max. number of timesteps undefined for NCZarr!\n");
+      else
+        timeDimLen = (size_t) streamptr->maxSteps;
+    }
+
+  int timeDimId;
+  cdf_def_dim(fileID, taxisName, timeDimLen, &timeDimId);
+  streamptr->basetime.ncdimid = timeDimId;
+
+  int datatype = taxis->datatype;
+  nc_type xtype = (datatype == CDI_DATATYPE_INT32) ? NC_INT : ((datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE);
+
+  int timeVarId;
+  cdf_def_var(fileID, taxisName, xtype, 1, &timeDimId, &timeVarId);
+  streamptr->basetime.ncvarid = timeVarId;
+
+#ifdef HAVE_NETCDF4
+  if (timeDimLen == NC_UNLIMITED && (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C))
+    {
+      static const size_t chunk = 512;
+      cdf_def_var_chunking(fileID, timeVarId, NC_CHUNKED, &chunk);
+    }
+#endif
+
+  static const char timeStr[] = "time";
+  cdf_put_att_text(fileID, timeVarId, "standard_name", sizeof(timeStr) - 1, timeStr);
+
+  if (taxis->longname && taxis->longname[0])
+    cdf_put_att_text(fileID, timeVarId, "long_name", strlen(taxis->longname), taxis->longname);
+
+  if (taxis->hasBounds) streamptr->basetime.ncvarboundsid = cdfDefTimeBounds(fileID, timeVarId, timeDimId, taxisName, taxis);
+
+  char unitsStr_[CDF_MAX_TIME_UNIT_STR];
+  const char *unitsStr;
+  size_t unitsStrLen;
+  if (taxis->units && taxis->units[0])
+    {
+      unitsStr = taxis->units;
+      unitsStrLen = strlen(taxis->units);
+    }
+  else
+    {
+      /* define bogus value since at this time, streamDefTimestep has
+       * not been called yet
+       * but since taxis->units is not set, it clearly will not
+       * exceed the size of unitstr_, i.e. when defining the units
+       * attribute to this value, a later redefinition will not
+       * cause a recreation of on-disk data
+       */
+      for (size_t i = 0; i < CDF_MAX_TIME_UNIT_STR; ++i) unitsStr_[i] = 'a';
+      unitsStr_[CDF_MAX_TIME_UNIT_STR - 1] = '\0';
+      unitsStr = unitsStr_;
+      unitsStrLen = CDF_MAX_TIME_UNIT_STR - 1;
+    }
+  cdf_put_att_text(fileID, timeVarId, "units", unitsStrLen, unitsStr);
+
+  if (taxis->calendar != -1) cdfDefCalendar(fileID, timeVarId, taxis->calendar);
+
+  if (taxis->type == TAXIS_FORECAST)
+    {
+      int leadtimeid;
+      cdf_def_var(fileID, "leadtime", xtype, 1, &timeDimId, &leadtimeid);
+      streamptr->basetime.leadtimeid = leadtimeid;
+
+      static const char stdName[] = "forecast_period";
+      cdf_put_att_text(fileID, leadtimeid, "standard_name", sizeof(stdName) - 1, stdName);
+
+      static const char longName[] = "Time elapsed since the start of the forecast";
+      cdf_put_att_text(fileID, leadtimeid, "long_name", sizeof(longName) - 1, longName);
+
+      unitsStr = cdfGetForecastTimeUnits(taxis->fc_unit);
+      size_t len = strlen(unitsStr);
+      if (len) cdf_put_att_text(fileID, leadtimeid, "units", len, unitsStr);
+    }
+
+  cdf_put_att_text(fileID, timeVarId, "axis", 1, "T");
+
+  if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self);
+}
+
+void
+cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount)
+{
+  int time_varid = streamptr->basetime.ncvarid;
+  if (time_varid != CDI_UNDEFID && tsID == 0)
+    {
+      taxis_t *taxis = taxisPtr(vlistInqTaxis(streamptr->vlistID));
+      int fileID = streamptr->fileID;
+      const char *unitstr = cdfGetTimeUnits(taxis);
+      size_t len = strlen(unitstr);
+      if (len) cdf_put_att_text(fileID, time_varid, "units", len, unitstr);
+    }
+
+  int fileID = streamptr->fileID;
+
+  if (CDI_Debug) Message("streamID = %d, fileID = %d, tsID = %d", streamptr->self, fileID, tsID);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  if (streamptr->ncmode == 1)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  if (streamptr->accessmode == 0)
+    {
+      cdfEndDef(streamptr);
+    }
+
+  const size_t start[2] = { [0] = (size_t) tsID, [1] = 0 }, count[2] = { [0] = valCount, [1] = 2 * valCount };
+
+  double timeValue[2] = { cdi_encode_timeval(taxis->vDateTime, &streamptr->tsteps[0].taxis) };
+  if (CDI_Debug) Message("tsID = %d  timeValue = %f", tsID, timeValue[0]);
+
+  int ncvarid = streamptr->basetime.ncvarid;
+  cdf_put_vara_double(fileID, ncvarid, start, count, timeValue);
+
+  if (taxis->hasBounds)
+    {
+      ncvarid = streamptr->basetime.ncvarboundsid;
+      if (ncvarid == CDI_UNDEFID) Error("Call to taxisWithBounds() missing!");
+
+      timeValue[0] = cdi_encode_timeval(taxis->vDateTime_lb, &streamptr->tsteps[0].taxis);
+      timeValue[1] = cdi_encode_timeval(taxis->vDateTime_ub, &streamptr->tsteps[0].taxis);
+      cdf_put_vara_double(fileID, ncvarid, start, count, timeValue);
+    }
+
+  ncvarid = streamptr->basetime.leadtimeid;
+  if (taxis->type == TAXIS_FORECAST && ncvarid != CDI_UNDEFID)
+    cdf_put_vara_double(fileID, ncvarid, start, count, &taxis->fc_period);
+}
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#if HAVE_CONFIG_H
+#endif
+
+#include <limits.h>
+#include <stdio.h>
+
+
+#ifdef HAVE_LIBCGRIBEX
+
+
+typedef struct
+{
+  int sec0[2];
+  int sec1[1024];
+  size_t sec2len;
+  int *sec2;
+  int sec3[2];
+  int sec4[512];
+  double fsec2[512];
+  double fsec3[2];
+} cgribexrec_t;
+
+typedef struct
+{
+  int param;
+  int level1;
+  int level2;
+  int ltype;
+  int tsteptype;
+  size_t gridsize;
+} compvar_t;
+
+typedef struct
+{
+  void *gribbuffer;
+  size_t gribbuffersize;
+  unsigned char *pds;
+  unsigned char *gds;
+  unsigned char *bms;
+  unsigned char *bds;
+} cgribex_handle;
+
+static void
+fill_intarr(int *iarr, int val, int n)
+{
+  for (int i = 0; i < n; ++i) iarr[i] = val;
+}
+
+static void
+cgribexInit(cgribexrec_t *cgribexp)
+{
+  cgribexp->sec2len = 4096;
+  cgribexp->sec2 = (int *) Malloc(cgribexp->sec2len * sizeof(int));
+}
+
+void *
+cgribexNew(void)
+{
+  cgribexrec_t *cgribexp = (cgribexrec_t *) Malloc(sizeof(cgribexrec_t));
+  cgribexInit(cgribexp);
+  return (void *) cgribexp;
+}
+
+void
+cgribexDelete(void *cgribex)
+{
+  cgribexrec_t *cgribexp = (cgribexrec_t *) cgribex;
+  if (cgribexp)
+    {
+      if (cgribexp->sec2) Free(cgribexp->sec2);
+      Free(cgribexp);
+    }
+}
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+  int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp,
+                    unsigned char **bdsp, long *gribrecsize);
+#ifdef __cplusplus
+}
+#endif
+
+static size_t
+cgribexSection2Length(void *gribbuffer, size_t gribbuffersize)
+{
+  size_t sec2len = 0;
+
+  if (gribbuffersize && gribbuffer)
+    {
+      unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+      long gribrecsize;
+      int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize);
+      if (status >= 0 && gds != NULL) sec2len = (size_t) ((gds[0] << 16) + (gds[1] << 8) + (gds[3]));
+    }
+
+  return sec2len;
+}
+
+void *
+cgribex_handle_new_from_meassage(void *gribbuffer, size_t gribbuffersize)
+{
+  cgribex_handle *gh = (cgribex_handle *) Malloc(sizeof(cgribex_handle));
+  gh->gribbuffer = NULL;
+  gh->gribbuffersize = 0;
+  gh->pds = NULL;
+
+  if (gribbuffersize && gribbuffer)
+    {
+      unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL;
+      long gribrecsize;
+      int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize);
+      if (status >= 0)
+        {
+          gh->gribbuffer = gribbuffer;
+          gh->gribbuffersize = gribbuffersize;
+          gh->pds = pds;
+          gh->gds = gds;
+          gh->bms = bms;
+          gh->bds = bds;
+        }
+    }
+
+  return (void *) gh;
+}
+
+void
+cgribex_handle_delete(void *gh)
+{
+  if (gh) Free(gh);
+}
+
+static int
+cgribexGetGridType(int *isec2)
+{
+  int gridtype = GRID_GENERIC;
+
+  // clang-format off
+  switch (ISEC2_GridType)
+    {
+    case  GRIB1_GTYPE_LATLON:     { gridtype = GRID_LONLAT;     break; }
+    case  GRIB1_GTYPE_LATLON_ROT: { gridtype = GRID_PROJECTION; break; }
+    case  GRIB1_GTYPE_LCC:        { gridtype = CDI_PROJ_LCC;    break; }
+    case  GRIB1_GTYPE_GAUSSIAN:   { gridtype = ISEC2_Reduced ? GRID_GAUSSIAN_REDUCED : GRID_GAUSSIAN; break; }
+    case  GRIB1_GTYPE_SPECTRAL:   { gridtype = GRID_SPECTRAL;   break; }
+    case  GRIB1_GTYPE_GME:        { gridtype = GRID_GME;        break; }
+    }
+  // clang-format on
+
+  return gridtype;
+}
+
+static bool
+cgribexGetIsRotated(int *isec2)
+{
+  return (ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT);
+}
+
+static bool
+cgribexGetZaxisHasBounds(int grb_ltype)
+{
+  // clang-format off
+  switch (grb_ltype)
+    {
+    case GRIB1_LTYPE_SIGMA_LAYER:
+    case GRIB1_LTYPE_HYBRID_LAYER:
+    case GRIB1_LTYPE_LANDDEPTH_LAYER: return true;
+    }
+  // clang-format on
+
+  return false;
+}
+
+static int
+cgribexGetTimeUnit(int *isec1)
+{
+  int timeunit = TUNIT_HOUR;
+  static bool lprint = true;
+
+  // clang-format off
+  switch ( ISEC1_TimeUnit )
+    {
+    case ISEC1_TABLE4_MINUTE:    timeunit = TUNIT_MINUTE;    break;
+    case ISEC1_TABLE4_QUARTER:   timeunit = TUNIT_QUARTER;   break;
+    case ISEC1_TABLE4_30MINUTES: timeunit = TUNIT_30MINUTES; break;
+    case ISEC1_TABLE4_HOUR:      timeunit = TUNIT_HOUR;      break;
+    case ISEC1_TABLE4_3HOURS:    timeunit = TUNIT_3HOURS;    break;
+    case ISEC1_TABLE4_6HOURS:    timeunit = TUNIT_6HOURS;    break;
+    case ISEC1_TABLE4_12HOURS:   timeunit = TUNIT_12HOURS;   break;
+    case ISEC1_TABLE4_DAY:       timeunit = TUNIT_DAY;       break;
+    default:
+      if (lprint)
+	{
+	  Warning("GRIB time unit %d unsupported!", ISEC1_TimeUnit);
+	  lprint = false;
+	}
+      break;
+    }
+  // clang-format on
+
+  return timeunit;
+}
+
+static bool
+cgribexTimeIsFC(int *isec1)
+{
+  bool isFC = (ISEC1_TimeRange == 10 && ISEC1_TimePeriod1 == 0 && ISEC1_TimePeriod2 == 0) ? false : true;
+  return isFC;
+}
+
+static int
+cgribexGetTsteptype(int timerange)
+{
+  static bool lprint = true;
+
+  // clang-format off
+  int tsteptype = TSTEP_INSTANT;
+  switch ( timerange )
+    {
+    case  0:  tsteptype = TSTEP_INSTANT;  break;
+    case  1:  tsteptype = TSTEP_INSTANT2; break;
+    case  2:  tsteptype = TSTEP_RANGE;    break;
+    case  3:  tsteptype = TSTEP_AVG;      break;
+    case  4:  tsteptype = TSTEP_ACCUM;    break;
+    case  5:  tsteptype = TSTEP_DIFF;     break;
+    case 10:  tsteptype = TSTEP_INSTANT3; break;
+    default:
+      if (lprint)
+	{
+	  Warning("Time range indicator %d unsupported, set to 0!", timerange);
+	  lprint = false;
+	}
+      break;
+    }
+  // clang-format on
+
+  return tsteptype;
+}
+
+static bool
+cgribexGetGridRegular(int *isec2, int *isec4, grid_t *grid, int gridtype, bool compyinc)
+{
+  bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1);
+  bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5);
+
+  size_t nvalues = (size_t) ISEC4_NumValues;
+  size_t nlon = (size_t) ISEC2_NumLon;
+  size_t nlat = (size_t) ISEC2_NumLat;
+  if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat);
+
+  grid->size = nvalues;
+  grid->x.size = nlon;
+  grid->y.size = nlat;
+
+  if (gridtype == GRID_GAUSSIAN) grid->np = ISEC2_NumPar;
+  grid->x.inc = 0;
+  grid->y.inc = 0;
+  grid->x.flag = 0;
+  // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 )
+  {
+    if (grid->x.size > 1)
+      {
+        bool recompinc = true;
+
+        if (ISEC2_LastLon < ISEC2_FirstLon)
+          {
+            if (ISEC2_FirstLon >= 180000)
+              ISEC2_FirstLon -= 360000;
+            else
+              ISEC2_LastLon += 360000;
+          }
+
+        if (ijDirectionIncrementGiven && ISEC2_LonIncr > 0)
+          {
+            if (labs(ISEC2_LastLon - (ISEC2_FirstLon + ISEC2_LonIncr * ((long) grid->x.size - 1))) <= 2)
+              {
+                recompinc = false;
+                grid->x.inc = ISEC2_LonIncr * 0.001;
+              }
+          }
+
+        // recompute xinc if necessary
+        if (recompinc) grid->x.inc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / ((double) grid->x.size - 1);
+
+        // correct xinc if necessary
+        if (ISEC2_FirstLon == 0 && ISEC2_LastLon > 354000 && ISEC2_LastLon < 360000)
+          {
+            double xinc = 360. / (double) grid->x.size;
+            if (fabs(grid->x.inc - xinc) > 0.0)
+              {
+                grid->x.inc = xinc;
+                if (CDI_Debug) Message("set xinc to %g", grid->x.inc);
+              }
+          }
+      }
+    grid->x.first = ISEC2_FirstLon * 0.001;
+    grid->x.last = ISEC2_LastLon * 0.001;
+    grid->x.flag = 2;
+  }
+  grid->y.flag = 0;
+  // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 )
+  {
+    if (grid->y.size > 1 && compyinc)
+      {
+        bool recompinc = true;
+        if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0)
+          {
+            if (labs(ISEC2_LastLat - (ISEC2_FirstLat + ISEC2_LatIncr * ((long) grid->y.size - 1))) <= 2)
+              {
+                recompinc = false;
+                grid->y.inc = ISEC2_LatIncr * 0.001;
+              }
+          }
+
+        // recompute yinc if necessary
+        if (recompinc) grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1);
+      }
+    grid->y.first = ISEC2_FirstLat * 0.001;
+    grid->y.last = ISEC2_LastLat * 0.001;
+    grid->y.flag = 2;
+  }
+
+  return uvRelativeToGrid;
+}
+
+static bool
+cgribexGetGridReduced(int *isec2, int *isec4, grid_t *grid)
+{
+  bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1);
+  bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5);
+  grid->np = ISEC2_NumPar;
+  grid->size = (size_t) ISEC4_NumValues;
+
+  size_t reducedPointsSize = (size_t) ISEC2_NumLat;
+  grid->reducedPointsSize = ISEC2_NumLat;
+  grid->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int));
+  memcpy(grid->reducedPoints, ISEC2_ReducedPointsPtr, reducedPointsSize * sizeof(int));
+
+  grid->y.size = (size_t) ISEC2_NumLat;
+  grid->x.inc = 0;
+  grid->y.inc = 0;
+  grid->x.flag = 0;
+  // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 )
+  {
+    if (ISEC2_LastLon < ISEC2_FirstLon)
+      {
+        if (ISEC2_FirstLon >= 180000)
+          ISEC2_FirstLon -= 360000;
+        else
+          ISEC2_LastLon += 360000;
+      }
+
+    grid->x.first = ISEC2_FirstLon * 0.001;
+    grid->x.last = ISEC2_LastLon * 0.001;
+    grid->x.flag = 2;
+  }
+  grid->y.flag = 0;
+  // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 )
+  {
+    if (grid->y.size > 1)
+      {
+        if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0)
+          grid->y.inc = ISEC2_LatIncr * 0.001;
+        else
+          grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1);
+      }
+    grid->y.first = ISEC2_FirstLat * 0.001;
+    grid->y.last = ISEC2_LastLat * 0.001;
+    grid->y.flag = 2;
+  }
+
+  return uvRelativeToGrid;
+}
+
+static bool
+cgribexGetGridLCC(int *isec2, int *isec4, grid_t *grid)
+{
+  bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5);
+
+  size_t nvalues = (size_t) ISEC4_NumValues;
+  size_t nlon = (size_t) ISEC2_NumLon;
+  size_t nlat = (size_t) ISEC2_NumLat;
+  if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat);
+
+  grid->size = nvalues;
+  grid->x.size = nlon;
+  grid->y.size = nlat;
+
+  grid->x.first = 0;
+  grid->x.last = 0;
+  grid->x.inc = ISEC2_Lambert_dx;
+  grid->y.first = 0;
+  grid->y.last = 0;
+  grid->y.inc = ISEC2_Lambert_dy;
+  grid->x.flag = 2;
+  grid->y.flag = 2;
+
+  return uvRelativeToGrid;
+}
+
+static bool
+cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid, int iret)
+{
+  bool uvRelativeToGrid = false;
+  bool compyinc = true;
+  int gridtype = cgribexGetGridType(isec2);
+  int projtype = (gridtype == GRID_PROJECTION && cgribexGetIsRotated(isec2)) ? CDI_PROJ_RLL : CDI_UNDEFID;
+  if (gridtype == CDI_PROJ_LCC)
+    {
+      projtype = gridtype;
+      gridtype = GRID_PROJECTION;
+    }
+
+  if (streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED && iret != -801)
+    {
+      int nlon = 0;
+      for (int ilat = 0; ilat < ISEC2_NumLat; ++ilat)
+        if (ISEC2_ReducedPoints(ilat) > nlon) nlon = ISEC2_ReducedPoints(ilat);
+      gridtype = GRID_GAUSSIAN;
+      ISEC2_NumLon = nlon;
+      ISEC4_NumValues = nlon * ISEC2_NumLat;
+      compyinc = false;
+    }
+
+  grid_init(grid);
+  cdiGridTypeInit(grid, gridtype, 0);
+
+  if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL)
+    {
+      uvRelativeToGrid = cgribexGetGridRegular(isec2, isec4, grid, gridtype, compyinc);
+    }
+  else if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      uvRelativeToGrid = cgribexGetGridReduced(isec2, isec4, grid);
+    }
+  else if (projtype == CDI_PROJ_LCC)
+    {
+      uvRelativeToGrid = cgribexGetGridLCC(isec2, isec4, grid);
+    }
+  else if (gridtype == GRID_SPECTRAL)
+    {
+      grid->size = (size_t) ISEC4_NumValues;
+      grid->trunc = ISEC2_PentaJ;
+      grid->lcomplex = (ISEC2_RepMode == 2) ? 1 : 0;
+    }
+  else if (gridtype == GRID_GME)
+    {
+      grid->size = (size_t) ISEC4_NumValues;
+      grid->gme.nd = ISEC2_GME_ND;
+      grid->gme.ni = ISEC2_GME_NI;
+      grid->gme.ni2 = ISEC2_GME_NI2;
+      grid->gme.ni3 = ISEC2_GME_NI3;
+    }
+  else if (gridtype == GRID_GENERIC)
+    {
+      grid->size = (size_t) ISEC4_NumValues;
+      grid->x.size = 0;
+      grid->y.size = 0;
+    }
+  else
+    {
+      Error("Unsupported grid type: %s", gridNamePtr(gridtype));
+    }
+
+  grid->type = gridtype;
+  grid->projtype = projtype;
+
+  return uvRelativeToGrid;
+}
+
+static void
+cgribexGetLevel(int *isec1, int *leveltype, int *level1, int *level2)
+{
+  *leveltype = ISEC1_LevelType;
+  *level1 = ISEC1_Level1;
+  *level2 = ISEC1_Level2;
+  if (*leveltype == GRIB1_LTYPE_ISOBARIC)
+    *level1 *= 100;
+  else if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA)
+    *leveltype = GRIB1_LTYPE_ISOBARIC;
+}
+
+static void
+cgribexDefProjLCC(int *isec2, int gridID)
+{
+  struct CDI_GridProjParams gpp;
+  gridProjParamsInit(&gpp);
+
+  bool earthIsOblate = gribbyte_get_bit(ISEC2_ResFlag, 2);
+  if (earthIsOblate)
+    {
+      gpp.a = 6378160.0;
+      gpp.b = 6356775.0;
+      gpp.rf = 297.0;
+    }
+  else
+    {
+      gpp.a = 6367470.0;
+    }
+
+  gpp.xval_0 = ISEC2_FirstLon * 0.001;
+  gpp.yval_0 = ISEC2_FirstLat * 0.001;
+  gpp.lon_0 = ISEC2_Lambert_Lov * 0.001;
+  gpp.lat_1 = ISEC2_Lambert_LatS1 * 0.001;
+  gpp.lat_2 = ISEC2_Lambert_LatS2 * 0.001;
+  bool lsouth = gribbyte_get_bit(ISEC2_Lambert_ProjFlag, 1);
+  if (lsouth)
+    {
+      gpp.lat_1 = -gpp.lat_1;
+      gpp.lat_2 = -gpp.lat_2;
+    }
+
+  gpp.lat_0 = gpp.lat_2;
+
+  if (proj_lonlat_to_lcc_func)
+    {
+      double x_0 = gpp.xval_0, y_0 = gpp.yval_0;
+      proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0);
+      if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv))
+        {
+          gpp.x_0 = -x_0;
+          gpp.y_0 = -y_0;
+        }
+    }
+
+  gridDefParamsLCC(gridID, gpp);
+}
+
+static size_t
+cgribexGetGridsize(const int *isec4)
+{
+  return (size_t) ISEC4_NumValues;
+}
+
+static void
+cgribexAddRecord(stream_t *streamptr, cgribexrec_t *cgribexp, int param, size_t recsize, off_t position, int comptype, int lmv,
+                 int iret)
+{
+  int *isec1 = cgribexp->sec1;
+  int *isec2 = cgribexp->sec2;
+  int *isec4 = cgribexp->sec4;
+  double *fsec2 = cgribexp->fsec2;
+  double *fsec3 = cgribexp->fsec3;
+
+  int datatype = (ISEC4_NumBits > 0 && ISEC4_NumBits <= 32) ? ISEC4_NumBits : CDI_DATATYPE_PACK;
+
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int recID = recordNewEntry(streamptr, tsID);
+  record_t *record = &streamptr->tsteps[tsID].records[recID];
+
+  int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange);
+
+  int leveltype, level1, level2;
+  cgribexGetLevel(isec1, &leveltype, &level1, &level2);
+
+  // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype);
+
+  record->size = recsize;
+  record->position = position;
+  record->param = param;
+  record->ilevel = level1;
+  record->ilevel2 = level2;
+  record->ltype = leveltype;
+  record->tsteptype = (short) tsteptype;
+  record->gridsize = cgribexGetGridsize(cgribexp->sec4);
+
+  grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr));
+  bool uvRelativeToGrid = cgribexGetGrid(streamptr, isec2, isec4, gridptr, iret);
+
+  struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0);
+  int gridID = gridAdded.Id;
+  if (!gridAdded.isNew)
+    {
+      grid_free(gridptr);
+      Free(gridptr);
+    }
+  else if (gridptr->projtype == CDI_PROJ_RLL)
+    {
+      double xpole = ISEC2_LonSP * 0.001 - 180;
+      double ypole = -ISEC2_LatSP * 0.001;
+      double angle = -FSEC2_RotAngle;
+      gridDefParamRLL(gridID, xpole, ypole, angle);
+    }
+  else if (gridptr->projtype == CDI_PROJ_LCC)
+    {
+      cgribexDefProjLCC(isec2, gridID);
+    }
+
+  int zaxistype = grib1ltypeToZaxisType(leveltype);
+  if (zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF)
+    {
+      size_t vctsize = (size_t) ISEC2_NumVCP;
+      double *vctptr = &fsec2[10];
+      varDefVCT(vctsize, vctptr);
+    }
+
+  bool lbounds = cgribexGetZaxisHasBounds(leveltype);
+
+  int varID = 0, levelID = 0;
+  varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, tsteptype, leveltype, -1,
+               NULL, NULL, NULL, NULL);
+
+  record->varID = (short) varID;
+  record->levelID = levelID;
+
+  varDefCompType(varID, comptype);
+
+  if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1);
+
+  if (ISEC1_LocalFLag)
+    {
+      if (ISEC1_CenterID == 78 && isec1[36] == 253)  // DWD local extension
+        {
+          varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[52]);
+          varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[53]);
+          varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[54]);
+        }
+      else if (ISEC1_CenterID == 252 && isec1[36] == 1)  // MPIM local extension
+        {
+          varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[37]);
+          varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[39]);
+          varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[38]);
+        }
+    }
+
+  if (lmv) varDefMissval(varID, FSEC3_MissVal);
+
+  if (varInqInst(varID) == CDI_UNDEFID)
+    {
+      int center = ISEC1_CenterID;
+      int subcenter = ISEC1_SubCenterID;
+      int instID = institutInq(center, subcenter, NULL, NULL);
+      if (instID == CDI_UNDEFID) instID = institutDef(center, subcenter, NULL, NULL);
+      varDefInst(varID, instID);
+    }
+
+  if (varInqModel(varID) == CDI_UNDEFID)
+    {
+      int modelID = modelInq(varInqInst(varID), ISEC1_ModelID, NULL);
+      if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), ISEC1_ModelID, NULL);
+      varDefModel(varID, modelID);
+    }
+
+  if (varInqTable(varID) == CDI_UNDEFID)
+    {
+      int tableID = tableInq(varInqModel(varID), ISEC1_CodeTable, NULL);
+      if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), ISEC1_CodeTable, NULL);
+      varDefTable(varID, tableID);
+    }
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+}
+
+static void
+MCH_get_undef(int *isec1, double *undef_pds, double *undef_eps)
+{
+  /* 2010-01-13: Oliver Fuhrer */
+  if (ISEC1_CenterID == 215)
+    {
+      if (isec1[34] != 0 && isec1[34] != 255)
+        {
+          if (isec1[34] & 2)
+            {
+              *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, -isec1[35]);
+              *undef_eps = pow(10.0, -isec1[35] - 1);
+            }
+          else
+            {
+              *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, +isec1[35]);
+              *undef_eps = pow(10.0, isec1[35] - 1);
+            }
+        }
+    }
+}
+
+static void
+cgribexDecodeHeader(cgribexrec_t *cgribexp, int *gribbuffer, int recsize, int *lmv, int *iret)
+{
+  int *isec0 = cgribexp->sec0;
+  int *isec1 = cgribexp->sec1;
+  int *isec2 = cgribexp->sec2;
+  int *isec3 = cgribexp->sec3;
+  int *isec4 = cgribexp->sec4;
+  double *fsec2 = cgribexp->fsec2;
+  double *fsec3 = cgribexp->fsec3;
+
+  int ipunp = 0, iword = 0;
+
+  fill_intarr(isec1, 0, 256);
+  fill_intarr(isec2, 0, 32);
+
+  double *fsec4 = NULL;
+  gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, ipunp, (int *) gribbuffer, recsize, &iword, "J", iret);
+
+  if (!(ISEC1_Sec2Or3Flag & 128)) isec2[0] = -1;  // default generic grid
+
+  *lmv = 0;
+
+  if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255))
+    {
+      double undef_pds, undef_eps;
+      MCH_get_undef(isec1, &undef_pds, &undef_eps);
+      FSEC3_MissVal = undef_pds;
+      *lmv = 1;
+    }
+}
+
+static compvar_t
+cgribexVarSet(int param, int level1, int level2, int leveltype, int trange, size_t gridsize)
+{
+  int tsteptype = cgribexGetTsteptype(trange);
+
+  compvar_t compVar;
+  compVar.param = param;
+  compVar.level1 = level1;
+  compVar.level2 = level2;
+  compVar.ltype = leveltype;
+  compVar.tsteptype = tsteptype;
+  compVar.gridsize = gridsize;
+
+  return compVar;
+}
+
+static inline int
+cgribexVarCompare(const compvar_t *compVar, const record_t *record, int flag)
+{
+  bool vinst
+      = (compVar->tsteptype == TSTEP_INSTANT || compVar->tsteptype == TSTEP_INSTANT2 || compVar->tsteptype == TSTEP_INSTANT3);
+  bool rinst = (record->tsteptype == TSTEP_INSTANT || record->tsteptype == TSTEP_INSTANT2 || record->tsteptype == TSTEP_INSTANT3);
+  int tstepDiff = (!((flag == 0) & (vinst && rinst))) & (compVar->tsteptype != record->tsteptype);
+  int rstatus = (compVar->param != record->param) | (compVar->level1 != record->ilevel) | (compVar->level2 != record->ilevel2)
+                | (compVar->ltype != record->ltype) | (compVar->gridsize != record->gridsize) | tstepDiff;
+  return rstatus;
+}
+
+#define gribWarning(text, nrecs, timestep, paramstr, level1, level2) \
+  Warning("Record %2d (id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, paramstr, level1, level2, timestep, text)
+
+static void
+cgribexSkipRecords(int fileID)
+{
+  int nskip = CDI_Skip_Records;
+  while (nskip-- > 0)
+    {
+      size_t recsize = gribGetSize(fileID);
+      if (recsize == 0) Error("Skipping of %d records failed!", CDI_Skip_Records);
+
+      off_t recpos = fileGetPos(fileID);
+      fileSetPos(fileID, recpos, SEEK_CUR);
+    }
+}
+
+static CdiDateTime
+cgribexDateTimeX(int *isec1, CdiDateTime *sDateTime)
+{
+  int vdate = 0, sdate = 0, vtime = 0, stime = 0;
+  gribDateTimeX(isec1, &vdate, &vtime, &sdate, &stime);
+
+  sDateTime->date = cdiDate_set(sdate);
+  sDateTime->time = cdiTime_set(stime);
+
+  return cdiDateTime_set(vdate, vtime);
+}
+
+int
+cgribexScanTimestep1(stream_t *streamptr)
+{
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
+  int lmv = 0, iret = 0;
+  off_t recpos = 0;
+  void *gribbuffer = NULL;
+  size_t buffersize = 0;
+  int leveltype = 0, level1 = 0, level2 = 0;
+  unsigned recID;
+  int nrecsScanned = 0;
+  bool warn_time = true;
+  bool warn_numavg = true;
+  bool fcast = false;
+  char paramstr[32];
+
+  streamptr->curTsID = 0;
+
+  cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp;
+
+  int tsID = tstepsNewEntry(streamptr);
+  if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int fileID = streamptr->fileID;
+
+  if (CDI_Skip_Records) cgribexSkipRecords(fileID);
+
+  unsigned nrecs = 0;
+  while (true)
+    {
+      size_t recsize = gribGetSize(fileID);
+      recpos = fileGetPos(fileID);
+
+      if (recsize == 0)
+        {
+          if (nrecs == 0) Error("No GRIB records found!");
+          streamptr->ntsteps = 1;
+          break;
+        }
+
+      ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+      size_t readsize = recsize;
+      // Search for next 'GRIB', read the following record, and position file offset after it.
+      if (gribRead(fileID, gribbuffer, &readsize)) break;
+
+      int comptype = grbDecompress(recsize, &buffersize, &gribbuffer);
+
+      size_t sec2len = cgribexSection2Length(gribbuffer, buffersize);
+      if (sec2len > cgribexp->sec2len)
+        {
+          cgribexp->sec2len = sec2len;
+          cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int));
+        }
+
+      int *isec1 = cgribexp->sec1;
+
+      nrecsScanned++;
+      cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret);
+
+      int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255);
+      cdiParamToString(param, paramstr, sizeof(paramstr));
+
+      cgribexGetLevel(isec1, &leveltype, &level1, &level2);
+
+      CdiDateTime sDateTime;
+      CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
+
+      if (nrecs == 0)
+        {
+          vDateTime0 = vDateTime;
+          fcast = cgribexTimeIsFC(isec1);
+          taxis->unit = cgribexGetTimeUnit(isec1);
+          taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1));
+          taxis->sDateTime = sDateTime;
+          taxis->vDateTime = vDateTime;
+        }
+      else
+        {
+          if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+
+          size_t gridsize = cgribexGetGridsize(cgribexp->sec4);
+          compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize);
+          record_t *records = streamptr->tsteps[tsID].records;
+          for (recID = 0; recID < nrecs; recID++)
+            {
+              if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break;
+            }
+
+          if (CDI_Inventory_Mode == 1)
+            {
+              if (recID < nrecs) break;
+              if (warn_time)
+                if (cdiDateTime_isNE(vDateTime, vDateTime0))
+                  {
+                    gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, paramstr, level1, level2);
+                    warn_time = false;
+                  }
+            }
+          else
+            {
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
+
+              if (recID < nrecs)
+                {
+                  gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2);
+                  continue;
+                }
+            }
+        }
+
+      if (ISEC1_AvgNum)
+        {
+          if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum))
+            {
+              Warning("Changing numavg from %d to %d not supported!", taxis->numavg, ISEC1_AvgNum);
+              warn_numavg = false;
+            }
+          else
+            {
+              taxis->numavg = ISEC1_AvgNum;
+            }
+        }
+
+      nrecs++;
+
+      if (CDI_Debug)
+        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2,
+                CdiDateTime_string(vDateTime));
+
+      cgribexAddRecord(streamptr, cgribexp, param, recsize, recpos, comptype, lmv, iret);
+    }
+
+  streamptr->rtsteps = 1;
+
+  if (nrecs == 0) return CDI_EUFSTRUCT;
+
+  cdi_generate_vars(streamptr);
+
+  taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE;
+  int taxisID = taxisCreate(taxis->type);
+
+  int vlistID = streamptr->vlistID;
+  vlistDefTaxis(vlistID, taxisID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamptr->record->buffer = gribbuffer;
+  streamptr->record->buffersize = buffersize;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+  streamScanTimeConstAdjust(streamptr, taxis);
+
+  return 0;
+}
+
+int
+cgribexScanTimestep2(stream_t *streamptr)
+{
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
+  int lmv = 0, iret = 0;
+  off_t recpos = 0;
+  int leveltype = 0, level1 = 0, level2 = 0;
+  int recID = 0;
+  bool warn_numavg = true;
+  char paramstr[32];
+
+  streamptr->curTsID = 1;
+
+  cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp;
+  int *isec1 = cgribexp->sec1;
+  int *isec2 = cgribexp->sec2;
+
+  int fileID = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+
+  void *gribbuffer = streamptr->record->buffer;
+  size_t buffersize = streamptr->record->buffersize;
+
+  int tsID = streamptr->rtsteps;
+  if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+  cdi_create_records(streamptr, tsID);
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  int nrecords = streamScanInitRecords2(streamptr);
+
+  int nrecsScanned = nrecords;
+  int rindex = 0;
+  while (true)
+    {
+      if (rindex > nrecords) break;
+
+      size_t recsize = gribGetSize(fileID);
+      recpos = fileGetPos(fileID);
+      if (recsize == 0)
+        {
+          streamptr->ntsteps = 2;
+          break;
+        }
+
+      ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+      size_t readsize = recsize;
+      if (gribRead(fileID, gribbuffer, &readsize)) break;
+
+      grbDecompress(recsize, &buffersize, &gribbuffer);
+
+      nrecsScanned++;
+      cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret);
+
+      int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255);
+      cdiParamToString(param, paramstr, sizeof(paramstr));
+
+      cgribexGetLevel(isec1, &leveltype, &level1, &level2);
+
+      CdiDateTime sDateTime;
+      CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
+
+      if (rindex == 0)
+        {
+          vDateTime0 = vDateTime;
+          int taxisID = vlistInqTaxis(vlistID);
+          if (taxisInqType(taxisID) == TAXIS_RELATIVE)
+            {
+              taxis->type = TAXIS_RELATIVE;
+              taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1));
+            }
+          else
+            {
+              taxis->type = TAXIS_ABSOLUTE;
+            }
+          taxis->unit = cgribexGetTimeUnit(isec1);
+          taxis->vDateTime = vDateTime;
+          taxis->sDateTime = sDateTime;
+        }
+      else
+        {
+          if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+        }
+
+      int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange);
+
+      if (ISEC1_AvgNum)
+        {
+          if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum))
+            warn_numavg = false;
+          else
+            taxis->numavg = ISEC1_AvgNum;
+        }
+
+      size_t gridsize = cgribexGetGridsize(cgribexp->sec4);
+      compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize);
+
+      for (recID = 0; recID < nrecords; recID++)
+        {
+          if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break;
+        }
+
+      if (recID == nrecords)
+        {
+          gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2);
+          return CDI_EUFSTRUCT;
+        }
+
+      if (CDI_Inventory_Mode == 1)
+        {
+          if (records[recID].used)
+            {
+              break;
+            }
+          else
+            {
+              records[recID].used = true;
+              streamptr->tsteps[tsID].recIDs[rindex] = recID;
+            }
+        }
+      else
+        {
+          if (records[recID].used)
+            {
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
+
+              gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2);
+              continue;
+            }
+          else
+            {
+              records[recID].used = true;
+              streamptr->tsteps[tsID].recIDs[rindex] = recID;
+            }
+        }
+
+      if (CDI_Debug)
+        Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2,
+                CdiDateTime_string(vDateTime));
+
+      if (cgribexVarCompare(&compVar, &streamptr->tsteps[tsID].records[recID], 0) != 0)
+        {
+          Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                  records[recID].ilevel, level1);
+          return CDI_EUFSTRUCT;
+        }
+
+      records[recID].position = recpos;
+      records[recID].size = recsize;
+
+      int varID = records[recID].varID;
+      int gridID = vlistInqVarGrid(vlistID, varID);
+      if (gridInqSize(gridID) == 1 && gridInqType(gridID) == GRID_LONLAT)
+        {
+          if (IS_NOT_EQUAL(gridInqXval(gridID, 0), ISEC2_FirstLon * 0.001)
+              || IS_NOT_EQUAL(gridInqYval(gridID, 0), ISEC2_FirstLat * 0.001))
+            gridChangeType(gridID, GRID_TRAJECTORY);
+        }
+
+      if (tsteptype != TSTEP_INSTANT2 && tsteptype != vlistInqVarTsteptype(vlistID, varID))
+        vlistDefVarTsteptype(vlistID, varID, tsteptype);
+
+      rindex++;
+    }
+
+  int nrecs = 0;
+  for (recID = 0; recID < nrecords; recID++)
+    {
+      if (records[recID].used)
+        nrecs++;
+      else
+        vlistDefVarTimetype(vlistID, records[recID].varID, TIME_CONSTANT);
+    }
+  streamptr->tsteps[tsID].nrecs = nrecs;
+
+  streamptr->rtsteps = 2;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+
+  streamptr->record->buffer = gribbuffer;
+  streamptr->record->buffersize = buffersize;
+
+  return 0;
+}
+
+int
+cgribexScanTimestep(stream_t *streamptr)
+{
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
+  int lmv = 0, iret = 0;
+  off_t recpos = 0;
+  int leveltype = 0, level1 = 0, level2 = 0;
+  int vrecID, recID = 0;
+  bool warn_numavg = true;
+  int nrecs = 0;
+  char paramstr[32];
+
+  cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp;
+  int *isec1 = cgribexp->sec1;
+
+  int tsID = streamptr->rtsteps;
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  if (streamptr->tsteps[tsID].recordSize == 0)
+    {
+      void *gribbuffer = streamptr->record->buffer;
+      size_t buffersize = streamptr->record->buffersize;
+
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      nrecs = streamScanInitRecords(streamptr, tsID);
+
+      int fileID = streamptr->fileID;
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+      int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1);
+      int rindex = 0;
+      while (true)
+        {
+          if (rindex > nrecs) break;
+
+          size_t recsize = gribGetSize(fileID);
+          recpos = fileGetPos(fileID);
+          if (recsize == 0)
+            {
+              streamptr->ntsteps = streamptr->rtsteps + 1;
+              break;
+            }
+
+          ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+          size_t readsize = recsize;
+          if (gribRead(fileID, gribbuffer, &readsize))
+            {
+              Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize);
+              break;
+            }
+
+          grbDecompress(recsize, &buffersize, &gribbuffer);
+
+          nrecsScanned++;
+          cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret);
+
+          int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255);
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+
+          cgribexGetLevel(isec1, &leveltype, &level1, &level2);
+
+          CdiDateTime sDateTime;
+          CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime);
+
+          if (rindex == nrecs) break;
+
+          if (rindex == 0)
+            {
+              vDateTime0 = vDateTime;
+              int vlistID = streamptr->vlistID;
+              int taxisID = vlistInqTaxis(vlistID);
+              if (taxisInqType(taxisID) == TAXIS_RELATIVE)
+                {
+                  taxis->type = TAXIS_RELATIVE;
+                  taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1));
+                }
+              else
+                {
+                  taxis->type = TAXIS_ABSOLUTE;
+                }
+              taxis->unit = cgribexGetTimeUnit(isec1);
+              taxis->vDateTime = vDateTime;
+              taxis->sDateTime = sDateTime;
+            }
+          else
+            {
+              if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+            }
+
+          if (ISEC1_AvgNum)
+            {
+              if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum))
+                warn_numavg = false;
+              else
+                taxis->numavg = ISEC1_AvgNum;
+            }
+
+          size_t gridsize = cgribexGetGridsize(cgribexp->sec4);
+          compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize);
+
+          for (vrecID = 0; vrecID < nrecs; vrecID++)
+            {
+              recID = streamptr->tsteps[1].recIDs[vrecID];
+              if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break;
+            }
+
+          if (vrecID == nrecs)
+            {
+              gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2);
+
+              if (CDI_Inventory_Mode == 1)
+                return CDI_EUFSTRUCT;
+              else
+                continue;
+            }
+
+          if (CDI_Inventory_Mode == 1)
+            {
+              records[recID].used = true;
+              streamptr->tsteps[tsID].recIDs[rindex] = recID;
+            }
+          else
+            {
+              if (records[recID].used)
+                {
+                  char paramstr_[32];
+                  cdiParamToString(param, paramstr_, sizeof(paramstr_));
+
+                  if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
+
+                  if (CDI_Debug)
+                    gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr_, level1, level2);
+
+                  continue;
+                }
+              else
+                {
+                  records[recID].used = true;
+                  streamptr->tsteps[tsID].recIDs[rindex] = recID;
+                }
+            }
+
+          if (CDI_Debug)
+            Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2,
+                    CdiDateTime_string(vDateTime));
+
+          if (cgribexVarCompare(&compVar, &records[recID], 0) != 0)
+            {
+              Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                      records[recID].ilevel, level1);
+              Error("Invalid, unsupported or inconsistent record structure");
+            }
+
+          records[recID].position = recpos;
+          records[recID].size = recsize;
+
+          rindex++;
+        }
+
+      for (vrecID = 0; vrecID < nrecs; vrecID++)
+        {
+          recID = streamptr->tsteps[tsID].recIDs[vrecID];
+          if (!records[recID].used) break;
+        }
+
+      if (vrecID < nrecs)
+        {
+          cdiParamToString(records[recID].param, paramstr, sizeof(paramstr));
+          gribWarning("Parameter not found!", nrecsScanned, tsID + 1, paramstr, records[recID].ilevel, records[recID].ilevel2);
+          return CDI_EUFSTRUCT;
+        }
+
+      streamptr->rtsteps++;
+
+      if (streamptr->ntsteps != streamptr->rtsteps)
+        {
+          tsID = tstepsNewEntry(streamptr);
+          if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+          streamptr->tsteps[tsID - 1].next = true;
+          streamptr->tsteps[tsID].position = recpos;
+        }
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+      streamptr->tsteps[tsID].position = recpos;
+
+      streamptr->record->buffer = gribbuffer;
+      streamptr->record->buffersize = buffersize;
+    }
+
+  if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs)
+    {
+      Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID);
+      streamptr->ntsteps = tsID;
+    }
+
+  /* this will need work for files containing more than INT_MAX timesteps! */
+  assert(streamptr->ntsteps <= INT_MAX);
+  return (int) streamptr->ntsteps;
+}
+
+#ifdef gribWarning
+#undef gribWarning
+#endif
+
+int
+cgribexDecode(int memtype, void *cgribex, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced,
+              size_t *numMissVals, double missval)
+{
+  int status = 0;
+
+  bool lalloc = cgribex == NULL;
+  cgribexrec_t *cgribexp = (cgribexrec_t *) (lalloc ? cgribexNew() : cgribex);
+
+  int *isec0 = cgribexp->sec0;
+  int *isec1 = cgribexp->sec1;
+  int *isec2 = cgribexp->sec2;
+  int *isec3 = cgribexp->sec3;
+  int *isec4 = cgribexp->sec4;
+  double *fsec2 = cgribexp->fsec2;
+  double *fsec3 = cgribexp->fsec3;
+  float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)];
+  float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)];
+
+  char hoper[2];
+  strcpy(hoper, unreduced ? "R" : "D");
+
+  FSEC3_MissVal = missval;
+
+  int iret = 0, iword = 0;
+  if (memtype == MEMTYPE_FLOAT)
+    gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, (int) gribsize,
+             &iword, hoper, &iret);
+  else
+    gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, (int) gribsize,
+             &iword, hoper, &iret);
+
+  *numMissVals = (ISEC1_Sec2Or3Flag & 64) ? (size_t) ISEC4_NumValues - (size_t) ISEC4_NumNonMissValues : 0;
+
+  if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255))
+    {
+      double undef_pds, undef_eps;
+      MCH_get_undef(isec1, &undef_pds, &undef_eps);
+
+      *numMissVals = 0;
+      if (memtype == MEMTYPE_FLOAT)
+        {
+          float *restrict dataf = (float *) data;
+          for (size_t i = 0; i < datasize; i++)
+            if ((fabs(dataf[i] - undef_pds) < undef_eps) || IS_EQUAL(dataf[i], FSEC3_MissVal))
+              {
+                dataf[i] = (float) missval;
+                (*numMissVals)++;
+              }
+        }
+      else
+        {
+          double *restrict datad = (double *) data;
+          for (size_t i = 0; i < datasize; i++)
+            if ((fabs(datad[i] - undef_pds) < undef_eps) || IS_EQUAL(datad[i], FSEC3_MissVal))
+              {
+                datad[i] = missval;
+                (*numMissVals)++;
+              }
+        }
+    }
+
+  if (lalloc) cgribexDelete(cgribexp);
+
+  return status;
+}
+
+static void
+cgribexDefInstitut(int *isec1, int vlistID, int varID)
+{
+  int instID = (vlistInqInstitut(vlistID) != CDI_UNDEFID) ? vlistInqInstitut(vlistID) : vlistInqVarInstitut(vlistID, varID);
+  if (instID != CDI_UNDEFID)
+    {
+      ISEC1_CenterID = institutInqCenter(instID);
+      ISEC1_SubCenterID = institutInqSubcenter(instID);
+    }
+}
+
+static void
+cgribexDefModel(int *isec1, int vlistID, int varID)
+{
+  int modelID = (vlistInqModel(vlistID) != CDI_UNDEFID) ? vlistInqModel(vlistID) : vlistInqVarModel(vlistID, varID);
+  if (modelID != CDI_UNDEFID) ISEC1_ModelID = modelInqGribID(modelID);
+}
+
+static void
+cgribexDefParam(int *isec1, int param)
+{
+  int pdis, pcat, pnum;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+  if (pnum < 0) pnum = -pnum;
+
+  static bool lwarn_pdis = true;
+  if (pdis != 255 && lwarn_pdis)
+    {
+      char paramstr[32];
+      cdiParamToString(param, paramstr, sizeof(paramstr));
+      Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat);
+      lwarn_pdis = false;
+    }
+
+  static bool lwarn_pnum = true;
+  if (pnum > 255 && lwarn_pnum)
+    {
+      Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256);
+      lwarn_pnum = false;
+      pnum = pnum % 256;
+    }
+
+  ISEC1_CodeTable = pcat;
+  ISEC1_Parameter = pnum;
+}
+
+static int
+cgribexDefTimerange(int tsteptype, int factor, int calendar, CdiDateTime rDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime,
+                    int *pip1, int *pip2)
+{
+  JulianDate julianDate1 = julianDate_encode(calendar, rDateTime);
+  JulianDate julianDate2 = julianDate_encode(calendar, vDateTime);
+  JulianDate julianDate = julianDate_sub(julianDate2, julianDate1);
+
+  int timerange = -1;
+  int ip1 = 0, ip2 = 0;
+  if (!(int) (fmod(julianDate_to_seconds(julianDate), factor)))
+    {
+      int ip = (int) lround(julianDate_to_seconds(julianDate) / factor);
+      if ((ip > 255) && (tsteptype == TSTEP_INSTANT)) tsteptype = TSTEP_INSTANT3;
+
+      int ipx = 0;
+      if (!cdiDateTime_isNull(sDateTime)
+          && (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF))
+        {
+          julianDate2 = julianDate_encode(calendar, sDateTime);
+          ipx = (int) lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor);
+        }
+
+      // clang-format off
+      switch (tsteptype)
+	{
+	case TSTEP_INSTANT:  timerange =  0; ip1 = ip;  ip2 = 0;  break;
+	case TSTEP_INSTANT2: timerange =  1; ip1 = 0;   ip2 = 0;  break;
+	case TSTEP_RANGE:    timerange =  2; ip1 = 0;   ip2 = ip; break;
+	case TSTEP_AVG:      timerange =  3; ip1 = 0;   ip2 = ip; break;
+	case TSTEP_ACCUM:    timerange =  4; ip1 = ipx; ip2 = ip; break;
+	case TSTEP_DIFF:     timerange =  5; ip1 = 0;   ip2 = ip; break;
+	case TSTEP_INSTANT3:
+	default:             timerange = 10; ip1 = ip/256; ip2 = ip%256; break;
+	}
+      // clang-format on
+    }
+
+  *pip1 = ip1;
+  *pip2 = ip2;
+
+  return timerange;
+}
+
+static int
+cgribexDefDateTime(int *isec1, int timeunit, CdiDateTime dt)
+{
+  int year, month, day, hour, minute, second, ms;
+  cdiDate_decode(dt.date, &year, &month, &day);
+  cdiTime_decode(dt.time, &hour, &minute, &second, &ms);
+
+  int century = year / 100;
+  ISEC1_Year = year - century * 100;
+
+  if (year < 0)
+    {
+      century = -century;
+      ISEC1_Year = -ISEC1_Year;
+    }
+
+  if (ISEC1_Year == 0)
+    {
+      century -= 1;
+      ISEC1_Year = 100;
+    }
+
+  century += 1;
+  if (year < 0) century = -century;
+
+  ISEC1_Month = month;
+  ISEC1_Day = day;
+  ISEC1_Hour = hour;
+  ISEC1_Minute = minute;
+
+  ISEC1_Century = century;
+
+  int factor = 1;
+  // clang-format off
+  switch (timeunit)
+    {
+    case TUNIT_MINUTE:    factor =    60; ISEC1_TimeUnit = ISEC1_TABLE4_MINUTE;    break;
+    case TUNIT_QUARTER:   factor =   900; ISEC1_TimeUnit = ISEC1_TABLE4_QUARTER;   break;
+    case TUNIT_30MINUTES: factor =  1800; ISEC1_TimeUnit = ISEC1_TABLE4_30MINUTES; break;
+    case TUNIT_HOUR:      factor =  3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR;      break;
+    case TUNIT_3HOURS:    factor = 10800; ISEC1_TimeUnit = ISEC1_TABLE4_3HOURS;    break;
+    case TUNIT_6HOURS:    factor = 21600; ISEC1_TimeUnit = ISEC1_TABLE4_6HOURS;    break;
+    case TUNIT_12HOURS:   factor = 43200; ISEC1_TimeUnit = ISEC1_TABLE4_12HOURS;   break;
+    case TUNIT_DAY:       factor = 86400; ISEC1_TimeUnit = ISEC1_TABLE4_DAY;       break;
+    default:              factor =  3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR;      break;
+    }
+  // clang-format on
+
+  return factor;
+}
+
+static void
+cgribexDefTime(int *isec1, CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID)
+{
+  int timetype = TAXIS_ABSOLUTE;
+  int timeunit = TUNIT_HOUR;
+
+  if (taxisID != -1)
+    {
+      timetype = taxisInqType(taxisID);
+      timeunit = taxisInqTunit(taxisID);
+    }
+
+  if (timetype == TAXIS_RELATIVE)
+    {
+      int ip1 = 0, ip2 = 0;
+      int calendar = taxisInqCalendar(taxisID);
+
+      CdiDateTime rDateTime = taxisInqRdatetime(taxisID);
+      if (cdiDateTime_isLT(vDateTime, rDateTime)) rDateTime = vDateTime;
+
+      CdiDateTime sDateTime = taxisInqSdatetime(taxisID);
+
+      int factor = cgribexDefDateTime(isec1, timeunit, rDateTime);
+      int timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2);
+
+      if (ip2 > 0xFF)
+        {
+          rDateTime = vDateTime;
+          factor = cgribexDefDateTime(isec1, timeunit, rDateTime);
+          timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2);
+        }
+      /*
+      if (ip2 > 0xFF && timeunit < TUNIT_YEAR)
+        {
+          timeunit++;
+          factor = cgribexDefDateTime(isec1, timeunit, rDateTime);
+          timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2);
+        }
+      */
+      if (timerange == -1 || timerange == 1 || timerange == 3) timetype = TAXIS_ABSOLUTE;
+      /*
+      else if (timerange == 10)
+        {
+          if (ip1 < 0 || ip1 > 0xFFFF) timetype = TAXIS_ABSOLUTE;
+          if (ip2 < 0 || ip2 > 0xFFFF) timetype = TAXIS_ABSOLUTE;
+        }
+      */
+      else
+        {
+          if (ip1 < 0 || ip1 > 0xFF) timetype = TAXIS_ABSOLUTE;
+          if (ip2 < 0 || ip2 > 0xFF) timetype = TAXIS_ABSOLUTE;
+        }
+
+      if (timetype != TAXIS_ABSOLUTE)
+        {
+          ISEC1_TimeRange = timerange;
+          ISEC1_TimePeriod1 = ip1;
+          ISEC1_TimePeriod2 = ip2;
+        }
+    }
+
+  if (timetype == TAXIS_ABSOLUTE)
+    {
+      (void) cgribexDefDateTime(isec1, timeunit, vDateTime);
+
+      /*
+      if (numavg > 0)
+        ISEC1_TimeRange = 0;
+      else
+      */
+      if (ISEC1_TimeRange != 3) ISEC1_TimeRange = 10;
+
+      ISEC1_TimePeriod1 = 0;
+      ISEC1_TimePeriod2 = 0;
+    }
+
+  ISEC1_AvgNum = numavg;
+  ISEC1_AvgMiss = 0;
+  ISEC1_DecScaleFactor = 0;
+}
+
+static void
+cgribexDefGridRegular(int *isec2, double *fsec2, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear,
+                      int uvRelativeToGrid)
+{
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
+    ISEC2_GridType = GRIB1_GTYPE_GAUSSIAN;
+  else if (gridtype == GRID_LONLAT && gridIsRotated)
+    ISEC2_GridType = GRIB1_GTYPE_LATLON_ROT;
+  else
+    ISEC2_GridType = GRIB1_GTYPE_LATLON;
+
+  double xfirst = 0.0, xlast = 0.0, xinc = 0.0;
+  double yfirst = 0.0, ylast = 0.0, yinc = 0.0;
+
+  int nlon = (int) gridInqXsize(gridID);
+  int nlat = (int) gridInqYsize(gridID);
+
+  if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      ISEC2_Reduced = true;
+      if (nlon == 2)
+        {
+          xfirst = gridInqXval(gridID, 0);
+          xlast = gridInqXval(gridID, 1);
+        }
+      else
+        {
+          xlast = 360.0 - 360.0 / (nlat * 2);
+        }
+
+      nlon = 0;
+      gridInqReducedPoints(gridID, ISEC2_ReducedPointsPtr);
+    }
+  else
+    {
+      if (nlon == 0)
+        nlon = 1;
+      else
+        {
+          xfirst = gridInqXval(gridID, 0);
+          xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1);
+          xinc = fabs(gridInqXinc(gridID));
+        }
+    }
+
+  if (nlat == 0)
+    nlat = 1;
+  else
+    {
+      yfirst = gridInqYval(gridID, 0);
+      ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1);
+      yinc = fabs(gridInqYinc(gridID));
+    }
+
+  ISEC2_NumLon = nlon;
+  ISEC2_NumLat = nlat;
+  ISEC2_FirstLat = (int) lround(yfirst * 1000);
+  ISEC2_LastLat = (int) lround(ylast * 1000);
+  ISEC2_FirstLon = (int) lround(xfirst * 1000);
+  ISEC2_LastLon = (int) lround(xlast * 1000);
+  // gribapi gridType detector doesn't like lonIncr for Gaussian reduced longitides
+  if (gridtype != GRID_GAUSSIAN_REDUCED) ISEC2_LonIncr = (int) lround(xinc * 1000);
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      int np = gridInqNP(gridID);
+      if (np == 0) np = nlat / 2;
+      ISEC2_NumPar = np;
+    }
+  else
+    {
+      ISEC2_LatIncr = (int) lround(yinc * 1000);
+    }
+
+  if (ISEC2_NumLon > 1 && ISEC2_NumLat == 1)
+    if (ISEC2_LonIncr != 0 && ISEC2_LatIncr == 0) ISEC2_LatIncr = ISEC2_LonIncr;
+
+  if (ISEC2_NumLon == 1 && ISEC2_NumLat > 1)
+    if (ISEC2_LonIncr == 0 && ISEC2_LatIncr != 0) ISEC2_LonIncr = ISEC2_LatIncr;
+
+  ISEC2_ResFlag = 0;
+  if (ISEC2_LatIncr && ISEC2_LonIncr) gribbyte_set_bit(&ISEC2_ResFlag, 1);
+  if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5);
+
+  if (gridIsRotated)
+    {
+      double xpole = 0, ypole = 0, angle = 0;
+      gridInqParamRLL(gridID, &xpole, &ypole, &angle);
+
+      ISEC2_LatSP = -(int) lround(ypole * 1000);
+      ISEC2_LonSP = (int) lround((xpole + 180) * 1000);
+      if (fabs(angle) > 0) angle = -angle;
+      FSEC2_RotAngle = angle;
+    }
+
+  ISEC2_ScanFlag = 0;
+  if (ISEC2_LastLon < ISEC2_FirstLon) gribbyte_set_bit(&ISEC2_ScanFlag, 1);  // East -> West
+  if (ISEC2_LastLat > ISEC2_FirstLat) gribbyte_set_bit(&ISEC2_ScanFlag, 2);  // South -> North
+}
+
+static void
+cgribexDefGridLambert(int *isec2, int gridID, int uvRelativeToGrid)
+{
+  int xsize = (int) gridInqXsize(gridID);
+  int ysize = (int) gridInqYsize(gridID);
+
+  struct CDI_GridProjParams gpp;
+  gridInqParamsLCC(gridID, &gpp);
+  if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv)))
+    {
+      gpp.x_0 = gridInqXval(gridID, 0);
+      gpp.y_0 = gridInqYval(gridID, 0);
+    }
+  gridVerifyProjParamsLCC(&gpp);
+
+  bool lsouth = (gpp.lat_1 < 0);
+  if (lsouth)
+    {
+      gpp.lat_1 = -gpp.lat_2;
+      gpp.lat_2 = -gpp.lat_2;
+    }
+
+  double xinc = gridInqXinc(gridID);
+  double yinc = gridInqYinc(gridID);
+  if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID);
+  if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID);
+
+  ISEC2_GridType = GRIB1_GTYPE_LCC;
+  ISEC2_NumLon = xsize;
+  ISEC2_NumLat = ysize;
+  ISEC2_FirstLon = (int) lround(gpp.xval_0 * 1000);
+  ISEC2_FirstLat = (int) lround(gpp.yval_0 * 1000);
+  ISEC2_Lambert_Lov = (int) lround(gpp.lon_0 * 1000);
+  ISEC2_Lambert_LatS1 = (int) lround(gpp.lat_1 * 1000);
+  ISEC2_Lambert_LatS2 = (int) lround(gpp.lat_2 * 1000);
+  ISEC2_Lambert_dx = (int) lround(xinc);
+  ISEC2_Lambert_dy = (int) lround(yinc);
+  ISEC2_Lambert_LatSP = 0;
+  ISEC2_Lambert_LonSP = 0;
+  ISEC2_Lambert_ProjFlag = 0;
+  if (lsouth) gribbyte_set_bit(&ISEC2_Lambert_ProjFlag, 1);
+
+  bool earthIsOblate = (IS_EQUAL(gpp.a, 6378160.0) && IS_EQUAL(gpp.rf, 297.0));
+  ISEC2_ResFlag = 0;
+  if (ISEC2_Lambert_dx && ISEC2_Lambert_dy) gribbyte_set_bit(&ISEC2_ResFlag, 1);
+  if (earthIsOblate) gribbyte_set_bit(&ISEC2_ResFlag, 2);
+  if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5);
+
+  ISEC2_ScanFlag = 0;
+  gribbyte_set_bit(&ISEC2_ScanFlag, 2);  // South -> North
+}
+
+static void
+cgribexDefGridSpectal(int *isec2, int *isec4, int gridID)
+{
+  ISEC2_GridType = GRIB1_GTYPE_SPECTRAL;
+  ISEC2_PentaJ = gridInqTrunc(gridID);
+  ISEC2_PentaK = ISEC2_PentaJ;
+  ISEC2_PentaM = ISEC2_PentaJ;
+  ISEC2_RepType = 1;
+  isec4[2] = 128;
+  if (gridInqComplexPacking(gridID) && ISEC2_PentaJ >= 21)
+    {
+      ISEC2_RepMode = 2;
+      isec4[3] = 64;
+      isec4[16] = 0;
+      isec4[17] = 20;
+      isec4[18] = 20;
+      isec4[19] = 20;
+    }
+  else
+    {
+      ISEC2_RepMode = 1;
+      isec4[3] = 0;
+    }
+}
+
+static void
+cgribexDefGridGME(int *isec2, int gridID)
+{
+  ISEC2_GridType = GRIB1_GTYPE_GME;
+  int nd = 0, ni = 0, ni2 = 0, ni3 = 0;
+  gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3);
+  ISEC2_GME_ND = nd;
+  ISEC2_GME_NI = ni;
+  ISEC2_GME_NI2 = ni2;
+  ISEC2_GME_NI3 = ni3;
+  ISEC2_GME_AFlag = 0;
+  ISEC2_GME_LatPP = 90000;
+  ISEC2_GME_LonPP = 0;
+  ISEC2_GME_LonMPL = 0;
+  ISEC2_GME_BFlag = 0;
+}
+
+static void
+cgribexDefGrid(int *isec1, int *isec2, double *fsec2, int *isec4, int gridID, int uvRelativeToGrid)
+{
+  fill_intarr(isec2, 0, 16);
+  ISEC1_Sec2Or3Flag = 128;
+  ISEC1_GridDefinition = 255;
+  ISEC2_Reduced = false;
+  ISEC2_ScanFlag = 0;
+
+  SizeType gridsize = gridInqSize(gridID);
+  bool gridIsRotated = false;
+  bool gridIsCurvilinear = false;
+  int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear);
+
+  switch (gridtype)
+    {
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_GAUSSIAN_REDUCED:
+    case GRID_TRAJECTORY:
+      {
+        cgribexDefGridRegular(isec2, fsec2, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid);
+        break;
+      }
+    case CDI_PROJ_LCC:
+      {
+        cgribexDefGridLambert(isec2, gridID, uvRelativeToGrid);
+        break;
+      }
+    case GRID_SPECTRAL:
+      {
+        cgribexDefGridSpectal(isec2, isec4, gridID);
+        break;
+      }
+    case GRID_GME:
+      {
+        cgribexDefGridGME(isec2, gridID);
+        break;
+      }
+    case GRID_GENERIC:
+      {
+        ISEC1_Sec2Or3Flag = 0;
+        break;
+      }
+    case CDI_PROJ_HEALPIX:
+      {
+        Error("CGRIBEX library doesn't support HEALPix grids!");
+        break;
+      }
+    default:
+      {
+        static bool lwarn = true;
+        ISEC1_Sec2Or3Flag = 0;
+        if (lwarn) Warning("CGRIBEX library doesn't support %s grids, grid information will be lost!", gridNamePtr(gridtype));
+        lwarn = false;
+        break;
+      }
+    }
+}
+
+static int
+level2int(double level)
+{
+  return (int) round(level);
+}
+
+static void
+isec1DefLevel(int *isec1, int leveltype, int level1, int level2)
+{
+  ISEC1_LevelType = leveltype;
+  ISEC1_Level1 = level1;
+  ISEC1_Level2 = level2;
+}
+
+static void
+cgribexDefLevel(int *isec1, int *isec2, double *fsec2, int zaxisID, int levelID)
+{
+  int zaxistype = zaxisInqType(zaxisID);
+  int ltype = 0;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype);
+
+  bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL));
+  double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1;
+  double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level;
+  double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0;
+
+  if (zaxistype == ZAXIS_GENERIC && ltype == 0)
+    {
+      Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE));
+      zaxistype = ZAXIS_PRESSURE;
+      zaxisChangeType(zaxisID, zaxistype);
+      cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa");
+    }
+
+  ISEC2_NumVCP = 0;
+
+  int grib_ltype = zaxisTypeToGrib1ltype(zaxistype);
+
+  switch (zaxistype)
+    {
+    case ZAXIS_SURFACE:
+    case ZAXIS_MEANSEA:
+    case ZAXIS_ALTITUDE:
+    case ZAXIS_DEPTH_BELOW_SEA:
+    case ZAXIS_ISENTROPIC:
+      {
+        isec1DefLevel(isec1, grib_ltype, level2int(level), 0);
+        break;
+      }
+    case ZAXIS_CLOUD_BASE:
+    case ZAXIS_CLOUD_TOP:
+    case ZAXIS_ISOTHERM_ZERO:
+    case ZAXIS_TROPOPAUSE:
+    case ZAXIS_TOA:
+    case ZAXIS_SEA_BOTTOM:
+    case ZAXIS_ATMOSPHERE:
+      {
+        isec1DefLevel(isec1, grib_ltype, 0, 0);
+        break;
+      }
+    case ZAXIS_HYBRID:
+    case ZAXIS_HYBRID_HALF:
+      {
+        grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID;
+        isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2));
+
+        int vctsize = zaxisInqVctSize(zaxisID);
+        if (vctsize > 255)
+          {
+            static bool lwarning_vct = true;
+            ISEC2_NumVCP = 0;
+            if (lwarning_vct)
+              {
+                Warning("VCT size of %d is too large (maximum is 255). Set to 0!", vctsize);
+                lwarning_vct = false;
+              }
+          }
+        else
+          {
+            ISEC2_NumVCP = vctsize;
+            zaxisInqVct(zaxisID, &fsec2[10]);
+          }
+        break;
+      }
+    case ZAXIS_PRESSURE:
+      {
+        if (level < 0) Warning("Pressure level of %f Pa is below zero!", level);
+
+        if (!zaxis_units_is_Pa(zaxisID)) level *= 100.0;
+
+        double dum;
+        if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0))
+          grib_ltype = GRIB1_LTYPE_ISOBARIC_PA;
+        else
+          level = level / 100;
+
+        static bool lwarn = true;
+        if (lwarn && modf(level, &dum) > 0.001)
+          {
+            lwarn = false;
+            Message("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level, level2int(level));
+          }
+
+        isec1DefLevel(isec1, grib_ltype, level2int(level), 0);
+        break;
+      }
+    case ZAXIS_HEIGHT:
+      {
+        double sf = zaxis_units_to_meter(zaxisID);
+        isec1DefLevel(isec1, grib_ltype, level2int(level * sf), 0);
+        break;
+      }
+    case ZAXIS_SIGMA:
+      {
+        grib_ltype = hasBounds ? GRIB1_LTYPE_SIGMA_LAYER : GRIB1_LTYPE_SIGMA;
+        isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2));
+        break;
+      }
+    case ZAXIS_DEPTH_BELOW_LAND:
+      {
+        grib_ltype = hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH;
+        double sf = zaxis_units_to_centimeter(zaxisID);
+        isec1DefLevel(isec1, grib_ltype, level2int(sf * dlevel1), level2int(sf * dlevel2));
+        break;
+      }
+    case ZAXIS_GENERIC:
+      {
+        isec1DefLevel(isec1, ltype, level2int(level), 0);
+        break;
+      }
+    default:
+      {
+        Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype));
+        break;
+      }
+    }
+}
+
+static void
+cgribexDefaultSec0(int *isec0)
+{
+  ISEC0_GRIB_Len = 0;
+  ISEC0_GRIB_Version = 0;
+}
+
+static void
+cgribexDefaultSec1(int *isec1)
+{
+  ISEC1_CenterID = 0;
+  ISEC1_SubCenterID = 0;
+  ISEC1_LocalFLag = 0;
+}
+
+static void
+cgribexDefaultSec4(int *isec4)
+{
+  for (int i = 2; i <= 10; ++i) isec4[i] = 0;
+}
+
+static void
+cgribexDefEnsembleVar(int *isec1, int vlistID, int varID)
+{
+  // For Ensemble info
+
+  // Put1Byte(isec1[36]);        // MPIM local GRIB use definition identifier (extension identifier)
+  // Put1Byte(isec1[37]);        // type of ensemble forecast
+  // Put2Byte(isec1[38]);        // individual ensemble member
+  // Put2Byte(isec1[39]);        // number of forecasts in ensemble
+
+  if (ISEC1_CenterID == 252)
+    {
+      int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast;
+      int r1 = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber);
+      int r2 = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble);
+      int r3 = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast);
+
+      if (r1 == 0 && r2 == 0 && r3 == 0)
+        {
+          ISEC1_LocalFLag = 1;
+          isec1[36] = 1;
+          isec1[37] = typeOfEnsembleForecast;
+          isec1[38] = perturbationNumber;
+          isec1[39] = numberOfForecastsInEnsemble;
+        }
+    }
+}
+
+size_t
+cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype,
+              int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer, size_t gribbuffersize)
+{
+  cgribexrec_t *cgribexp = (cgribexrec_t *) cgribexNew();
+
+  size_t sec2len = 1024 + 2 * (size_t) gridInqYsize(gridID);  // Gaussian reduced grid
+  if (sec2len > cgribexp->sec2len)
+    {
+      cgribexp->sec2len = sec2len;
+      cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int));
+    }
+
+  int *isec0 = cgribexp->sec0;
+  int *isec1 = cgribexp->sec1;
+  int *isec2 = cgribexp->sec2;
+  int *isec3 = cgribexp->sec3;
+  int *isec4 = cgribexp->sec4;
+  double *fsec2 = cgribexp->fsec2;
+  double *fsec3 = cgribexp->fsec3;
+  float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)];
+  float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)];
+
+  fill_intarr(isec1, 0, 256);
+  fsec2[0] = 0;
+  fsec2[1] = 0;
+  fsec2f[0] = 0;
+  fsec2f[1] = 0;
+
+  int gribsize = (int) (gribbuffersize / sizeof(int));
+  int param = vlistInqVarParam(vlistID, varID);
+
+  cgribexDefaultSec0(isec0);
+  cgribexDefaultSec1(isec1);
+  cgribexDefaultSec4(isec4);
+
+  cgribexDefInstitut(isec1, vlistID, varID);
+  cgribexDefModel(isec1, vlistID, varID);
+
+  int datatype = vlistInqVarDatatype(vlistID, varID);
+
+  int uvRelativeToGrid = -1;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid);
+
+  cgribexDefParam(isec1, param);
+  cgribexDefTime(isec1, vDateTime, tsteptype, numavg, vlistInqTaxis(vlistID));
+  cgribexDefGrid(isec1, isec2, fsec2, isec4, gridID, uvRelativeToGrid);
+  cgribexDefLevel(isec1, isec2, fsec2, zaxisID, levelID);
+
+  cgribexDefEnsembleVar(isec1, vlistID, varID);
+
+  cdi_check_gridsize_int_limit("GRIB1", datasize);
+
+  ISEC4_NumValues = (int) datasize;
+  ISEC4_NumBits = grbBitsPerValue(datatype);
+
+  if (numMissVals > 0)
+    {
+      FSEC3_MissVal = vlistInqVarMissval(vlistID, varID);
+      ISEC1_Sec2Or3Flag |= 64;
+    }
+
+  if (isec4[2] == 128 && isec4[3] == 64)
+    {
+      if (memtype == MEMTYPE_FLOAT)
+        isec4[16] = (int) (1000 * calculate_pfactor_float((const float *) data, ISEC2_PentaJ, isec4[17]));
+      else
+        isec4[16] = (int) (1000 * calculate_pfactor_double((const double *) data, ISEC2_PentaJ, isec4[17]));
+      if (isec4[16] < -10000) isec4[16] = -10000;
+      if (isec4[16] > 10000) isec4[16] = 10000;
+    }
+  // printf("isec4[16] %d\n", isec4[16]);
+
+  if (memtype == MEMTYPE_FLOAT)
+    {
+      int numVCP = (ISEC2_NumVCP > 0) ? ISEC2_NumVCP : 0;
+      for (int i = 0; i < numVCP; ++i) fsec2f[10 + i] = (float) fsec2[10 + i];
+      fsec3f[1] = (float) fsec3[1];
+    }
+
+  int iret = 0, iword = 0;
+  if (memtype == MEMTYPE_FLOAT)
+    gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, gribsize,
+             &iword, "C", &iret);
+  else
+    gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, gribsize, &iword,
+             "C", &iret);
+
+  cgribexDelete(cgribexp);
+
+  if (iret) Error("Problem during GRIB encode (errno = %d)!", iret);
+
+  size_t nbytes = (size_t) iword * sizeof(int);
+  return nbytes;
+}
+
+void
+cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev)
+{
+  if (!gh) return;
+
+  unsigned char *pds = ((cgribex_handle *) gh)->pds;
+  if (!pds) return;
+
+  pds[8] = (unsigned char) code;
+  pds[9] = (unsigned char) ltype;
+  pds[10] = (unsigned char) lev;
+}
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+
+#ifdef HAVE_LIBEXTRA
+
+static int
+extInqDatatype(int prec, int number)
+{
+  if (number == 2)
+    return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32;
+  else
+    return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+}
+
+static void
+extDefDatatype(int datatype, int *prec, int *number)
+{
+  if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64 && datatype != CDI_DATATYPE_CPX32
+      && datatype != CDI_DATATYPE_CPX64)
+    datatype = CDI_DATATYPE_FLT32;
+
+  *number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? 2 : 1;
+
+  *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
+}
+
+/* not used
+int extInqRecord(stream_t *streamptr, int *varID, int *levelID)
+{
+  int status;
+  int fileID;
+  int icode, ilevel;
+  int zaxisID = -1;
+  int header[4];
+  int vlistID;
+  void *extp = streamptr->record->objectp;
+
+  vlistID = streamptr->vlistID;
+  fileID  = streamptr->fileID;
+
+  *varID   = -1;
+  *levelID = -1;
+
+  status = extRead(fileID, extp);
+  if ( status != 0 ) return 0;
+
+  extInqHeader(extp, header);
+
+  icode  = header[1];
+  ilevel = header[2];
+
+  *varID = vlistInqVarID(vlistID, icode);
+
+  if ( *varID == CDI_UNDEFID ) Error("Code %d undefined", icode);
+
+  zaxisID = vlistInqVarZaxis(vlistID, *varID);
+
+  *levelID = zaxisInqLevelID(zaxisID, (double) ilevel);
+
+  return 1;
+}
+*/
+
+static void
+ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *extp = streamptr->record->objectp;
+  if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record");
+
+  int header[4];
+  extInqHeader(extp, header);
+  extInqDataFP32(extp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  if (vlistInqVarNumber(vlistID, varID) == CDI_REAL)
+    *numMissVals = get_num_missvalsSP(size, data, (float) missval);
+  else
+    *numMissVals = get_cplx_num_missvalsSP(size, data, (float) missval);
+
+  streamptr->numvals += (SizeType) size;
+}
+
+static void
+ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *extp = streamptr->record->objectp;
+  if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record");
+
+  int header[4];
+  extInqHeader(extp, header);
+  extInqDataFP64(extp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  if (vlistInqVarNumber(vlistID, varID) == CDI_REAL)
+    *numMissVals = get_num_missvalsDP(size, data, missval);
+  else
+    *numMissVals = get_cplx_num_missvalsDP(size, data, missval);
+
+  streamptr->numvals += (SizeType) size;
+}
+
+void
+ext_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    ext_read_recordDP(streamptr, (double *) data, numMissVals);
+  else
+    ext_read_recordSP(streamptr, (float *) data, numMissVals);
+}
+
+void
+extCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
+{
+  streamFCopyRecord(streamptr2, streamptr1, "EXTRA");
+}
+
+void
+extDefRecord(stream_t *streamptr)
+{
+  Record *record = streamptr->record;
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(record->param, &pnum, &pcat, &pdis);
+
+  int header[4];
+  header[0] = record->vdate;
+  header[1] = pnum;
+  header[2] = record->ilevel;
+  int gridID = record->gridID;
+  cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID));
+  header[3] = (int) gridInqSize(gridID);
+
+  extrec_t *extp = (extrec_t *) record->objectp;
+  extDefDatatype(record->prec, &extp->prec, &extp->number);
+  extDefHeader(extp, header);
+}
+
+static void
+ext_write_recordSP(stream_t *streamptr, const float *data)
+{
+  void *extp = streamptr->record->objectp;
+  extDefDataFP32(extp, data);
+  extWrite(streamptr->fileID, extp);
+}
+
+static void
+ext_write_recordDP(stream_t *streamptr, const double *data)
+{
+  void *extp = streamptr->record->objectp;
+  extDefDataFP64(extp, data);
+  extWrite(streamptr->fileID, extp);
+}
+
+void
+ext_write_record(stream_t *streamptr, int memtype, const void *data)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    ext_write_recordDP(streamptr, (const double *) data);
+  else
+    ext_write_recordSP(streamptr, (const float *) data);
+}
+
+static void
+extAddRecord(stream_t *streamptr, int param, int level, size_t xysize, size_t recsize, off_t position, int prec, int number)
+{
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int recID = recordNewEntry(streamptr, tsID);
+  record_t *record = &streamptr->tsteps[tsID].records[recID];
+
+  record->size = recsize;
+  record->position = position;
+  record->param = param;
+  record->ilevel = level;
+
+  grid_t *grid = (grid_t *) Malloc(sizeof(*grid));
+  grid_init(grid);
+  cdiGridTypeInit(grid, GRID_GENERIC, xysize);
+  grid->x.size = xysize;
+  grid->y.size = 0;
+  struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0);
+  int gridID = gridAdded.Id;
+  if (!gridAdded.isNew)
+    {
+      grid_free(grid);
+      Free(grid);
+    }
+
+  int leveltype = ZAXIS_GENERIC;
+  int datatype = extInqDatatype(prec, number);
+
+  int varID, levelID = 0;
+  varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL,
+               NULL, NULL);
+
+  record->varID = (short) varID;
+  record->levelID = levelID;
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+
+  if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID);
+}
+
+static void
+extScanTimestep1(stream_t *streamptr)
+{
+  CdiDateTime datetime0;
+  cdiDateTime_init(&datetime0);
+  int header[4];
+  off_t recpos = 0;
+  extrec_t *extp = (extrec_t *) streamptr->record->objectp;
+
+  streamptr->curTsID = 0;
+
+  int tsID = tstepsNewEntry(streamptr);
+  if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID);
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int fileID = streamptr->fileID;
+
+  int nrecs = 0;
+  while (true)
+    {
+      recpos = fileGetPos(fileID);
+      if (extRead(fileID, extp) != 0)
+        {
+          streamptr->ntsteps = 1;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      extInqHeader(extp, header);
+
+      int vdate = header[0];
+      int vtime = 0;
+      int rcode = header[1];
+      int rlevel = header[2];
+      int rxysize = header[3];
+      int param = cdiEncodeParam(rcode, 255, 255);
+      CdiDateTime datetime = cdiDateTime_set(vdate, vtime);
+
+      if (nrecs == 0)
+        {
+          datetime0 = datetime;
+          taxis->vDateTime = datetime;
+        }
+      else
+        {
+          record_t *records = streamptr->tsteps[tsID].records;
+          for (int recID = 0; recID < nrecs; recID++)
+            if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished;
+
+          if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel);
+        }
+
+      nrecs++;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime);
+
+      extAddRecord(streamptr, param, rlevel, (size_t) rxysize, recsize, recpos, extp->prec, extp->number);
+    }
+
+tstepScanLoopFinished:
+  streamptr->rtsteps = 1;
+
+  cdi_generate_vars(streamptr);
+
+  int taxisID = taxisCreate(TAXIS_ABSOLUTE);
+  taxis->type = TAXIS_ABSOLUTE;
+  taxis->rDateTime = taxis->vDateTime;
+
+  int vlistID = streamptr->vlistID;
+  vlistDefTaxis(vlistID, taxisID);
+
+  vlist_check_contents(vlistID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+  streamScanTimeConstAdjust(streamptr, taxis);
+}
+
+static int
+extScanTimestep2(stream_t *streamptr)
+{
+  int header[4];
+  off_t recpos = 0;
+  void *extp = streamptr->record->objectp;
+
+  streamptr->curTsID = 1;
+
+  int fileID = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+
+  int tsID = streamptr->rtsteps;
+  if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+  cdi_create_records(streamptr, tsID);
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  int nrecords = streamScanInitRecords2(streamptr);
+
+  for (int rindex = 0; rindex <= nrecords; rindex++)
+    {
+      recpos = fileGetPos(fileID);
+      if (extRead(fileID, extp) != 0)
+        {
+          streamptr->ntsteps = 2;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      extInqHeader(extp, header);
+
+      int vdate = header[0];
+      int vtime = 0;
+      int rcode = header[1];
+      int rlevel = header[2];
+      int param = cdiEncodeParam(rcode, 255, 255);
+
+      if (rindex == 0)
+        {
+          taxis->type = TAXIS_ABSOLUTE;
+          taxis->vDateTime = cdiDateTime_set(vdate, vtime);
+        }
+
+      bool nextstep = false;
+      int recID;
+      for (recID = 0; recID < nrecords; recID++)
+        {
+          if (param == records[recID].param && rlevel == records[recID].ilevel)
+            {
+              if (records[recID].used)
+                {
+                  nextstep = true;
+                }
+              else
+                {
+                  records[recID].used = true;
+                  streamptr->tsteps[tsID].recIDs[rindex] = recID;
+                }
+              break;
+            }
+        }
+      if (recID == nrecords)
+        {
+          Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1);
+          return CDI_EUFSTRUCT;
+        }
+
+      if (nextstep) break;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime);
+
+      if (param != records[recID].param || rlevel != records[recID].ilevel)
+        {
+          Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                  records[recID].ilevel, rlevel);
+          return CDI_EUFSTRUCT;
+        }
+
+      records[recID].position = recpos;
+      records[recID].size = recsize;
+    }
+
+  int nrecs = 0;
+  for (int recID = 0; recID < nrecords; recID++)
+    {
+      if (records[recID].used)
+        nrecs++;
+      else
+        vlistDefVarTimetype(vlistID, records[recID].varID, TIME_CONSTANT);
+    }
+  streamptr->tsteps[tsID].nrecs = nrecs;
+
+  streamptr->rtsteps = 2;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+
+  return 0;
+}
+
+int
+extInqContents(stream_t *streamptr)
+{
+  streamptr->curTsID = 0;
+
+  extScanTimestep1(streamptr);
+
+  int status = (streamptr->ntsteps == -1) ? extScanTimestep2(streamptr) : 0;
+
+  fileSetPos(streamptr->fileID, 0, SEEK_SET);
+
+  return status;
+}
+
+static long
+extScanTimestep(stream_t *streamptr)
+{
+  int header[4];
+  off_t recpos = 0;
+  int nrecs = 0;
+  void *extp = streamptr->record->objectp;
+
+  int tsID = streamptr->rtsteps;
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  if (streamptr->tsteps[tsID].recordSize == 0)
+    {
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      nrecs = streamScanInitRecords(streamptr, tsID);
+
+      int fileID = streamptr->fileID;
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+      for (int rindex = 0; rindex <= nrecs; rindex++)
+        {
+          recpos = fileGetPos(fileID);
+          if (extRead(fileID, extp) != 0)
+            {
+              streamptr->ntsteps = streamptr->rtsteps + 1;
+              break;
+            }
+
+          size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+          extInqHeader(extp, header);
+
+          int vdate = header[0];
+          int vtime = 0;
+          int rcode = header[1];
+          int rlevel = header[2];
+          int param = cdiEncodeParam(rcode, 255, 255);
+
+          // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error
+          if (rindex == nrecs) continue;
+          int recID = streamptr->tsteps[tsID].recIDs[rindex];
+
+          if (rindex == 0)
+            {
+              taxis->type = TAXIS_ABSOLUTE;
+              taxis->vDateTime = cdiDateTime_set(vdate, vtime);
+            }
+
+          if (param != records[recID].param || rlevel != records[recID].ilevel)
+            {
+              Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                      records[recID].ilevel, rlevel);
+              Error("Invalid, unsupported or inconsistent record structure!");
+            }
+
+          records[recID].position = recpos;
+          records[recID].size = recsize;
+
+          if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime);
+        }
+
+      streamptr->rtsteps++;
+
+      if (streamptr->ntsteps != streamptr->rtsteps)
+        {
+          tsID = tstepsNewEntry(streamptr);
+          if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+          streamptr->tsteps[tsID - 1].next = true;
+          streamptr->tsteps[tsID].position = recpos;
+        }
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+      streamptr->tsteps[tsID].position = recpos;
+    }
+
+  if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs)
+    {
+      Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID);
+      streamptr->ntsteps = tsID;
+    }
+
+  return streamptr->ntsteps;
+}
+
+int
+extInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!");
+
+  if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps);
+
+  long ntsteps = CDI_UNDEFID;
+  while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = extScanTimestep(streamptr);
+
+  int nrecs = 0;
+  if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID))
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+    }
+
+  return nrecs;
+}
+
+void
+extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  void *extp = streamptr->record->objectp;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  int tsid = streamptr->curTsID;
+
+  off_t currentfilepos = fileGetPos(fileID);
+
+  int recID = streamptr->vars[varID].recordTable[0].recordID[levID];
+  off_t recpos = streamptr->tsteps[tsid].records[recID].position;
+  fileSetPos(fileID, recpos, SEEK_SET);
+  extRead(fileID, extp);
+  int header[4];
+  extInqHeader(extp, header);
+  extInqDataFP64(extp, data);
+
+  fileSetPos(fileID, currentfilepos, SEEK_SET);
+
+  if (vlistInqVarNumber(vlistID, varID) == CDI_REAL)
+    *numMissVals = get_num_missvalsDP(gridsize, data, missval);
+  else
+    *numMissVals = get_cplx_num_missvalsDP(gridsize, data, missval);
+}
+
+void
+extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
+
+  for (size_t levID = 0; levID < nlevs; levID++)
+    extReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals);
+}
+
+void
+extWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+  CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime;
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis);
+
+  int header[4];
+  header[0] = (int) cdiDate_get(vDateTime.date);
+  header[1] = pnum;
+  header[2] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID));
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID));
+  header[3] = (int) gridInqSize(gridID);
+
+  extrec_t *extp = (extrec_t *) streamptr->record->objectp;
+  extDefDatatype(vlistInqVarDatatype(vlistID, varID), &extp->prec, &extp->number);
+  extDefHeader(extp, header);
+
+  extDefDataFP64(extp, data);
+  extWrite(fileID, extp);
+}
+
+void
+extWriteVarDP(stream_t *streamptr, int varID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t nlevs = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
+
+  for (size_t levID = 0; levID < nlevs; levID++) extWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]);
+}
+
+#endif /* HAVE_LIBEXTRA */
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef STREAM_GRIBAPI_H
+#define STREAM_GRIBAPI_H
+
+#ifdef HAVE_LIBGRIB_API
+
+
+int fdbScanTimesteps(stream_t *streamptr);
+
+long gribapiScanTimestep1(stream_t *streamptr);
+long gribapiScanTimestep2(stream_t *streamptr);
+long gribapiScanTimestep(stream_t *streamptr);
+
+int gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals,
+                  double missval);
+
+size_t gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime,
+                     int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer,
+                     size_t *gribbuffersize, int ljpeg, void *gribContainer);
+
+int gribapiGetScanningMode(grib_handle *gh);
+void gribapiSetScanningMode(grib_handle *gh, int scanningMode);
+
+void gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int lev);
+
+#endif
+
+#endif /* STREAM_GRIBAPI_H */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+int cdiDebugExt = 0;  //  Debug level for the KNMI extensions
+#ifdef HIRLAM_EXTENSIONS
+// *** RELATED to GRIB only ***
+int cdiGribUseTimeRangeIndicator = 0;  // normaly cdo looks in grib for attribute called "stepType"
+                                       // but NWP models such as Harmonie 37h1.2, use "timeRangeIndicator"
+                                       // where:  0: for instanteneous fields; 4: for accumulated fields
+#endif                                 // HIRLAM_EXTENSIONS
+
+double
+zaxis_units_to_centimeter(int zaxisID)
+{
+  char units[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length);
+
+  double sf = 100.0;  // default: meter
+  // clang-format off
+  if (units[1] == 'm' && !units[2])
+    {
+      if      (units[0] == 'm') sf =   0.1;
+      else if (units[0] == 'c') sf =   1.0;
+      else if (units[0] == 'd') sf =  10.0;
+    }
+  // clang-format on
+
+  return sf;
+}
+
+double
+zaxis_units_to_meter(int zaxisID)
+{
+  char units[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length);
+
+  double sf = 1.0;  // default: meter
+  // clang-format off
+  if (units[1] == 'm' && !units[2])
+    {
+      if      (units[0] == 'm') sf /= 1000.0;
+      else if (units[0] == 'c') sf /= 100.0;
+      else if (units[0] == 'd') sf /= 10.0;
+      else if (units[0] == 'k') sf *= 1000.0;
+    }
+  // clang-format on
+
+  return sf;
+}
+
+bool
+zaxis_units_is_Pa(int zaxisID)
+{
+  char units[CDI_MAX_NAME] = { 0 };
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length);
+
+  return (units[0] == 'P' && units[1] == 'a');
+}
+
+void
+ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer)
+{
+  if (*curSize < requiredSize)
+    {
+      *curSize = requiredSize;
+      *buffer = Realloc(*buffer, *curSize);
+    }
+}
+
+int
+grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer)
+{
+  int comptype = CDI_COMPRESS_NONE;
+
+  size_t unzipsize;
+  if (gribGetZip(recsize, (unsigned char *) *gribbuffer, &unzipsize) > 0)
+    {
+      comptype = CDI_COMPRESS_SZIP;
+      unzipsize += 100;  // need 0 to 1 bytes for rounding of bds
+      ensureBufferSize(unzipsize, buffersize, gribbuffer);
+    }
+
+  return comptype;
+}
+
+// Regarding operation to change parameter identification:
+// change if cdiGribChangeParameterID.active
+struct cdiGribParamChange cdiGribChangeParameterID;
+
+// Used only for CDO module Selmulti
+void
+streamGrbChangeParameterIdentification(int code, int ltype, int lev)
+{
+  // NOTE this is a "PROXY" function for gribapiChangeParameterIdentification();
+  // This just sets the globals. There are probably better solutions to this.
+  // The parameter change is done by function  gribapiChangeParameterIdentification() in stream_gribapi.c
+  // Setting this control variable to true will cause calling fnc. gribapiChangeParameterIdentification later.
+  // After grib attributes have been changed this variable goes to false.
+  cdiGribChangeParameterID.active = true;
+  cdiGribChangeParameterID.code = code;
+  cdiGribChangeParameterID.ltype = ltype;
+  cdiGribChangeParameterID.lev = lev;
+}
+
+struct cdiGribScanModeChange cdiGribDataScanningMode;
+
+void
+streamGrbDefDataScanningMode(int scanmode)
+{
+  cdiGribDataScanningMode.active = true;
+  cdiGribDataScanningMode.value = scanmode;
+}
+
+enum
+{
+  MapKey = 0,
+  MapValue = 1
+};
+
+static const int grib1ltypeMap[][2] = {
+  // clang-format off
+  {  GRIB1_LTYPE_SURFACE,             ZAXIS_SURFACE            },
+  {  GRIB1_LTYPE_CLOUD_BASE,          ZAXIS_CLOUD_BASE         },
+  {  GRIB1_LTYPE_CLOUD_TOP,           ZAXIS_CLOUD_TOP          },
+  {  GRIB1_LTYPE_ISOTHERM0,           ZAXIS_ISOTHERM_ZERO      },
+  {  GRIB1_LTYPE_TROPOPAUSE,          ZAXIS_TROPOPAUSE         },
+  {  GRIB1_LTYPE_TOA,                 ZAXIS_TOA                },
+  {  GRIB1_LTYPE_SEA_BOTTOM,          ZAXIS_SEA_BOTTOM         },
+  {  GRIB1_LTYPE_ATMOSPHERE,          ZAXIS_ATMOSPHERE         },
+  {  GRIB1_LTYPE_ISOBARIC,            ZAXIS_PRESSURE           },
+  {  GRIB1_LTYPE_99,                  ZAXIS_PRESSURE           },
+  {  GRIB1_LTYPE_ISOBARIC_PA,         ZAXIS_PRESSURE           },
+  {  GRIB1_LTYPE_MEANSEA,             ZAXIS_MEANSEA            },
+  {  GRIB1_LTYPE_ALTITUDE,            ZAXIS_ALTITUDE           },
+  {  GRIB1_LTYPE_HEIGHT,              ZAXIS_HEIGHT             },
+  {  GRIB1_LTYPE_SIGMA,               ZAXIS_SIGMA              },
+  {  GRIB1_LTYPE_SIGMA_LAYER,         ZAXIS_SIGMA              },
+  {  GRIB1_LTYPE_HYBRID,              ZAXIS_HYBRID             },
+  {  GRIB1_LTYPE_HYBRID_LAYER,        ZAXIS_HYBRID             },
+  {  GRIB1_LTYPE_LANDDEPTH,           ZAXIS_DEPTH_BELOW_LAND   },
+  {  GRIB1_LTYPE_LANDDEPTH_LAYER,     ZAXIS_DEPTH_BELOW_LAND   },
+  {  GRIB1_LTYPE_ISENTROPIC,          ZAXIS_ISENTROPIC         },
+  {  GRIB1_LTYPE_SEADEPTH,            ZAXIS_DEPTH_BELOW_SEA    },
+  {  GRIB1_LTYPE_LAKE_BOTTOM,         ZAXIS_LAKE_BOTTOM        },
+  {  GRIB1_LTYPE_SEDIMENT_BOTTOM,     ZAXIS_SEDIMENT_BOTTOM    },
+  {  GRIB1_LTYPE_SEDIMENT_BOTTOM_TA,  ZAXIS_SEDIMENT_BOTTOM_TA },
+  {  GRIB1_LTYPE_SEDIMENT_BOTTOM_TW,  ZAXIS_SEDIMENT_BOTTOM_TW },
+  {  GRIB1_LTYPE_MIX_LAYER,           ZAXIS_MIX_LAYER          },
+  // clang-format on
+};
+
+static const size_t grib1ltypeMapSize = sizeof(grib1ltypeMap) / (2 * sizeof(int));
+
+static const int grib2ltypeMap[][2] = {
+  // clang-format off
+  {  GRIB2_LTYPE_SURFACE,             ZAXIS_SURFACE            },
+  {  GRIB2_LTYPE_CLOUD_BASE,          ZAXIS_CLOUD_BASE         },
+  {  GRIB2_LTYPE_CLOUD_TOP,           ZAXIS_CLOUD_TOP          },
+  {  GRIB2_LTYPE_ISOTHERM0,           ZAXIS_ISOTHERM_ZERO      },
+  {  GRIB2_LTYPE_TROPOPAUSE,          ZAXIS_TROPOPAUSE         },
+  {  GRIB2_LTYPE_TOA,                 ZAXIS_TOA                },
+  {  GRIB2_LTYPE_SEA_BOTTOM,          ZAXIS_SEA_BOTTOM         },
+  {  GRIB2_LTYPE_ATMOSPHERE,          ZAXIS_ATMOSPHERE         },
+  {  GRIB2_LTYPE_ISOBARIC,            ZAXIS_PRESSURE           },
+  {  GRIB2_LTYPE_MEANSEA,             ZAXIS_MEANSEA            },
+  {  GRIB2_LTYPE_ALTITUDE,            ZAXIS_ALTITUDE           },
+  {  GRIB2_LTYPE_HEIGHT,              ZAXIS_HEIGHT             },
+  {  GRIB2_LTYPE_SIGMA,               ZAXIS_SIGMA              },
+  {  GRIB2_LTYPE_HYBRID,              ZAXIS_HYBRID             },
+  {  GRIB2_LTYPE_HYBRID,              ZAXIS_HYBRID_HALF        },
+  {  GRIB2_LTYPE_LANDDEPTH,           ZAXIS_DEPTH_BELOW_LAND   },
+  {  GRIB2_LTYPE_ISENTROPIC,          ZAXIS_ISENTROPIC         },
+  {  GRIB2_LTYPE_SEADEPTH,            ZAXIS_DEPTH_BELOW_SEA    },
+  {  GRIB2_LTYPE_LAKE_BOTTOM,         ZAXIS_LAKE_BOTTOM        },
+  {  GRIB2_LTYPE_SEDIMENT_BOTTOM,     ZAXIS_SEDIMENT_BOTTOM    },
+  {  GRIB2_LTYPE_SEDIMENT_BOTTOM_TA,  ZAXIS_SEDIMENT_BOTTOM_TA },
+  {  GRIB2_LTYPE_SEDIMENT_BOTTOM_TW,  ZAXIS_SEDIMENT_BOTTOM_TW },
+  {  GRIB2_LTYPE_MIX_LAYER,           ZAXIS_MIX_LAYER          },
+  {  GRIB2_LTYPE_SNOW,                ZAXIS_SNOW               },
+  {  GRIB2_LTYPE_REFERENCE,           ZAXIS_REFERENCE          },
+  // clang-format on
+};
+
+static const size_t grib2ltypeMapSize = sizeof(grib2ltypeMap) / (2 * sizeof(int));
+
+static int
+getInt2IntMap(int searchKey, bool keyValue, size_t mapSize, const int gribltypeMap[][2], int defaultValue)
+{
+  for (size_t i = 0; i < mapSize; ++i)
+    if (gribltypeMap[i][keyValue] == searchKey) return gribltypeMap[i][!keyValue];
+
+  return defaultValue;
+}
+
+int
+grib1ltypeToZaxisType(int grib_ltype)
+{
+  return getInt2IntMap(grib_ltype, MapKey, grib1ltypeMapSize, grib1ltypeMap, ZAXIS_GENERIC);
+}
+
+int
+zaxisTypeToGrib1ltype(int zaxistype)
+{
+  return getInt2IntMap(zaxistype, MapValue, grib1ltypeMapSize, grib1ltypeMap, -1);
+}
+
+int
+grib2ltypeToZaxisType(int grib_ltype)
+{
+  return getInt2IntMap(grib_ltype, MapKey, grib2ltypeMapSize, grib2ltypeMap, ZAXIS_GENERIC);
+}
+
+int
+zaxisTypeToGrib2ltype(int zaxistype)
+{
+  return getInt2IntMap(zaxistype, MapValue, grib2ltypeMapSize, grib2ltypeMap, -1);
+}
+
+int
+grbBitsPerValue(int datatype)
+{
+  int bitsPerValue = 16;
+
+  if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/GRIB library does not support complex numbers!");
+
+  if (datatype != CDI_UNDEFID)
+    {
+      if (datatype > 0 && datatype <= 32)
+        bitsPerValue = datatype;
+      else if (datatype == CDI_DATATYPE_FLT64)
+        bitsPerValue = 24;
+      else
+        bitsPerValue = 16;
+    }
+
+  return bitsPerValue;
+}
+
+/*
+int grbInqRecord(stream_t * streamptr, int *varID, int *levelID)
+{
+  int status;
+
+  status = cgribexInqRecord(streamptr, varID, levelID);
+
+  return (status);
+}
+*/
+
+void
+grbDefRecord(stream_t *streamptr)
+{
+  UNUSED(streamptr);
+}
+
+static long
+grbScanTimestep1(stream_t *streamptr)
+{
+  long status = CDI_EUFTYPE;
+
+#ifdef HAVE_LIBCGRIBEX
+  int filetype = streamptr->filetype;
+
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    status = cgribexScanTimestep1(streamptr);
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    status = gribapiScanTimestep1(streamptr);
+#else
+  Error("GRIB_API support unavailable!");
+#endif
+
+  return status;
+}
+
+static long
+grbScanTimestep2(stream_t *streamptr)
+{
+  long status = CDI_EUFTYPE;
+
+#ifdef HAVE_LIBCGRIBEX
+  int filetype = streamptr->filetype;
+
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    status = cgribexScanTimestep2(streamptr);
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    status = gribapiScanTimestep2(streamptr);
+#else
+  Error("GRIB_API support unavailable!");
+#endif
+
+  return status;
+}
+
+static long
+grbScanTimestep(stream_t *streamptr)
+{
+  long status = CDI_EUFTYPE;
+
+#ifdef HAVE_LIBCGRIBEX
+  int filetype = streamptr->filetype;
+
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    status = cgribexScanTimestep(streamptr);
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    status = gribapiScanTimestep(streamptr);
+#else
+  Error("GRIB_API support unavailable!");
+#endif
+
+  return status;
+}
+
+#ifdef HAVE_LIBGRIB
+long
+grbInqContents(stream_t *streamptr)
+{
+  streamptr->curTsID = 0;
+
+  long status = grbScanTimestep1(streamptr);
+  if (status == 0 && streamptr->ntsteps == -1) status = grbScanTimestep2(streamptr);
+
+  int fileID = streamptr->fileID;
+  fileSetPos(fileID, 0, SEEK_SET);
+
+  return status;
+}
+
+#ifdef HAVE_LIBFDB5
+int
+fdbInqContents(stream_t *streamptr)
+{
+  streamptr->curTsID = 0;
+#ifdef HAVE_LIBGRIB_API
+  return fdbScanTimesteps(streamptr);
+#else
+  return -1;
+#endif
+}
+#endif
+#endif
+
+int
+fdbInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!");
+
+  if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps);
+
+  int nrecs;
+  if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)
+    {
+      nrecs = 0;
+    }
+  else
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+    }
+
+  return nrecs;
+}
+
+int
+grbInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!");
+
+  if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps);
+
+  long ntsteps = -1;
+  while ((tsID + 1) > streamptr->rtsteps && ntsteps == -1)
+    {
+      ntsteps = grbScanTimestep(streamptr);
+      if (ntsteps == CDI_EUFSTRUCT)
+        {
+          streamptr->ntsteps = streamptr->rtsteps;
+          break;
+        }
+    }
+
+  int nrecs;
+  if (tsID >= streamptr->ntsteps && streamptr->ntsteps != -1)
+    {
+      nrecs = 0;
+    }
+  else
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+    }
+
+  return nrecs;
+}
+
+// used in CDO!!!
+void
+streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  int filetype = streamptr->filetype;
+
+  if (filetype == CDI_FILETYPE_GRB)
+    {
+      int tsID = streamptr->curTsID;
+      int vrecID = streamptr->tsteps[tsID].curRecID;
+      int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+      off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+      int zip = streamptr->tsteps[tsID].records[recID].zip;
+
+      void *gribbuffer = streamptr->record->buffer;
+      size_t gribbuffersize = streamptr->record->buffersize;
+
+      if (zip > 0)
+        Error("Compressed GRIB records unsupported!");
+      else
+        grib_info_for_grads(recpos, (long) gribbuffersize, (unsigned char *) gribbuffer, intnum, fltnum, bignum);
+    }
+}
+
+int
+grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear)
+{
+  int gridtype = gridInqType(*gridID);
+
+  if (gridtype == GRID_GENERIC)
+    {
+      int xsize = (int) gridInqXsize(*gridID);
+      int ysize = (int) gridInqYsize(*gridID);
+
+      if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160 || ysize == 192 || ysize == 240 || ysize == 320
+           || ysize == 384 || ysize == 480 || ysize == 768)
+          && (xsize == 2 * ysize || xsize == 1))
+        {
+          gridtype = GRID_GAUSSIAN;
+        }
+      else if (gridsize == 1)
+        {
+          gridtype = GRID_LONLAT;
+        }
+      else if (gridInqXvals(*gridID, NULL) && gridInqYvals(*gridID, NULL))
+        {
+          gridtype = GRID_LONLAT;
+        }
+    }
+  else if (gridtype == GRID_CURVILINEAR)
+    {
+      int projID = gridInqProj(*gridID);
+      if (projID != CDI_UNDEFID && gridInqType(projID) == GRID_PROJECTION)
+        {
+          *gridID = projID;
+          gridtype = GRID_PROJECTION;
+        }
+      else
+        {
+          static bool lwarning = true;
+          if (lwarning && gridsize > 1)
+            {
+              lwarning = false;
+              Warning("Curvilinear grid is unsupported in GRIB format! Created wrong Grid Description Section!");
+            }
+          *gridIsCurvilinear = true;
+          gridtype = GRID_LONLAT;
+        }
+    }
+
+  if (gridtype == GRID_PROJECTION)
+    {
+      int projtype = gridInqProjType(*gridID);
+      if (projtype == CDI_PROJ_RLL)
+        {
+          gridtype = GRID_LONLAT;
+          *gridIsRotated = true;
+        }
+      else if (projtype == CDI_PROJ_LCC)
+        {
+          gridtype = CDI_PROJ_LCC;
+        }
+      else if (projtype == CDI_PROJ_STERE)
+        {
+          gridtype = CDI_PROJ_STERE;
+        }
+      else if (projtype == CDI_PROJ_HEALPIX)
+        {
+          gridtype = CDI_PROJ_HEALPIX;
+        }
+    }
+
+  return gridtype;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef _SUBTYPE_H
+#define _SUBTYPE_H
+
+enum
+{
+  /* subtype attributes wrt. TILES */
+  SUBTYPE_ATT_TILEINDEX = 0,
+  SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS = 1,
+  SUBTYPE_ATT_TILE_CLASSIFICATION = 2,
+  SUBTYPE_ATT_NUMBER_OF_TILES = 3,
+  SUBTYPE_ATT_NUMBER_OF_ATTR = 4,
+  SUBTYPE_ATT_TILEATTRIBUTE = 5,
+  /* No. of different constants in the enumeration
+     "subtype_attributes" */
+  nSubtypeAttributes
+};
+
+/* Literal constants corresponding to the different constants of the
+   enumeration "subtype_attributes". */
+extern const char *const cdiSubtypeAttributeName[];
+
+/* Data type specifying an attribute of a subtype (for example an
+   attribute of a set of TILES) or an attribute of a subtype entry
+   (for example an attribute of a single TILE). This data type is part
+   of a linked list. */
+struct subtype_attr_t
+{
+  int key, val;                /* key/value pair */
+  struct subtype_attr_t *next; /* next element in linked list */
+};
+
+/* Data type specifying a single entry of a subtype, for example a
+   single TILE in a set of TILES. */
+struct subtype_entry_t
+{
+  int self;                     /* list entry index (0,...,nentries-1) */
+  struct subtype_entry_t *next; /* next node in linked list */
+
+  /* linked list with attributes for this subtype entry, ordered by its key values*/
+  struct subtype_attr_t *atts;
+};
+
+/* Data type specifying a variable subtype, for example a list of
+   TILES. This can be interpreted as an additional axis like the
+   vertical axis. */
+typedef struct
+{
+  int self;     /* resource handler ID */
+  int subtype;  /* subtype kind: TILES, ... */
+  int nentries; /* counter: total no. of entries in list */
+
+  /* currently active subtype, e.g. GRIB2 tile index (for example for
+     stream/vlist accesses): */
+  int active_subtype_index;
+  struct subtype_entry_t globals; /* global attributes */
+
+  /* list of subtype entries, e.g. the list of tiles, ordered by entry->self. */
+  struct subtype_entry_t *entries;
+} subtype_t;
+
+/* prototypes: allocation and destruction */
+void subtypeAllocate(subtype_t **subtype_ptr2, int subtype);
+int subtypePush(subtype_t *subtype_ptr);
+void subtypeDestroyPtr(void *ptr);
+void subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst);
+struct subtype_entry_t *subtypeEntryInsert(subtype_t *head);
+
+/* prototypes: accessing global attributes */
+void subtypePrint(int subtypeID);
+void subtypePrintPtr(subtype_t *subtype_ptr);
+void subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val);
+void subtypeDefGlobalData(int subtypeID, int key, int val);
+int subtypeGetGlobalData(int subtypeID, int key);
+int subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key);
+int subtypeComparePtr(int s1_ID, subtype_t *s2);
+
+/* prototypes: accessing subtype entries */
+void subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val);
+
+/* prototypes: tile implementations */
+void tilesetInsertP(subtype_t *s1, subtype_t *s2);
+
+/* Construct a new subtype for a tile set. If a corresponding subtype
+ * already exists, then we return this subtype ID instead. */
+int vlistDefTileSubtype(int vlistID, subtype_t *tiles);
+
+/* Insert a trivial one-tile-subtype */
+int vlistInsertTrivialTileSubtype(int vlistID);
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+
+
+
+#include <grib_api.h>
+
+extern int CDI_Inventory_Mode;
+
+static const var_tile_t dummy_tiles = { 0, -1, -1, -1, -1, -1 };
+
+typedef struct
+{
+  int param;
+  int level1;
+  int level2;
+  int ltype;
+  int tsteptype;
+  size_t gridsize;
+  char name[32];
+  VarScanKeys scanKeys;
+  var_tile_t tiles;
+} compvar2_t;
+
+static int
+gribapi_get_zaxis_type(long editionNumber, int grib_ltype)
+{
+  return (editionNumber <= 1) ? grib1ltypeToZaxisType(grib_ltype) : grib2ltypeToZaxisType(grib_ltype);
+}
+
+static int
+get_timeunits(long unitsOfTime)
+{
+  switch (unitsOfTime)
+    {
+    case 13: return TUNIT_SECOND;
+    case 0: return TUNIT_MINUTE;
+    case 1: return TUNIT_HOUR;
+    case 10: return TUNIT_3HOURS;
+    case 11: return TUNIT_6HOURS;
+    case 12: return TUNIT_12HOURS;
+    case 2: return TUNIT_DAY;
+    }
+
+  return TUNIT_HOUR;
+}
+
+static double
+timeunits_factor(int timeUnits1, int timeUnits2)
+{
+  if (timeUnits2 == TUNIT_HOUR)
+    {
+      switch (timeUnits1)
+        {
+        case TUNIT_SECOND: return 3600;
+        case TUNIT_MINUTE: return 60;
+        case TUNIT_HOUR: return 1;
+        case TUNIT_3HOURS: return 1.0 / 3;
+        case TUNIT_6HOURS: return 1.0 / 6;
+        case TUNIT_12HOURS: return 1.0 / 12;
+        case TUNIT_DAY: return 1.0 / 24;
+        }
+    }
+
+  return 1;
+}
+
+static int
+gribapi_get_timeunits(grib_handle *gh)
+{
+  long unitsOfTime = -1;
+  grib_get_long(gh, "indicatorOfUnitOfTimeRange", &unitsOfTime);
+  if (unitsOfTime == -1) grib_get_long(gh, "indicatorOfUnitForTimeIncrement", &unitsOfTime);
+
+  if (unitsOfTime != -1)
+    {
+      long stepUnits = -1;
+      grib_get_long(gh, "stepUnits", &stepUnits);
+      if (stepUnits == -1 && stepUnits != unitsOfTime) GRIB_CHECK(my_grib_set_long(gh, "stepUnits", unitsOfTime), 0);
+    }
+
+  return get_timeunits(unitsOfTime);
+}
+
+static void
+gribapiGetSteps(grib_handle *gh, int timeunits, int *startStep, int *endStep)
+{
+  long unitsOfTime;
+  int status = grib_get_long(gh, "stepUnits", &unitsOfTime);
+  int timeunits2 = (status == 0) ? get_timeunits(unitsOfTime) : timeunits;
+  // timeunits2 = gribapi_get_timeunits(gh);
+
+  long lpar;
+  status = grib_get_long(gh, "forecastTime", &lpar);
+  if (status == 0)
+    *startStep = (int) lpar;
+  else
+    {
+      status = grib_get_long(gh, "startStep", &lpar);
+      if (status == 0) *startStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5);
+    }
+
+  *endStep = *startStep;
+  status = grib_get_long(gh, "endStep", &lpar);
+  if (status == 0) *endStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5);
+  // printf("%d %d %ld %d %d %g\n", *startStep, *endStep, lpar, timeunits, timeunits2, timeunits_factor(timeunits, timeunits2));
+}
+
+static CdiDateTime
+gribapiGetDataDateTime(grib_handle *gh)
+{
+  long date;
+  GRIB_CHECK(grib_get_long(gh, "dataDate", &date), 0);
+
+  long hour, minute, second;
+  GRIB_CHECK(grib_get_long(gh, "hour", &hour), 0);
+  GRIB_CHECK(grib_get_long(gh, "minute", &minute), 0);
+  GRIB_CHECK(grib_get_long(gh, "second", &second), 0);
+
+  CdiDateTime dt;
+  dt.date = cdiDate_set(date);
+  dt.time.hour = (short) hour;
+  dt.time.minute = (short) minute;
+  dt.time.second = (short) second;
+  dt.time.ms = 0;
+
+  return dt;
+}
+
+static void
+gribapiSetDataDateTime(grib_handle *gh, CdiDateTime dataDateTime)
+{
+  long dataDate = (long) cdiDate_get(dataDateTime.date);
+  GRIB_CHECK(my_grib_set_long(gh, "dataDate", (long) dataDate), 0);
+
+  int hour, minute, second, ms;
+  cdiTime_decode(dataDateTime.time, &hour, &minute, &second, &ms);
+  GRIB_CHECK(my_grib_set_long(gh, "hour", hour), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "minute", minute), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "second", second), 0);
+}
+
+static int
+gribapi_get_timeunits_factor(int timeUnits)
+{
+  static bool lprint = true;
+  switch (timeUnits)
+    {
+    case TUNIT_SECOND: return 1;
+    case TUNIT_MINUTE: return 60;
+    case TUNIT_HOUR: return 3600;
+    case TUNIT_3HOURS: return 10800;
+    case TUNIT_6HOURS: return 21600;
+    case TUNIT_12HOURS: return 43200;
+    case TUNIT_DAY: return 86400;
+    default:
+      if (lprint)
+        {
+          Warning("Time unit %d unsupported", timeUnits);
+          lprint = false;
+        }
+    }
+
+  return 0;
+}
+
+static CdiDateTime
+gribapiGetValidityDateTime(grib_handle *gh, CdiDateTime *sDateTime)
+{
+  CdiDateTime vDateTime;
+  cdiDateTime_init(sDateTime);
+
+  long sigofrtime = 3;
+  if (gribEditionNumber(gh) > 1)
+    GRIB_CHECK(grib_get_long(gh, "significanceOfReferenceTime", &sigofrtime), 0);
+  else
+    GRIB_CHECK(grib_get_long(gh, "timeRangeIndicator", &sigofrtime), 0);
+
+  if (sigofrtime
+      == 3)  // XXX: This looks like a bug to me, because timeRangeIndicator == 3 does not seem to have the same meaning as
+             // significanceOfReferenceTime == 3. I would recommend replacing this condition with `if(!gribapiTimeIsFC())`.
+    {
+      vDateTime = gribapiGetDataDateTime(gh);
+    }
+  else
+    {
+      CdiDateTime rDateTime = gribapiGetDataDateTime(gh);
+
+      int timeUnits = gribapi_get_timeunits(gh);
+      int startStep = 0, endStep = 0;
+      gribapiGetSteps(gh, timeUnits, &startStep, &endStep);
+
+      if (rDateTime.date.day > 0)
+        {
+          extern int CGRIBEX_grib_calendar;
+          JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime);
+
+          int64_t timeUnitFactor = gribapi_get_timeunits_factor(timeUnits);
+
+          // if (startStep > 0)
+          {
+            JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep);
+            *sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2);
+          }
+
+          rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate_add_seconds(julianDate, timeUnitFactor * endStep));
+        }
+
+      vDateTime = rDateTime;
+    }
+
+  return vDateTime;
+}
+
+static void
+grib1_get_level(grib_handle *gh, int *leveltype, int *lbounds, int *level1, int *level2)
+{
+  *leveltype = 0;
+  *lbounds = 0;
+  *level1 = 0;
+  *level2 = 0;
+
+  long lpar;
+  if (!grib_get_long(gh, "indicatorOfTypeOfLevel", &lpar))  // 1 byte
+    {
+      *leveltype = (int) lpar;
+
+      switch (*leveltype)
+        {
+        case GRIB1_LTYPE_SIGMA_LAYER:
+        case GRIB1_LTYPE_HYBRID_LAYER:
+        case GRIB1_LTYPE_LANDDEPTH_LAYER:
+          {
+            *lbounds = 1;
+            break;
+          }
+        }
+
+      if (*lbounds)
+        {
+          GRIB_CHECK(grib_get_long(gh, "topLevel", &lpar), 0);  // 1 byte
+          if (lpar == GRIB_MISSING_LONG) lpar = 0;
+          *level1 = (int) lpar;
+          GRIB_CHECK(grib_get_long(gh, "bottomLevel", &lpar), 0);  // 1 byte
+          if (lpar == GRIB_MISSING_LONG) lpar = 0;
+          *level2 = (int) lpar;
+        }
+      else
+        {
+          double dlevel;
+          GRIB_CHECK(grib_get_double(gh, "level", &dlevel), 0);  // 2 byte
+          if (*leveltype == GRIB1_LTYPE_ISOBARIC) dlevel *= 100;
+          if (dlevel < -2.e9 || dlevel > 2.e9) dlevel = 0;
+          if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA) *leveltype = GRIB1_LTYPE_ISOBARIC;
+
+          *level1 = (int) dlevel;
+          *level2 = 0;
+        }
+    }
+}
+
+static double
+grib2ScaleFactor(long factor)
+{
+  switch (factor)
+    {
+    case GRIB_MISSING_LONG: return 1;
+    case -9: return 1000000000;
+    case -8: return 100000000;
+    case -7: return 10000000;
+    case -6: return 1000000;
+    case -5: return 100000;
+    case -4: return 10000;
+    case -3: return 1000;
+    case -2: return 100;
+    case -1: return 10;
+    case 0: return 1;
+    case 1: return 0.1;
+    case 2: return 0.01;
+    case 3: return 0.001;
+    case 4: return 0.0001;
+    case 5: return 0.00001;
+    case 6: return 0.000001;
+    case 7: return 0.0000001;
+    case 8: return 0.00000001;
+    case 9: return 0.000000001;
+    default: return 0;
+    }
+}
+
+static int
+calc_level(int level_sf, long factor, long level)
+{
+  double result = 0;
+  if (level != GRIB_MISSING_LONG) result = (double) level * grib2ScaleFactor(factor);
+  if (level_sf) result *= level_sf;
+  return (int) result;
+}
+
+static void
+grib2_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf,
+                int *level_unit)
+{
+  *leveltype1 = 0;
+  *leveltype2 = -1;
+  *lbounds = 0;
+  *level1 = 0;
+  *level2 = 0;
+  *level_sf = 0;
+  *level_unit = 0;
+
+  long lpar;
+  int status = grib_get_long(gh, "typeOfFirstFixedSurface", &lpar);  // 1 byte
+  if (status == 0)
+    {
+      *leveltype1 = (int) lpar;
+
+      status = grib_get_long(gh, "typeOfSecondFixedSurface", &lpar);  // 1 byte
+      /* FIXME: assert(lpar >= INT_MIN && lpar <= INT_MAX) */
+      if (status == 0) *leveltype2 = (int) lpar;
+
+      if (*leveltype1 != 255 && *leveltype2 != 255 && *leveltype2 > 0) *lbounds = 1;
+      switch (*leveltype1)
+        {
+        case GRIB2_LTYPE_REFERENCE:
+          if (*leveltype2 == 1) *lbounds = 0;
+          break;
+        case GRIB2_LTYPE_LANDDEPTH:
+          *level_sf = 1000;
+          *level_unit = CDI_UNIT_M;
+          break;
+        case GRIB2_LTYPE_ISOBARIC:
+          *level_sf = 1000;
+          *level_unit = CDI_UNIT_PA;
+          break;
+        case GRIB2_LTYPE_SIGMA:
+          *level_sf = 1000;
+          *level_unit = 0;
+          break;
+        }
+
+      long factor, llevel;
+      GRIB_CHECK(grib_get_long(gh, "scaleFactorOfFirstFixedSurface", &factor), 0);  // 1 byte
+      GRIB_CHECK(grib_get_long(gh, "scaledValueOfFirstFixedSurface", &llevel), 0);  // 4 byte
+      *level1 = calc_level(*level_sf, factor, llevel);
+
+      if (*lbounds)
+        {
+          GRIB_CHECK(grib_get_long(gh, "scaleFactorOfSecondFixedSurface", &factor), 0);  // 1 byte
+          GRIB_CHECK(grib_get_long(gh, "scaledValueOfSecondFixedSurface", &llevel), 0);  // 4 byte
+          *level2 = calc_level(*level_sf, factor, llevel);
+        }
+    }
+}
+
+static void
+grib_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf,
+               int *level_unit, var_tile_t *tiles)
+{
+  if (gribEditionNumber(gh) <= 1)
+    {
+      grib1_get_level(gh, leveltype1, lbounds, level1, level2);
+      *leveltype2 = -1;
+      *level_sf = 0;
+      *level_unit = 0;
+    }
+  else
+    {
+      grib2_get_level(gh, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit);
+
+      // read in tiles attributes (if there are any)
+      tiles->tileindex = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], 0);
+      tiles->totalno_of_tileattr_pairs
+          = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS], -1);
+      tiles->tileClassification = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILE_CLASSIFICATION], -1);
+      tiles->numberOfTiles = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_TILES], -1);
+      tiles->numberOfAttributes = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_ATTR], -1);
+      tiles->attribute = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], -1);
+    }
+}
+
+static void
+gribapi_get_string(grib_handle *gh, const char *key, char *string, size_t length)
+{
+  string[0] = 0;
+
+  int ret = grib_get_string(gh, key, string, &length);
+  if (ret != 0)
+    {
+      fprintf(stderr, "grib_get_string(gh, \"%s\", ...) failed!\n", key);
+      GRIB_CHECK(ret, 0);
+    }
+  // clang-format off
+  if      (length == 8 && memcmp(string, "unknown", length) == 0) string[0] = 0;
+  else if (length == 2 && memcmp(string, "~", length) == 0)       string[0] = 0;
+  // clang-format on
+}
+
+static void
+param_to_name(int param, char *name)
+{
+  int pdis, pcat, pnum;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+  if (pdis == 255)
+    {
+      snprintf(name, 256, "code%d", pnum);
+    }
+  else
+    {
+      snprintf(name, 256, "param%d.%d.%d", pnum, pcat, pdis);
+    }
+}
+
+static int
+gribapiGetEnsembleInfo(grib_handle *gh, long *numberOfForecastsInEnsemble, long *perturbationNumber, long *typeOfEnsembleForecast)
+{
+  int status = 0;
+  if (grib_get_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble) == 0)
+    {
+      if (*numberOfForecastsInEnsemble > 0) status = 1;
+      grib_get_long(gh, "perturbationNumber", perturbationNumber);
+      grib_get_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast);
+    }
+
+  if (status == 0)
+    {
+      *numberOfForecastsInEnsemble = -1;
+      *perturbationNumber = -1;
+      *typeOfEnsembleForecast = -1;
+    }
+
+  return status;
+}
+
+static VarScanKeys
+gribapiGetScanKeys(grib_handle *gh)
+{
+  VarScanKeys scanKeys;
+  varScanKeysInit(&scanKeys);
+
+  long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1;
+  gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast);
+  scanKeys.perturbationNumber = (short) perturbationNumber;
+
+  long typeOfGeneratingProcess = 0;
+  if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0)
+    scanKeys.typeOfGeneratingProcess = (short) typeOfGeneratingProcess;
+
+  return scanKeys;
+}
+
+static void
+gribapiGetNameKeys(grib_handle *gh, int varID)
+{
+  char string[CDI_MAX_NAME];
+
+  size_t vlen = CDI_MAX_NAME;
+  gribapi_get_string(gh, "name", string, vlen);  // longname
+  if (string[0]) varDefKeyString(varID, CDI_KEY_LONGNAME, string);
+
+  gribapi_get_string(gh, "units", string, vlen);
+  if (string[0]) varDefKeyString(varID, CDI_KEY_UNITS, string);
+
+  string[0] = 0;
+  int status = grib_get_string(gh, "cfName", string, &vlen);
+  if (status != 0 || vlen <= 1 || strncmp(string, "unknown", 7) == 0) string[0] = 0;
+  if (string[0]) varDefKeyString(varID, CDI_KEY_STDNAME, string);
+}
+
+static void
+gribapiGetKeys(grib_handle *gh, int varID)
+{
+  long tablesVersion = 0;
+  if (grib_get_long(gh, "tablesVersion", &tablesVersion) == 0) varDefKeyInt(varID, CDI_KEY_TABLESVERSION, (int) tablesVersion);
+
+  long localTablesVersion = 0;
+  if (grib_get_long(gh, "localTablesVersion", &localTablesVersion) == 0)
+    varDefKeyInt(varID, CDI_KEY_LOCALTABLESVERSION, (int) localTablesVersion);
+
+  long typeOfGeneratingProcess = 0;
+  if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0)
+    varDefKeyInt(varID, CDI_KEY_TYPEOFGENERATINGPROCESS, (int) typeOfGeneratingProcess);
+
+  long productDefinitionTemplate = 0;
+  if (grib_get_long(gh, "productDefinitionTemplateNumber", &productDefinitionTemplate) == 0)
+    varDefKeyInt(varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, (int) productDefinitionTemplate);
+
+  long typeOfProcessedData = 0;
+  if (grib_get_long(gh, "typeOfProcessedData", &typeOfProcessedData) == 0)
+    varDefKeyInt(varID, CDI_KEY_TYPEOFPROCESSEDDATA, (int) typeOfProcessedData);
+
+  long shapeOfTheEarth = 0;
+  if (grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth) == 0)
+    varDefKeyInt(varID, CDI_KEY_SHAPEOFTHEEARTH, (int) shapeOfTheEarth);
+
+  long backgroundProcess = 0;
+  if (grib_get_long(gh, "backgroundProcess", &backgroundProcess) == 0)
+    varDefKeyInt(varID, CDI_KEY_BACKGROUNDPROCESS, (int) backgroundProcess);
+
+  long typeOfTimeIncrement = 0;
+  if (grib_get_long(gh, "typeOfTimeIncrement", &typeOfTimeIncrement) == 0)
+    varDefKeyInt(varID, CDI_KEY_TYPEOFTIMEINCREMENT, (int) typeOfTimeIncrement);
+  /*
+  long constituentType = 0;
+  if ( grib_get_long(gh, "constituentType", &constituentType) == 0 )
+    varDefKeyInt(varID, CDI_KEY_CONSTITUENTTYPE, (int) constituentType);
+  */
+
+  /*
+    Get the ensemble information from the grib-2 Tables and update the intermediate datastructure.
+    Further update to the "vlist" is handled in the same way as for GRIB-1 by "cdi_generate_vars"
+  */
+  long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1;
+  gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast);
+  if (numberOfForecastsInEnsemble > 0)
+    {
+      varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, (int) numberOfForecastsInEnsemble);
+      varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, (int) perturbationNumber);
+      if (typeOfEnsembleForecast != -1) varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, (int) typeOfEnsembleForecast);
+    }
+
+  long section2Length = 0;
+  int status = grib_get_long(gh, "section2Length", &section2Length);
+  if (status == 0 && section2Length > 0)
+    {
+      long grib2LocalSectionNumber;
+      long mpimType, mpimClass, mpimUser;
+      status = grib_get_long(gh, "grib2LocalSectionNumber", &grib2LocalSectionNumber);
+      if (status == 0)
+        {
+          size_t section2PaddingLength = 0;
+          status = grib_get_size(gh, "section2Padding", &section2PaddingLength);
+          if (status == 0 && section2PaddingLength > 0)
+            {
+              varDefKeyInt(varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, (int) grib2LocalSectionNumber);
+              varDefKeyInt(varID, CDI_KEY_SECTION2PADDINGLENGTH, (int) section2PaddingLength);
+              unsigned char *section2Padding = (unsigned char *) Malloc(section2PaddingLength);
+              grib_get_bytes(gh, "section2Padding", section2Padding, &section2PaddingLength);
+              varDefKeyBytes(varID, CDI_KEY_SECTION2PADDING, section2Padding, (int) section2PaddingLength);
+              Free(section2Padding);
+            }
+          else if (grib_get_long(gh, "mpimType", &mpimType) == 0 && grib_get_long(gh, "mpimClass", &mpimClass) == 0
+                   && grib_get_long(gh, "mpimUser", &mpimUser) == 0)
+            {
+              varDefKeyInt(varID, CDI_KEY_MPIMTYPE, (int) mpimType);
+              varDefKeyInt(varID, CDI_KEY_MPIMCLASS, (int) mpimClass);
+              varDefKeyInt(varID, CDI_KEY_MPIMUSER, (int) mpimUser);
+
+              size_t revNumLen = 20;
+              unsigned char revNumber[revNumLen];
+              if (grib_get_bytes(gh, "revNumber", revNumber, &revNumLen) == 0)
+                varDefKeyBytes(varID, CDI_KEY_REVNUMBER, revNumber, (int) revNumLen);
+
+              long revStatus;
+              grib_get_long(gh, "revStatus", &revStatus);
+              varDefKeyInt(varID, CDI_KEY_REVSTATUS, (int) revStatus);
+            }
+        }
+    }
+}
+
+static void
+gribapiDefProjRLL(grib_handle *gh, int gridID)
+{
+  double xpole = 0, ypole = 0, angle = 0;
+  grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &ypole);
+  grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &xpole);
+  grib_get_double(gh, "angleOfRotation", &angle);
+  xpole -= 180;
+  if (fabs(ypole) > 0) ypole = -ypole;  // change from south to north pole
+  if (fabs(angle) > 0) angle = -angle;
+
+  gridDefParamRLL(gridID, xpole, ypole, angle);
+}
+
+static void
+decode_shapeOfTheEarth(grib_handle *gh, struct CDI_GridProjParams *gpp)
+{
+  long shapeOfTheEarth = 0;
+  grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth);
+
+  double radiusOfTheEarth = 6367470.0;
+  if (shapeOfTheEarth == 1) grib_get_double(gh, "radiusOfTheEarth", &radiusOfTheEarth);
+
+  // clang-format off
+  switch (shapeOfTheEarth)
+    {
+    case 0:   gpp->a = radiusOfTheEarth; break;
+    case 1:   gpp->a = radiusOfTheEarth; break;
+    case 2:   gpp->a = 6378160.0; gpp->b = 6356775.0;   gpp->rf = 297.0; break;
+    case 4:   gpp->a = 6378137.0; gpp->b = 6356752.314; gpp->rf = 298.257222101; break;
+    case 6:   gpp->a = 6371229.0; break;
+    case 8:   gpp->a = 6371200.0; break;
+    default:  gpp->a = radiusOfTheEarth;
+    }
+  // clang-format on
+}
+
+static void
+gribapiDefProjLCC(grib_handle *gh, int gridID)
+{
+  struct CDI_GridProjParams gpp;
+  gridProjParamsInit(&gpp);
+
+  decode_shapeOfTheEarth(gh, &gpp);
+
+  long projflag = 0;
+  grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0);
+  grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0);
+  grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &gpp.x_SP);
+  grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &gpp.y_SP);
+  grib_get_double(gh, "LoVInDegrees", &gpp.lon_0);
+  grib_get_double(gh, "Latin1InDegrees", &gpp.lat_1);
+  grib_get_double(gh, "Latin2InDegrees", &gpp.lat_2);
+  grib_get_long(gh, "projectionCentreFlag", &projflag);
+  bool isSouthPole = gribbyte_get_bit((int) projflag, 1);
+  if (isSouthPole)
+    {
+      gpp.lat_1 = -gpp.lat_1;
+      gpp.lat_2 = -gpp.lat_2;
+    }
+
+  gpp.lat_0 = gpp.lat_2;
+
+  if (proj_lonlat_to_lcc_func)
+    {
+      double x_0 = gpp.xval_0, y_0 = gpp.yval_0;
+      proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0);
+      if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv))
+        {
+          gpp.x_0 = -x_0;
+          gpp.y_0 = -y_0;
+        }
+    }
+
+  gridDefParamsLCC(gridID, gpp);
+}
+
+static void
+gribapiDefProjSTERE(grib_handle *gh, int gridID)
+{
+  struct CDI_GridProjParams gpp;
+  gridProjParamsInit(&gpp);
+
+  decode_shapeOfTheEarth(gh, &gpp);
+
+  grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0);
+  grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0);
+  grib_get_double(gh, "LaDInDegrees", &gpp.lat_1);
+  grib_get_double(gh, "orientationOfTheGridInDegrees", &gpp.lon_0);
+
+  long southPoleOnProjectionPlane;
+  grib_get_long(gh, "southPoleOnProjectionPlane", &southPoleOnProjectionPlane);
+  gpp.lat_0 = southPoleOnProjectionPlane ? -90.0 : 90.0;
+
+  if (proj_lonlat_to_stere_func)
+    {
+      double x_0 = gpp.xval_0, y_0 = gpp.yval_0;
+      proj_lonlat_to_stere_func(gpp, (size_t) 1, &x_0, &y_0);
+      if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv))
+        {
+          gpp.x_0 = -x_0;
+          gpp.y_0 = -y_0;
+        }
+    }
+
+  gridDefParamsSTERE(gridID, gpp);
+}
+
+static void
+gribapiDefProjHEALPIX(grib_handle *gh, int gridID)
+{
+  struct CDI_GridProjParams gpp;
+  gridProjParamsInit(&gpp);
+
+  decode_shapeOfTheEarth(gh, &gpp);
+
+  long lval = -1;
+  grib_get_long(gh, "Nside", &lval);
+  gpp.nside = (int) lval;
+  lval = -1;
+  grib_get_long(gh, "ordering", &lval);
+  gpp.order = (int) lval;
+
+  gridDefParamsHEALPIX(gridID, gpp);
+}
+
+static void
+gribapiAddRecord(stream_t *streamptr, int param, grib_handle *gh, size_t recsize, off_t position, int datatype, int comptype,
+                 const char *varname, int leveltype1, int leveltype2, int lbounds, int level1, int level2, int level_sf,
+                 int level_unit, VarScanKeys *scanKeys, const var_tile_t *tiles, bool lread_additional_keys, int fdbItemIndex)
+{
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int recID = recordNewEntry(streamptr, tsID);
+  record_t *record = &streamptr->tsteps[tsID].records[recID];
+
+  int tsteptype = gribapiGetTsteptype(gh);
+
+  // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype1);
+
+  record->size = recsize;
+  record->position = position;
+  record->param = param;
+  record->ilevel = level1;
+  record->ilevel2 = level2;
+  record->ltype = leveltype1;
+  record->tsteptype = (short) tsteptype;
+  record->gridsize = gribapiGetGridsize(gh);
+  record->scanKeys = *scanKeys;
+  record->tiles = tiles ? *tiles : dummy_tiles;
+#ifdef HAVE_LIBFDB5
+  record->fdbItemIndex = fdbItemIndex;
+#else
+  (void) fdbItemIndex;
+#endif
+
+  strncpy(record->varname, varname, sizeof(record->varname) - 1);
+  record->varname[sizeof(record->varname) - 1] = 0;
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+
+  // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+  CdiQuery *query = streamptr->query;
+  if (query && cdiQueryName(query, varname) < 0)
+    {
+      record->used = false;
+      return;
+    }
+
+  // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+  grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr));
+  bool uvRelativeToGrid = gribapiGetGrid(gh, gridptr);
+
+  struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0);
+  int gridID = gridAdded.Id;
+  // clang-format off
+  if (!gridAdded.isNew)
+    {
+      grid_free(gridptr);
+      Free(gridptr);
+    }
+  else if (gridptr->projtype == CDI_PROJ_RLL)     gribapiDefProjRLL(gh, gridID);
+  else if (gridptr->projtype == CDI_PROJ_LCC)     gribapiDefProjLCC(gh, gridID);
+  else if (gridptr->projtype == CDI_PROJ_STERE)   gribapiDefProjSTERE(gh, gridID);
+  else if (gridptr->projtype == CDI_PROJ_HEALPIX) gribapiDefProjHEALPIX(gh, gridID);
+  // clang-format on
+
+  int zaxistype = gribapi_get_zaxis_type(gribEditionNumber(gh), leveltype1);
+
+  switch (zaxistype)
+    {
+    case ZAXIS_HYBRID:
+    case ZAXIS_HYBRID_HALF:
+      {
+        long lpar;
+        GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0);
+        /* FIXME: assert(lpar >= 0) */
+        size_t vctsize = (size_t) lpar;
+        if (vctsize > 0)
+          {
+            double *vctptr = (double *) Malloc(vctsize * sizeof(double));
+            size_t dummy = vctsize;
+            GRIB_CHECK(grib_get_double_array(gh, "pv", vctptr, &dummy), 0);
+            varDefVCT(vctsize, vctptr);
+            Free(vctptr);
+          }
+        break;
+      }
+    case ZAXIS_REFERENCE:
+      {
+        unsigned char uuid[CDI_UUID_SIZE];
+        long lpar;
+        GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0);
+        // if (lpar != 6) fprintf(stderr, "Warning ...\n");
+        GRIB_CHECK(grib_get_long(gh, "nlev", &lpar), 0);
+        int nhlev = (int) lpar;
+        GRIB_CHECK(grib_get_long(gh, "numberOfVGridUsed", &lpar), 0);
+        int nvgrid = (int) lpar;
+        size_t len = (size_t) CDI_UUID_SIZE;
+        memset(uuid, 0, CDI_UUID_SIZE);
+        GRIB_CHECK(grib_get_bytes(gh, "uuidOfVGrid", uuid, &len), 0);
+        varDefZAxisReference(nhlev, nvgrid, uuid);
+        break;
+      }
+    }
+
+  // if ( datatype > 32 ) datatype = CDI_DATATYPE_PACK32;
+  if (datatype < 0) datatype = CDI_DATATYPE_PACK;
+
+  // add the previously read record data to the (intermediate) list of records
+  int tile_index = 0;
+  int varID = 0, levelID = 0;
+  varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, level_sf, level_unit, datatype, &varID, &levelID,
+               tsteptype, leveltype1, leveltype2, varname, scanKeys, tiles, &tile_index);
+
+  record->varID = (short) varID;
+  record->levelID = levelID;
+
+  varDefCompType(varID, comptype);
+
+  if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1);
+
+  if (varname[0]) gribapiGetNameKeys(gh, varID);
+  gribapiGetKeys(gh, varID);
+
+  if (lread_additional_keys)
+    {
+      long lval;
+      double dval;
+      for (int i = 0; i < cdiNAdditionalGRIBKeys; i++)
+        {
+          // note: if the key is not defined, we do not throw an error!
+          if (grib_get_long(gh, cdiAdditionalGRIBKeys[i], &lval) == 0)
+            varDefOptGribInt(varID, tile_index, lval, cdiAdditionalGRIBKeys[i]);
+          if (grib_get_double(gh, cdiAdditionalGRIBKeys[i], &dval) == 0)
+            varDefOptGribDbl(varID, tile_index, dval, cdiAdditionalGRIBKeys[i]);
+        }
+    }
+
+  if (varInqInst(varID) == CDI_UNDEFID)
+    {
+      long center, subcenter;
+      GRIB_CHECK(grib_get_long(gh, "centre", &center), 0);
+      GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter), 0);
+      int instID = institutInq((int) center, (int) subcenter, NULL, NULL);
+      if (instID == CDI_UNDEFID) instID = institutDef((int) center, (int) subcenter, NULL, NULL);
+      varDefInst(varID, instID);
+    }
+
+  if (varInqModel(varID) == CDI_UNDEFID)
+    {
+      long processID;
+      if (grib_get_long(gh, "generatingProcessIdentifier", &processID) == 0)
+        {
+          /* FIXME: assert(processID >= INT_MIN && processID <= INT_MAX) */
+          int modelID = modelInq(varInqInst(varID), (int) processID, NULL);
+          if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), (int) processID, NULL);
+          varDefModel(varID, modelID);
+        }
+    }
+
+  if (varInqTable(varID) == CDI_UNDEFID)
+    {
+      int pdis, pcat, pnum;
+      cdiDecodeParam(param, &pnum, &pcat, &pdis);
+
+      if (pdis == 255)
+        {
+          int tabnum = pcat;
+          int tableID = tableInq(varInqModel(varID), tabnum, NULL);
+          if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), tabnum, NULL);
+          varDefTable(varID, tableID);
+        }
+    }
+
+  if (CDI_Debug)
+    Message("varID = %d  param = %d  zaxistype = %d  gridID = %d  levelID = %d", varID, param, zaxistype, gridID, levelID);
+}
+
+static compvar2_t
+gribapiVarSet(int param, int level1, int level2, int leveltype, int tsteptype, size_t gridsize, char *name, VarScanKeys scanKeys,
+              var_tile_t tiles_data)
+{
+  compvar2_t compVar;
+  memset(&compVar, 0, sizeof(compvar2_t));
+  size_t maxlen = sizeof(compVar.name);
+  size_t len = strlen(name);
+  if (len > maxlen) len = maxlen;
+
+  compVar.param = param;
+  compVar.level1 = level1;
+  compVar.level2 = level2;
+  compVar.ltype = leveltype;
+  compVar.tsteptype = tsteptype;
+  compVar.gridsize = gridsize;
+  // memset(compVar.name, 0, maxlen);
+  memcpy(compVar.name, name, len);
+  compVar.scanKeys = scanKeys;
+  compVar.tiles = tiles_data;
+
+  return compVar;
+}
+
+static int
+gribapiVarCompare(const compvar2_t *compVar, const record_t *record, int flag)
+{
+  compvar2_t compVar0;
+  memset(&compVar0, 0, sizeof(compvar2_t));
+  compVar0.param = record->param;
+  compVar0.level1 = record->ilevel;
+  compVar0.level2 = record->ilevel2;
+  compVar0.ltype = record->ltype;
+  compVar0.tsteptype = record->tsteptype;
+  compVar0.gridsize = record->gridsize;
+  memcpy(compVar0.name, record->varname, sizeof(compVar->name));
+
+  if (flag == 0)
+    {
+      if (compVar0.tsteptype == TSTEP_INSTANT && compVar->tsteptype == TSTEP_INSTANT3) compVar0.tsteptype = TSTEP_INSTANT3;
+      if (compVar0.tsteptype == TSTEP_INSTANT3 && compVar->tsteptype == TSTEP_INSTANT) compVar0.tsteptype = TSTEP_INSTANT;
+    }
+
+  compVar0.scanKeys = record->scanKeys;
+  compVar0.tiles = record->tiles;
+
+  // printf("var1: level1=%d level2=%d\n", compVar.level1, compVar.level2);
+  // printf("var2: level1=%d level2=%d\n", compVar0.level1, compVar0.level2);
+
+  return memcmp(&compVar0, compVar, sizeof(compvar2_t));
+}
+
+static grib_handle *
+gribapiGetDiskRepresentation(size_t recsize, size_t *buffersize, void **gribbuffer, int *outDatatype, int *outCompressionType)
+{
+  int gribversion = (int) ((char *) *gribbuffer)[7];
+
+  if (gribversion <= 1) *outCompressionType = grbDecompress(recsize, buffersize, gribbuffer);
+
+  grib_handle *gh = grib_handle_new_from_message(NULL, *gribbuffer, recsize);
+
+  bool lieee = false;
+
+  if (gribversion > 1)
+    {
+      size_t len = 256;
+      char typeOfPacking[256];
+      if (grib_get_string(gh, "packingType", typeOfPacking, &len) == 0)
+        {
+          // fprintf(stderr, "packingType %zu %s\n", len, typeOfPacking);
+          if (strncmp(typeOfPacking, "grid_jpeg", len) == 0)
+            *outCompressionType = CDI_COMPRESS_JPEG;
+          else if (strncmp(typeOfPacking, "grid_ccsds", len) == 0)
+            *outCompressionType = CDI_COMPRESS_AEC;
+          else if (strncmp(typeOfPacking, "grid_ieee", len) == 0)
+            lieee = true;
+        }
+    }
+
+  if (lieee)
+    {
+      long precision;
+      int status = grib_get_long(gh, "precision", &precision);
+      *outDatatype = (status == 0 && precision == 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64;
+    }
+  else
+    {
+      *outDatatype = CDI_DATATYPE_PACK;
+      long bitsPerValue;
+      if (grib_get_long(gh, "bitsPerValue", &bitsPerValue) == 0)
+        {
+          if (bitsPerValue > 0 && bitsPerValue <= 32) *outDatatype = (int) bitsPerValue;
+        }
+    }
+
+  return gh;
+}
+
+typedef enum
+{
+  CHECKTIME_OK,
+  CHECKTIME_SKIP,
+  CHECKTIME_STOP,
+  CHECKTIME_INCONSISTENT
+} checkTimeResult;
+
+static checkTimeResult
+checkTime(stream_t *streamptr, const compvar2_t *compVar, CdiDateTime verificationTime, CdiDateTime expectedVTime)
+{
+  // First determine whether the current record exists already.
+  int recID = 0;
+  for (; recID < streamptr->nrecs; recID++)
+    {
+      if (gribapiVarCompare(compVar, &streamptr->tsteps[0].records[recID], 1) == 0) break;
+    }
+  bool recordExists = (recID < streamptr->nrecs);
+
+  // Then we need to know whether the verification time is consistent.
+  bool consistentTime = cdiDateTime_isEQ(verificationTime, expectedVTime);
+
+  // Finally, we make a decision.
+  if (CDI_Inventory_Mode == 1)
+    {
+      if (recordExists) return CHECKTIME_STOP;
+      if (!consistentTime) return CHECKTIME_INCONSISTENT;
+    }
+  else
+    {
+      if (!consistentTime) return CHECKTIME_STOP;
+      if (recordExists) return CHECKTIME_SKIP;
+    }
+
+  return CHECKTIME_OK;
+}
+
+#define gribWarning(text, nrecs, timestep, varname, param, level1, level2)                                                      \
+  do                                                                                                                            \
+    {                                                                                                                           \
+      char paramstr[32];                                                                                                        \
+      cdiParamToString(param, paramstr, sizeof(paramstr));                                                                      \
+      Warning("Record %2d (name=%s id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, varname, paramstr, level1, level2, timestep, \
+              text);                                                                                                            \
+    }                                                                                                                           \
+  while (0)
+
+#ifdef HAVE_LIBFDB5
+
+int
+fdbScanTimesteps(stream_t *streamptr)
+{
+  void *gribbuffer = NULL;
+  size_t buffersize = 0;
+  grib_handle *gh = NULL;
+
+  fdb_handle_t *fdbHandle = streamptr->protocolData;
+
+  fdb_request_t *request = cdi_create_fdb_request(streamptr->filename);
+
+  fdbKeyValueEntry *keyValueList = NULL;
+  int numItems = cdi_fdb_fill_kvlist(fdbHandle, request, &keyValueList);
+  fdb_delete_request(request);
+  if (numItems == 0) Error("FDB request doesn't find any database entries!");
+  if (CDI_Debug)
+    {
+      printf("Original FDB items:\n");
+      print_keyvalueList(numItems, keyValueList);
+    }
+
+  // if (check_keyvalueList(numItems, keyValueList) != 0) return CDI_EUFSTRUCT;
+
+  RecordInfoEntry *recordInfoList = (RecordInfoEntry *) malloc(numItems * sizeof(RecordInfoEntry));
+  if (decode_keyvalue(numItems, keyValueList, recordInfoList) != 0) return CDI_EUFSTRUCT;
+
+  cdi_fdb_sort_datetime(numItems, recordInfoList);
+
+  if (CDI_Debug)
+    {
+      printf("Sorted FDB items:\n");
+      print_keyvalueList_sorted(numItems, keyValueList, recordInfoList);
+    }
+
+  int numRecords = get_num_records(numItems, recordInfoList);
+  if (numRecords == 0) return CDI_EUFSTRUCT;
+
+  int numTimesteps = numItems / numRecords;
+  if (CDI_Debug) Message("numRecords=%d  numTimesteps=%d", numRecords, numTimesteps);
+
+  int *timestepRecordOffset = (int *) malloc(numTimesteps * sizeof(int));
+  for (int i = 0; i < numTimesteps; i++) timestepRecordOffset[i] = i * numRecords;
+  numTimesteps = remove_duplicate_timesteps(recordInfoList, numRecords, numTimesteps, timestepRecordOffset);
+  if (CDI_Debug) Message("numRecords=%d  numTimesteps=%d", numRecords, numTimesteps);
+  // Message("numRecords=%d  numTimesteps=%d", numRecords, numTimesteps);
+
+  // CdiDateTime vDateTime0;
+  // cdiDateTime_init(&vDateTime0);
+  int fcast = 0;
+
+  streamptr->curTsID = 0;
+
+  int tsIDnew = tstepsNewEntry(streamptr);
+  if (tsIDnew != 0) Error("Internal problem! tstepsNewEntry returns %d", tsIDnew);
+
+  taxis_t *taxis = &streamptr->tsteps[tsIDnew].taxis;
+
+  for (int recID = 0; recID < numRecords; recID++)
+    {
+      int fdbItem = recordInfoList[recID].fdbIndex;
+      int vdate = recordInfoList[recID].date;
+      int vtime = recordInfoList[recID].time * 100;
+
+      long recsize = cdi_fdb_read_record(fdbHandle, &keyValueList[fdbItem], &buffersize, &gribbuffer);
+
+      int datatype, comptype = 0;
+      gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype);
+
+      GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0);
+
+      int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit;
+      var_tile_t tiles = dummy_tiles;
+      int level1 = 0, level2 = 0;
+      grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
+
+      char varname[256];
+      gribapi_get_string(gh, "shortName", varname, sizeof(varname));
+
+      int param = gribapiGetParam(gh);
+
+      CdiDateTime sDateTime;
+      // CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
+      CdiDateTime vDateTime = cdiDateTime_set(vdate, vtime);
+      sDateTime = vDateTime;
+
+      VarScanKeys scanKeys = gribapiGetScanKeys(gh);
+
+      if (recID == 0)
+        {
+          // vDateTime0 = vDateTime;
+          taxis->rDateTime = gribapiGetDataDateTime(gh);
+          fcast = gribapiTimeIsFC(gh);
+          if (fcast) taxis->unit = gribapi_get_timeunits(gh);
+          taxis->fDateTime = taxis->rDateTime;
+          taxis->sDateTime = sDateTime;
+          taxis->vDateTime = vDateTime;
+        }
+
+      if (CDI_Debug)
+        {
+          char paramstr[32];
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+          Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", recID + 1, varname, paramstr, leveltype1, level1,
+                  level2, CdiDateTime_string(vDateTime));
+        }
+
+      var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
+      int recpos = 0;
+      gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1,
+                       level2, level_sf, level_unit, &scanKeys, ptiles, true, fdbItem);
+
+      grib_handle_delete(gh);
+      gh = NULL;
+    }
+
+  if (gh) grib_handle_delete(gh);
+
+  cdi_generate_vars(streamptr);
+
+  taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE;
+  int taxisID = taxisCreate(taxis->type);
+
+  vlistDefTaxis(streamptr->vlistID, taxisID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamptr->record->buffer = gribbuffer;
+  streamptr->record->buffersize = buffersize;
+
+  if (numTimesteps == 1) streamptr->ntsteps = 1;
+  streamScanTimeConstAdjust(streamptr, taxis);
+
+  for (int tsID = 1; tsID < numTimesteps; tsID++)
+    {
+      int recordOffset = timestepRecordOffset[tsID];
+      int vdate = recordInfoList[recordOffset].date;
+      int vtime = recordInfoList[recordOffset].time * 100;
+      // printf("timestep=%d recOffset=%d date=%d time=%d\n", tsID + 1, recordOffset, vdate, vtime);
+
+      int tsIDnext = tstepsNewEntry(streamptr);
+      if (tsIDnext != tsID) Error("Internal error. tsID = %d", tsID);
+
+      streamptr->tsteps[tsID - 1].next = true;
+      streamptr->tsteps[tsID].position = 0;
+
+      taxis = &streamptr->tsteps[tsID].taxis;
+
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      int nrecs = (tsID == 1) ? streamScanInitRecords2(streamptr) : streamScanInitRecords(streamptr, tsID);
+      if (nrecs != numRecords) Error("Internal error. nrecs = %d", nrecs);
+
+      taxis->vDateTime = cdiDateTime_set(vdate, vtime);
+
+      int rindex = 0;
+      for (int recID = 0; recID < numRecords; recID++)
+        {
+          records[recID].used = true;
+          streamptr->tsteps[tsID].recIDs[rindex] = recID;
+          rindex++;
+
+          records[recID].position = 0;
+          records[recID].size = 0;
+          records[recID].fdbItemIndex = recordInfoList[recordOffset + recID].fdbIndex;
+        }
+
+      if (tsID == 1) streamptr->tsteps[1].nrecs = numRecords;
+    }
+
+  streamptr->rtsteps = numTimesteps;
+  streamptr->ntsteps = numTimesteps;
+
+  streamptr->fdbNumItems = numItems;
+  streamptr->fdbKeyValueList = keyValueList;
+
+  if (recordInfoList) free(recordInfoList);
+  if (timestepRecordOffset) free(timestepRecordOffset);
+
+  return 0;
+}
+#endif
+
+static int
+records_cmp_varname(const void *s1, const void *s2)
+{
+  const record_t *x = (const record_t *) s1, *y = (const record_t *) s2;
+  return strcmp(x->varname, y->varname);
+}
+
+void
+sort_records(stream_t *streamptr)
+{
+  record_t *records = streamptr->tsteps[0].records;
+  size_t numRecords = (size_t) streamptr->tsteps[0].recordSize;
+  qsort(records, numRecords, sizeof(records[0]), records_cmp_varname);
+}
+
+long
+gribapiScanTimestep1(stream_t *streamptr)
+{
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
+  off_t recpos = 0;
+  void *gribbuffer = NULL;
+  size_t buffersize = 0;
+  int nrecsScanned = 0;  // Only used for debug output.
+  bool warn_time = true;
+  int fcast = 0;
+  grib_handle *gh = NULL;
+
+  streamptr->curTsID = 0;
+
+  int tsID = tstepsNewEntry(streamptr);
+  if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int fileID = streamptr->fileID;
+
+  unsigned nrecs = 0;
+  while (true)
+    {
+      size_t recsize = gribGetSize(fileID);
+      recpos = fileGetPos(fileID);
+
+      if (recsize == 0)
+        {
+          streamptr->ntsteps = 1;
+          break;
+        }
+
+      ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+      size_t readsize = recsize;
+      // Search for next 'GRIB', read the following record, and position file offset after it.
+      if (gribRead(fileID, gribbuffer, &readsize)) break;
+
+      nrecsScanned++;
+
+      int datatype, comptype = 0;
+      gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype);
+
+      GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0);
+
+      int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit;
+      var_tile_t tiles = dummy_tiles;
+      int level1 = 0, level2 = 0;
+      grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
+
+      char varname[256];
+      gribapi_get_string(gh, "shortName", varname, sizeof(varname));
+
+      int param = gribapiGetParam(gh);
+
+      if (!varname[0]) param_to_name(param, varname);
+
+      CdiDateTime sDateTime;
+      CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
+
+      VarScanKeys scanKeys = gribapiGetScanKeys(gh);
+
+      if (nrecs == 0)
+        {
+          vDateTime0 = vDateTime;
+          taxis->rDateTime = gribapiGetDataDateTime(gh);
+          fcast = gribapiTimeIsFC(gh);
+          if (fcast) taxis->unit = gribapi_get_timeunits(gh);
+          taxis->fDateTime = taxis->rDateTime;
+          taxis->sDateTime = sDateTime;
+          taxis->vDateTime = vDateTime;
+        }
+      else
+        {
+          if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+
+          int tsteptype = gribapiGetTsteptype(gh);
+          size_t gridsize = gribapiGetGridsize(gh);
+          compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles);
+          checkTimeResult result = checkTime(streamptr, &compVar, vDateTime, vDateTime0);
+          if (result == CHECKTIME_STOP)
+            {
+              nrecsScanned--;
+              break;
+            }
+          else if (result == CHECKTIME_SKIP)
+            {
+              gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+              continue;
+            }
+          else if (result == CHECKTIME_INCONSISTENT && warn_time)
+            {
+              gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+              warn_time = false;
+            }
+          assert(result == CHECKTIME_OK || result == CHECKTIME_INCONSISTENT);
+        }
+
+      nrecs++;
+
+      if (CDI_Debug)
+        {
+          char paramstr[32];
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+          Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecs, (int) recpos, varname, paramstr, leveltype1,
+                  level1, level2, CdiDateTime_string(vDateTime));
+        }
+
+      var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL;
+      gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1,
+                       level2, level_sf, level_unit, &scanKeys, ptiles, true, -1);
+
+      grib_handle_delete(gh);
+      gh = NULL;
+    }
+
+  if (gh) grib_handle_delete(gh);
+
+  streamptr->rtsteps = 1;
+
+  if (nrecs == 0) return CDI_EUFSTRUCT;
+
+  if (streamptr->query)
+    {
+      int numEntries = cdiQueryNumEntries(streamptr->query);
+      int numEntriesFound = cdiQueryNumEntriesFound(streamptr->query);
+      cdiQueryPrintEntriesNotFound(streamptr->query);
+      if (numEntriesFound == 0 || (CDI_Query_Abort && numEntries != numEntriesFound)) return CDI_EQENF;
+    }
+
+  cdi_generate_vars(streamptr);
+
+  taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE;
+  int taxisID = taxisCreate(taxis->type);
+
+  int vlistID = streamptr->vlistID;
+  vlistDefTaxis(vlistID, taxisID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamptr->record->buffer = gribbuffer;
+  streamptr->record->buffersize = buffersize;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+  streamScanTimeConstAdjust(streamptr, taxis);
+
+  if (streamptr->sortname) sort_records(streamptr);
+
+  return 0;
+}
+
+long
+gribapiScanTimestep2(stream_t *streamptr)
+{
+  CdiDateTime vDateTime0;
+  cdiDateTime_init(&vDateTime0);
+  int rstatus = 0;
+  off_t recpos = 0;
+  // int gridID;
+  int recID;
+  grib_handle *gh = NULL;
+
+  streamptr->curTsID = 1;
+
+  int fileID = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+
+  void *gribbuffer = streamptr->record->buffer;
+  size_t buffersize = streamptr->record->buffersize;
+
+  int tsID = streamptr->rtsteps;
+  if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+  cdi_create_records(streamptr, tsID);
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  int nrecords = streamScanInitRecords2(streamptr);
+
+  int nrecsScanned = nrecords;  // Only used for debug output
+  for (int rindex = 0; rindex <= nrecords; ++rindex)
+    {
+      size_t recsize = gribGetSize(fileID);
+      recpos = fileGetPos(fileID);
+      if (recsize == 0)
+        {
+          streamptr->ntsteps = 2;
+          break;
+        }
+
+      ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+      size_t readsize = recsize;
+      if (gribRead(fileID, gribbuffer, &readsize)) break;
+
+      grbDecompress(recsize, &buffersize, &gribbuffer);
+
+      nrecsScanned++;
+      gh = grib_handle_new_from_message(NULL, gribbuffer, recsize);
+      GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0);
+
+      int level1 = 0, level2 = 0, leveltype1, leveltype2, lbounds, level_sf, level_unit;
+      var_tile_t tiles = dummy_tiles;
+      grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
+
+      char varname[256];
+      gribapi_get_string(gh, "shortName", varname, sizeof(varname));
+
+      int param = gribapiGetParam(gh);
+
+      if (!varname[0]) param_to_name(param, varname);
+
+      CdiDateTime sDateTime;
+      CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
+
+      if (rindex == 0)
+        {
+          vDateTime0 = vDateTime;
+          int taxisID = vlistInqTaxis(vlistID);
+          if (taxisInqType(taxisID) == TAXIS_RELATIVE)
+            {
+              taxis->type = TAXIS_RELATIVE;
+              taxis->unit = gribapi_get_timeunits(gh);
+              taxis->rDateTime = gribapiGetDataDateTime(gh);
+            }
+          else
+            {
+              taxis->type = TAXIS_ABSOLUTE;
+            }
+          taxis->fDateTime = taxis->rDateTime;
+          taxis->vDateTime = vDateTime;
+          taxis->sDateTime = sDateTime;
+        }
+      else
+        {
+          if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+        }
+
+      VarScanKeys scanKeys = gribapiGetScanKeys(gh);
+
+      int tsteptype = gribapiGetTsteptype(gh);
+      size_t gridsize = gribapiGetGridsize(gh);
+      compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles);
+
+      for (recID = 0; recID < nrecords; recID++)
+        if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break;
+
+      if (recID == nrecords)
+        {
+          if (CDI_Inventory_Mode == 1)
+            {
+              gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+              return CDI_EUFSTRUCT;
+            }
+          else
+            {
+              gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+              continue;
+            }
+        }
+
+      if (records[recID].used)
+        {
+          if (CDI_Inventory_Mode == 1)
+            break;
+          else
+            {
+              if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
+
+              gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+              continue;
+            }
+        }
+
+      records[recID].used = true;
+      streamptr->tsteps[tsID].recIDs[rindex] = recID;
+
+      if (CDI_Debug)
+        {
+          char paramstr[32];
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+          Message("%4d %8lld name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecsScanned, (long long) recpos, varname,
+                  paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime));
+        }
+
+      if (gribapiVarCompare(&compVar, &records[recID], 0) != 0)
+        {
+          Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                  records[recID].ilevel, level1);
+          return CDI_EUFSTRUCT;
+        }
+
+      records[recID].position = recpos;
+      records[recID].size = recsize;
+
+      int varID = records[recID].varID;
+
+      if (tsteptype != vlistInqVarTsteptype(vlistID, varID)) vlistDefVarTsteptype(vlistID, varID, tsteptype);
+
+      grib_handle_delete(gh);
+      gh = NULL;
+    }
+
+  if (gh) grib_handle_delete(gh);
+
+  int nrecs = 0;
+  for (recID = 0; recID < nrecords; recID++)
+    {
+      if (records[recID].used)
+        nrecs++;
+      else
+        vlistDefVarTimetype(vlistID, records[recID].varID, TIME_CONSTANT);
+    }
+  streamptr->tsteps[tsID].nrecs = nrecs;
+
+  streamptr->rtsteps = 2;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+
+  streamptr->record->buffer = gribbuffer;
+  streamptr->record->buffersize = buffersize;
+
+  return rstatus;
+}
+
+long
+gribapiScanTimestep(stream_t *streamptr)
+{
+  int vrecID, recID = -1;
+  int nrecs = 0;
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->rtsteps;
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  if (streamptr->tsteps[tsID].recordSize == 0)
+    {
+      void *gribbuffer = streamptr->record->buffer;
+      size_t buffersize = streamptr->record->buffersize;
+
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      nrecs = streamScanInitRecords(streamptr, tsID);
+
+      int fileID = streamptr->fileID;
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+      int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1);  // Only used for debug output.
+      off_t recpos = 0;
+      CdiDateTime vDateTime0;
+      cdiDateTime_init(&vDateTime0);
+      grib_handle *gh = NULL;
+      char varname[256];
+      for (int rindex = 0; rindex <= nrecs; ++rindex)
+        {
+          varname[0] = 0;
+          size_t recsize = gribGetSize(fileID);
+          recpos = fileGetPos(fileID);
+          if (recsize == 0)
+            {
+              streamptr->ntsteps = streamptr->rtsteps + 1;
+              break;
+            }
+
+          ensureBufferSize(recsize, &buffersize, &gribbuffer);
+
+          size_t readsize = recsize;
+          if (gribRead(fileID, gribbuffer, &readsize))
+            {
+              Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize);
+              break;
+            }
+
+          grbDecompress(recsize, &buffersize, &gribbuffer);
+
+          nrecsScanned++;
+          gh = grib_handle_new_from_message(NULL, gribbuffer, recsize);
+          GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0);
+
+          int level1 = 0, level2 = 0, leveltype1, leveltype2 = -1, lbounds, level_sf, level_unit;
+          var_tile_t tiles = dummy_tiles;
+          grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles);
+
+          CdiDateTime sDateTime;
+          CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime);
+
+          if (rindex == nrecs) break;
+
+          gribapi_get_string(gh, "shortName", varname, sizeof(varname));
+
+          int param = gribapiGetParam(gh);
+
+          if (!varname[0]) param_to_name(param, varname);
+
+          if (rindex == 0)
+            {
+              vDateTime0 = vDateTime;
+              int taxisID = vlistInqTaxis(vlistID);
+              if (taxisInqType(taxisID) == TAXIS_RELATIVE)
+                {
+                  taxis->type = TAXIS_RELATIVE;
+                  taxis->unit = gribapi_get_timeunits(gh);
+                  taxis->rDateTime = gribapiGetDataDateTime(gh);
+                }
+              else
+                {
+                  taxis->type = TAXIS_ABSOLUTE;
+                }
+              taxis->fDateTime = taxis->rDateTime;
+              taxis->vDateTime = vDateTime;
+              taxis->sDateTime = sDateTime;
+            }
+          else
+            {
+              if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime;
+            }
+
+          VarScanKeys scanKeys = gribapiGetScanKeys(gh);
+
+          int tsteptype = gribapiGetTsteptype(gh);
+          size_t gridsize = gribapiGetGridsize(gh);
+          compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles);
+
+          for (vrecID = 0; vrecID < nrecs; vrecID++)
+            {
+              recID = streamptr->tsteps[1].recIDs[vrecID];
+              if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break;
+            }
+
+          if (vrecID == nrecs)
+            {
+              if (CDI_Inventory_Mode == 1)
+                {
+                  gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+                  return CDI_EUFSTRUCT;
+                }
+              else
+                {
+                  gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1,
+                              level2);
+                  continue;
+                }
+            }
+
+          if (CDI_Inventory_Mode != 1)
+            {
+              if (records[recID].used)
+                {
+                  if (cdiDateTime_isNE(vDateTime, vDateTime0)) break;
+
+                  if (CDI_Debug)
+                    gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2);
+
+                  continue;
+                }
+            }
+
+          records[recID].used = true;
+          streamptr->tsteps[tsID].recIDs[rindex] = recID;
+
+          if (CDI_Debug)
+            Message("%4d %8lld %4d %8d %8s", rindex + 1, (long long) recpos, param, level1, CdiDateTime_string(vDateTime));
+
+          if (gribapiVarCompare(&compVar, &records[recID], 0) != 0)
+            {
+              Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                      records[recID].ilevel, level1);
+              Error("Invalid, unsupported or inconsistent record structure");
+            }
+
+          records[recID].position = recpos;
+          records[recID].size = recsize;
+
+          if (CDI_Debug) Message("%4d %8lld %4d %8d %s", rindex, (long long) recpos, param, level1, CdiDateTime_string(vDateTime));
+
+          grib_handle_delete(gh);
+          gh = NULL;
+        }
+
+      if (gh) grib_handle_delete(gh);
+
+      for (vrecID = 0; vrecID < nrecs; vrecID++)
+        {
+          recID = streamptr->tsteps[tsID].recIDs[vrecID];
+          if (!records[recID].used) break;
+        }
+
+      if (vrecID < nrecs)
+        {
+          gribWarning("Parameter not found!", nrecsScanned, tsID + 1, varname, records[recID].param, records[recID].ilevel,
+                      records[recID].ilevel2);
+          return CDI_EUFSTRUCT;
+        }
+
+      streamptr->rtsteps++;
+
+      if (streamptr->ntsteps != streamptr->rtsteps)
+        {
+          tsID = tstepsNewEntry(streamptr);
+          if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+          streamptr->tsteps[tsID - 1].next = true;
+          streamptr->tsteps[tsID].position = recpos;
+        }
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+      streamptr->tsteps[tsID].position = recpos;
+
+      streamptr->record->buffer = gribbuffer;
+      streamptr->record->buffersize = buffersize;
+    }
+
+  if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs)
+    {
+      Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID);
+      streamptr->ntsteps = tsID;
+    }
+
+  return streamptr->ntsteps;
+}
+
+#ifdef gribWarning
+#undef gribWarning
+#endif
+
+static void
+unpack_alternative_rows(grib_handle *gh, int memType, void *data)
+{
+  long xsize = 0, ysize = 0;
+  grib_get_long(gh, "Nx", &xsize);
+  grib_get_long(gh, "Ny", &ysize);
+
+  if (memType == MEMTYPE_FLOAT)
+    {
+      float *pdata = (float *) data;
+      for (int j = 1; j < ysize; j += 2)
+        for (int i = 0; i < xsize / 2; i++)
+          {
+            float tmp = pdata[j * xsize + i];
+            pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1];
+            pdata[j * xsize + xsize - i - 1] = tmp;
+          }
+    }
+  else
+    {
+      double *pdata = (double *) data;
+      for (int j = 1; j < ysize; j += 2)
+        for (int i = 0; i < xsize / 2; i++)
+          {
+            double tmp = pdata[j * xsize + i];
+            pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1];
+            pdata[j * xsize + xsize - i - 1] = tmp;
+          }
+    }
+}
+
+int
+gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t gridsize, int unreduced, size_t *numMissVals,
+              double missval)
+{
+  int status = 0;
+
+  if (unreduced)
+    {
+      static bool lwarn = true;
+      if (lwarn)
+        {
+          lwarn = false;
+          Warning("Conversion of gaussian reduced grids unsupported!");
+        }
+    }
+
+  size_t recsize = (size_t) gribsize;
+  grib_handle *gh = grib_handle_new_from_message(NULL, gribbuffer, recsize);
+  GRIB_CHECK(my_grib_set_double(gh, "missingValue", missval), 0);
+
+  // get the size of the values array
+  size_t datasize;
+  GRIB_CHECK(grib_get_size(gh, "values", &datasize), 0);
+  // long numberOfPoints;
+  // GRIB_CHECK(grib_get_long(gh, "numberOfPoints", &numberOfPoints), 0);
+  // printf("values_size = %d  numberOfPoints = %ld\n", datasize, numberOfPoints);
+
+  if (datasize != gridsize) Error("numberOfPoint (%zu) and gridSize (%zu) differ!", datasize, gridsize);
+  size_t dummy = datasize;
+
+  if (memType == MEMTYPE_FLOAT)
+    {
+#ifdef HAVE_GRIBAPI_FLOAT_INTERFACE
+      GRIB_CHECK(grib_get_float_array(gh, "values", (float *) data, &dummy), 0);
+#else
+      Error("grib_get_float_array() not found!");
+#endif
+    }
+  else
+    {
+      GRIB_CHECK(grib_get_double_array(gh, "values", (double *) data, &dummy), 0);
+    }
+
+  if (gribEditionNumber(gh) > 1)
+    {
+      long alternativeRowScanning = false;
+      grib_get_long(gh, "alternativeRowScanning", &alternativeRowScanning);
+      if (alternativeRowScanning) unpack_alternative_rows(gh, memType, data);
+    }
+
+  long lpar;
+  GRIB_CHECK(grib_get_long(gh, "gridDefinitionTemplateNumber", &lpar), 0);
+  int gridtype = (int) lpar;
+
+  *numMissVals = 0;
+  if (gridtype < 50 || gridtype > 53)
+    {
+      GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &lpar), 0);
+      *numMissVals = (size_t) lpar;
+      // printf("gridtype %d, numMissVals %d\n", gridtype, numMissVals);
+    }
+
+  grib_handle_delete(gh);
+
+  return status;
+}
+
+static void
+gribapiDefInstitut(grib_handle *gh, int vlistID, int varID)
+{
+  int instID = vlistInqInstitut(vlistID);
+
+  if (instID == CDI_UNDEFID) instID = vlistInqVarInstitut(vlistID, varID);
+
+  if (instID != CDI_UNDEFID)
+    {
+      long center = institutInqCenter(instID);
+      long subcenter = institutInqSubcenter(instID);
+
+      long center0, subcenter0;
+      GRIB_CHECK(grib_get_long(gh, "centre", &center0), 0);
+      GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter0), 0);
+
+      if (center != center0) GRIB_CHECK(my_grib_set_long(gh, "centre", center), 0);
+      if (subcenter != subcenter0) GRIB_CHECK(my_grib_set_long(gh, "subCentre", subcenter), 0);
+    }
+
+  int status;
+  int centre, subCentre;
+  status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_CENTRE, &centre);
+  if (status == 0) grib_set_long(gh, "centre", centre);
+  status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_SUBCENTRE, &subCentre);
+  if (status == 0) grib_set_long(gh, "subCentre", subCentre);
+
+  status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CENTRE, &centre);
+  if (status == 0) grib_set_long(gh, "centre", centre);
+  status = cdiInqKeyInt(vlistID, varID, CDI_KEY_SUBCENTRE, &subCentre);
+  if (status == 0) grib_set_long(gh, "subCentre", subCentre);
+}
+
+static void
+gribapiDefModel(grib_handle *gh, int vlistID, int varID)
+{
+  int modelID = vlistInqModel(vlistID);
+  if (modelID == CDI_UNDEFID) modelID = vlistInqVarModel(vlistID, varID);
+
+  if (modelID != CDI_UNDEFID) GRIB_CHECK(my_grib_set_long(gh, "generatingProcessIdentifier", modelInqGribID(modelID)), 0);
+}
+
+static void
+gribapiDefParam(int editionNumber, grib_handle *gh, int param, const char *name, const char *stdname)
+{
+  bool ldefined = false;
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+
+  if (pnum < 0)
+    {
+      size_t len = strlen(stdname);
+      if (len)
+        {
+          int status = my_grib_set_string(gh, "cfName", stdname, &len);
+          if (status == 0)
+            ldefined = true;
+          else
+            Warning("grib_api: No match for cfName=%s", stdname);
+        }
+
+      if (ldefined == false)
+        {
+          len = strlen(name);
+          int status = my_grib_set_string(gh, "shortName", name, &len);
+          if (status == 0)
+            ldefined = true;
+          else
+            Warning("grib_api: No match for shortName=%s", name);
+        }
+    }
+
+  if (ldefined == false)
+    {
+      if (pnum < 0) pnum = -pnum;
+
+      if (pnum > 255)
+        {
+          static bool lwarn_pnum = true;
+          if (lwarn_pnum)
+            {
+              Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256);
+              lwarn_pnum = false;
+            }
+          pnum = pnum % 256;
+        }
+
+      if (editionNumber <= 1)
+        {
+          static bool lwarn_pdis = true;
+          if (pdis != 255 && lwarn_pdis)
+            {
+              char paramstr[32];
+              cdiParamToString(param, paramstr, sizeof(paramstr));
+              Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat);
+              lwarn_pdis = false;
+            }
+
+          GRIB_CHECK(my_grib_set_long(gh, "table2Version", pcat), 0);
+          GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", pnum), 0);
+        }
+      else
+        {
+          GRIB_CHECK(my_grib_set_long(gh, "discipline", pdis), 0);
+          GRIB_CHECK(my_grib_set_long(gh, "parameterCategory", pcat), 0);
+          GRIB_CHECK(my_grib_set_long(gh, "parameterNumber", pnum), 0);
+        }
+    }
+
+  // printf("param: %d.%d.%d %s\n", pnum, pcat, pdis, name);
+}
+
+static int
+getTimeunitFactor(int timeunit)
+{
+  switch (timeunit)
+    {
+    case TUNIT_SECOND: return 1;
+    case TUNIT_MINUTE: return 60;
+    case TUNIT_HOUR: return 3600;
+    case TUNIT_3HOURS: return 10800;
+    case TUNIT_6HOURS: return 21600;
+    case TUNIT_12HOURS: return 43200;
+    case TUNIT_DAY: return 86400;
+    }
+
+  return 3600;
+}
+
+static int
+grib2ProDefTempHasStatisticalDef(int proDefTempNum)
+{
+  switch (proDefTempNum)
+    {
+    case 8:
+    case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    case 14:
+    case 34:
+    case 42:
+    case 43:
+    case 46:
+    case 47:
+    case 61:
+    case 67:
+    case 68:
+    case 91:
+    case 1001:
+    case 1101:
+    case 40034: return 1;
+    }
+
+  return 0;
+}
+
+static int
+getUnitsOfTime(int timeunit)
+{
+  switch (timeunit)
+    {
+    case TUNIT_SECOND: return 13;
+    case TUNIT_MINUTE: return 0;
+    case TUNIT_HOUR: return 1;
+    case TUNIT_3HOURS: return 10;
+    case TUNIT_6HOURS: return 11;
+    case TUNIT_12HOURS: return 12;
+    case TUNIT_DAY: return 2;
+    }
+
+  return 1;
+}
+
+static void
+gribapiDefStepUnits(int editionNumber, grib_handle *gh, int timeunit, int proDefTempNum, int gcinit)
+{
+  if (!gcinit)
+    {
+      long unitsOfTime = getUnitsOfTime(timeunit);
+
+      grib_set_long(gh, "stepUnits", unitsOfTime);
+      if (editionNumber == 1)
+        {
+          grib_set_long(gh, "unitOfTimeRange", unitsOfTime);
+        }
+      else if (grib2ProDefTempHasStatisticalDef(proDefTempNum))
+        {
+          grib_set_long(gh, "indicatorOfUnitForTimeRange", unitsOfTime);
+          grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime);
+        }
+      else
+        {
+          // NOTE KNMI:  HIRLAM model files LAMH_D11 are in grib1 and do NOT have key indicatorOfUnitForTimeRange
+          // Watch out for compatibility issues.
+          grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime);
+        }
+    }
+}
+
+static int
+gribapiDefSteptype(int editionNumber, grib_handle *gh, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype,
+                   int gcinit)
+{
+  const char *stepType = "instant";
+  long proDefTempNum = 0;
+
+  if (tsteptype >= TSTEP_INSTANT && tsteptype <= TSTEP_SUM)
+    {
+      stepType = cdiGribAPI_ts_str_map[tsteptype].sname;
+      proDefTempNum = cdiGribAPI_ts_str_map[tsteptype].productionTemplate;
+    }
+
+  if (productDefinitionTemplate != -1)
+    proDefTempNum = productDefinitionTemplate;
+  else if (typeOfGeneratingProcess == 4)
+    proDefTempNum = (proDefTempNum == 8) ? 11 : 1;
+
+  if (!gcinit)
+    {
+      if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", proDefTempNum), 0);
+      size_t len = strlen(stepType);
+      int status = my_grib_set_string(gh, "stepType", stepType, &len);
+      if (status != 0) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", 0), 0);
+    }
+
+  return (int) proDefTempNum;
+}
+
+static void
+gribapiDefDateTimeAbs(int editionNumber, grib_handle *gh, CdiDateTime dateTime, int productDefinitionTemplate,
+                      int typeOfGeneratingProcess, int tsteptype, int gcinit)
+{
+  (void) gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit);
+
+  if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 0), 0);
+  if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0);
+
+  if (cdiDateTime_isNull(dateTime)) dateTime.date = cdiDate_set(10101);
+  gribapiSetDataDateTime(gh, dateTime);
+}
+
+static int
+gribapiDefDateTimeRel(int editionNumber, grib_handle *gh, CdiDateTime fDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime,
+                      int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int timeunit, int calendar,
+                      int gcinit)
+{
+  int status = -1;
+
+  JulianDate julianDate1 = julianDate_encode(calendar, fDateTime);
+
+  if (cdiDateTime_isNull(vDateTime)) vDateTime = fDateTime;
+
+  JulianDate julianDate2 = julianDate_encode(calendar, vDateTime);
+  JulianDate julianDate = julianDate_sub(julianDate2, julianDate1);
+
+  int factor = getTimeunitFactor(timeunit);
+
+  if (!(int) (fmod(julianDate_to_seconds(julianDate), factor)))
+    {
+      int proDefTempNum
+          = gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit);
+      gribapiDefStepUnits(editionNumber, gh, timeunit, proDefTempNum, gcinit);
+
+      long startStep = 0;
+      double endStepF = julianDate_to_seconds(julianDate) / factor;
+      long maxStep = (editionNumber > 1) ? INT_MAX : 65000;
+      if (endStepF > maxStep) return status;
+      long endStep = lround(endStepF);
+
+      bool hasStartDate = (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF
+                           || tsteptype == TSTEP_MIN || tsteptype == TSTEP_MAX || tsteptype == TSTEP_RMS || tsteptype == TSTEP_SD
+                           || tsteptype == TSTEP_COV || tsteptype == TSTEP_RATIO || tsteptype == TSTEP_SUM);
+      if (!cdiDateTime_isNull(sDateTime) && hasStartDate)
+        {
+          julianDate2 = julianDate_encode(calendar, sDateTime);
+          startStep = lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor);
+        }
+
+      if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 1), 0);
+      if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0);
+
+      if (cdiDateTime_isNull(fDateTime)) fDateTime.date = cdiDate_set(10101);
+      gribapiSetDataDateTime(gh, fDateTime);
+
+      // printf(">>>>> tsteptype %d  startStep %ld  endStep %ld\n", tsteptype, startStep, endStep);
+
+      // Product Definition Template Number: defined in GRIB_API file 4.0.table point in time products:
+      if ((proDefTempNum >= 0 && proDefTempNum <= 7) || proDefTempNum == 55 || proDefTempNum == 40055)  // Tile
+        startStep = endStep;
+
+      if (endStep < startStep) return status;
+
+      if (editionNumber == 1 && (startStep > 255 || endStep > 255))
+        {
+          startStep = 0;
+          endStep = 0;
+        }
+      else
+        {
+          status = 0;
+        }
+
+      if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "forecastTime", startStep), 0);
+      // if ( editionNumber == 1 && startStep > 0) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0);
+      if (editionNumber == 1) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0);
+      GRIB_CHECK(my_grib_set_long(gh, "endStep", endStep), 0);
+    }
+
+  return status;
+}
+
+static void
+gribapiDefTime(int editionNumber, int productDefinitionTemplate, int typeOfGeneratingProcess, grib_handle *gh,
+               CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID, int gcinit)
+{
+  UNUSED(numavg);
+
+  int taxistype = (taxisID == -1) ? TAXIS_ABSOLUTE : taxisInqType(taxisID);
+
+  if (typeOfGeneratingProcess == 196)
+    {
+      vDateTime = cdiDateTime_set(10101, 0);
+      taxistype = TAXIS_ABSOLUTE;
+    }
+
+  if (taxistype == TAXIS_RELATIVE)
+    {
+      int timeunit = taxisInqTunit(taxisID);
+      int calendar = taxisInqCalendar(taxisID);
+
+      CdiDateTime fDateTime = taxisInqFdatetime(taxisID);
+      if (cdiDateTime_isNull(fDateTime)) fDateTime = taxisInqRdatetime(taxisID);
+      if (cdiDateTime_isLT(vDateTime, fDateTime)) fDateTime = vDateTime;
+
+      CdiDateTime sDateTime = taxisInqSdatetime(taxisID);
+
+      int status = gribapiDefDateTimeRel(editionNumber, gh, fDateTime, vDateTime, sDateTime, productDefinitionTemplate,
+                                         typeOfGeneratingProcess, tsteptype, timeunit, calendar, gcinit);
+      if (status != 0) taxistype = TAXIS_ABSOLUTE;
+    }
+
+  if (taxistype == TAXIS_ABSOLUTE)
+    gribapiDefDateTimeAbs(editionNumber, gh, vDateTime, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit);
+}
+
+static void
+gribapiDefGridRegular(grib_handle *gh, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear, int uvRelativeToGrid)
+{
+  const char *mesg;
+  // clang-format off
+  if      (gridtype == GRID_GAUSSIAN)         mesg = "regular_gg";
+  else if (gridtype == GRID_GAUSSIAN_REDUCED) mesg = "reduced_gg";
+  else if (gridIsRotated)                     mesg = "rotated_ll";
+  else                                        mesg = "regular_ll";
+  // clang-format on
+  size_t len = strlen(mesg);
+  GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0);
+
+  double xfirst = 0.0, xlast = 0.0, xinc = 0.0;
+  double yfirst = 0.0, ylast = 0.0, yinc = 0.0;
+
+  SizeType nlon = gridInqXsize(gridID), nlat = gridInqYsize(gridID);
+
+  if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      xfirst = (nlon == 2) ? gridInqXval(gridID, 0) : 0.0;
+      xlast = (nlon == 2) ? gridInqXval(gridID, 1) : 360.0 - 360.0 * 0.5 / (double) nlat;
+
+      nlon = 0;
+
+      long *pl = (long *) Malloc((size_t) nlat * sizeof(long) + (size_t) nlat * sizeof(int));
+      int *reducedPoints = (int *) (pl + nlat);
+      gridInqReducedPoints(gridID, reducedPoints);
+      for (SizeType i = 0; i < nlat; ++i) pl[i] = reducedPoints[i];
+
+      GRIB_CHECK(grib_set_long_array(gh, "pl", pl, (size_t) nlat), 0);
+
+      Free(pl);
+    }
+  else
+    {
+      if (nlon == 0)
+        nlon = 1;
+      else
+        {
+          xfirst = gridInqXval(gridID, 0);
+          xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1);
+          xinc = fabs(gridInqXinc(gridID));
+        }
+    }
+
+  if (nlat == 0)
+    nlat = 1;
+  else
+    {
+      yfirst = gridInqYval(gridID, 0);
+      ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1);
+      yinc = fabs(gridInqYinc(gridID));
+    }
+
+  double xfirsto = xfirst;
+  double xlasto = xlast;
+  while (xfirsto > 360.0) xfirsto -= 360.0;
+  while (xlasto > 360.0) xlasto -= 360.0;
+
+  if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_long(gh, "Ni", nlon), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", xfirsto), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "longitudeOfLastGridPointInDegrees", xlasto), 0);
+  if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_double(gh, "iDirectionIncrementInDegrees", xinc), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "Nj", nlat), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", yfirst), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", ylast), 0);
+
+  if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xfirst > xlast)), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yfirst < ylast)), 0);
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      long np = gridInqNP(gridID);
+      if (np == 0) np = nlat / 2;
+      GRIB_CHECK(my_grib_set_long(gh, "numberOfParallelsBetweenAPoleAndTheEquator", np), 0);
+    }
+  else
+    {
+      GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0);
+    }
+
+  if (gridIsRotated)
+    {
+      double xpole = 0.0, ypole = 0.0, angle = 0.0;
+      gridInqParamRLL(gridID, &xpole, &ypole, &angle);
+
+      xpole += 180.0;
+      if (fabs(ypole) > 0.0) ypole = -ypole;  // change from north to south pole
+      if (fabs(angle) > 0.0) angle = -angle;
+      GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", ypole), 0);
+      GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", xpole), 0);
+      GRIB_CHECK(my_grib_set_double(gh, "angleOfRotation", angle), 0);
+    }
+}
+
+static int
+encode_shapeOfTheEarth(struct CDI_GridProjParams *gpp)
+{
+  int shapeOfTheEarth = 1;
+  int a = (int) lround(gpp->a);
+  int b = (int) lround(gpp->b);
+  int rf = (int) lround(gpp->rf);
+
+  // clang-format off
+  if      (a == 6367470) shapeOfTheEarth = 0;
+  else if (a == 6371229) shapeOfTheEarth = 6;
+  else if (a == 6371200) shapeOfTheEarth = 8;
+  else if (a == 6378160 && b == 6356775 && rf == 297) shapeOfTheEarth = 2;
+  else if (a == 6378137 && b == 6356752 && rf == 298) shapeOfTheEarth = 4;
+  // clang-format on
+
+  return shapeOfTheEarth;
+}
+
+static void
+gribapiDefGridLCC(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid)
+{
+  long xsize = (long) gridInqXsize(gridID);
+  long ysize = (long) gridInqYsize(gridID);
+
+  struct CDI_GridProjParams gpp;
+  gridInqParamsLCC(gridID, &gpp);
+  if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv)))
+    {
+      gpp.x_0 = gridInqXval(gridID, 0);
+      gpp.y_0 = gridInqYval(gridID, 0);
+    }
+  gridVerifyProjParamsLCC(&gpp);
+  if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0;
+  if (gpp.lon_0 < 0.0) gpp.lon_0 += 360.0;
+
+  bool isSouthPole = (gpp.lat_1 < 0.0);
+  if (isSouthPole)
+    {
+      gpp.lat_1 = -gpp.lat_2;
+      gpp.lat_2 = -gpp.lat_2;
+    }
+  int projflag = 0;
+  if (isSouthPole) gribbyte_set_bit(&projflag, 1);
+
+  double xinc = gridInqXinc(gridID);
+  double yinc = gridInqYinc(gridID);
+  if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID);
+  if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID);
+
+  static const char mesg[] = "lambert";
+  size_t len = sizeof(mesg) - 1;
+  GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", fabs(xinc)), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", fabs(yinc)), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0);
+  if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "LoVInDegrees", gpp.lon_0), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "Latin1InDegrees", gpp.lat_1), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "Latin2InDegrees", gpp.lat_2), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0);
+
+  if (gpp.x_SP >= -180 && gpp.x_SP <= 360) GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", gpp.x_SP), 0);
+  if (gpp.y_SP >= -90 && gpp.y_SP <= 90) GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", gpp.y_SP), 0);
+
+  long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp);
+  if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0);
+  if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0);
+
+  long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4);
+  if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0);
+
+  if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0);
+}
+
+static void
+gribapiDefGridSTERE(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid)
+{
+  long xsize = (long) gridInqXsize(gridID);
+  long ysize = (long) gridInqYsize(gridID);
+
+  struct CDI_GridProjParams gpp;
+  gridInqParamsSTERE(gridID, &gpp);
+  gridVerifyProjParamsSTERE(&gpp);
+  if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0;
+  int projflag = 0;
+
+  double xinc = gridInqXinc(gridID);
+  double yinc = gridInqYinc(gridID);
+
+  static const char mesg[] = "polar_stereographic";
+  size_t len = sizeof(mesg) - 1;
+  GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", xinc), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", yinc), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0);
+  if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "orientationOfTheGridInDegrees", gpp.lon_0), 0);
+  long southPoleOnProjectionPlane = IS_EQUAL(gpp.lat_0, -90.0);
+  GRIB_CHECK(my_grib_set_double(gh, "southPoleOnProjectionPlane", (double) southPoleOnProjectionPlane), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0);
+
+  long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp);
+  if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0);
+  if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0);
+
+  long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4);
+  if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0);
+
+  if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0);
+}
+
+static void
+gribapiDefGridHEALPIX(grib_handle *gh, int gridID, int uvRelativeToGrid)
+{
+  struct CDI_GridProjParams gpp;
+  gridInqParamsHEALPIX(gridID, &gpp);
+  gridVerifyProjParamsHEALPIX(&gpp);
+  // if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0;
+
+  static const char mesg[] = "healpix";
+  size_t len = sizeof(mesg) - 1;
+  GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "Nside", gpp.nside), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "ordering", gpp.order), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", 45.0), 0);
+  // GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0);
+  /*
+  long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp);
+  if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0);
+  if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", gpp.a), 0);
+
+  long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4);
+  if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0);
+  */
+  if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0);
+}
+
+static void
+gribapiDefGridGME(grib_handle *gh, int gridID, long gridsize)
+{
+  GRIB_CHECK(my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_GME), 0);
+
+  int nd = 0, ni = 0, ni2 = 0, ni3 = 0;
+  gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3);
+  GRIB_CHECK(my_grib_set_long(gh, "nd", nd), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "Ni", ni), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "n2", ni2), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "n3", ni3), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "latitudeOfThePolePoint", 90000000), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "longitudeOfThePolePoint", 0), 0);
+
+  GRIB_CHECK(my_grib_set_long(gh, "numberOfDataPoints", gridsize), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "totalNumberOfGridPoints", gridsize), 0);
+}
+
+static void
+gribapiDefGridUnstructured(grib_handle *gh, int gridID)
+{
+  static bool warning = true;
+
+  int status = my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_UNSTRUCTURED);
+  if (status != 0 && warning)
+    {
+      warning = false;
+      Warning("Can't write reference grid!");
+      Warning("gridDefinitionTemplateNumber %d not found (grib2/template.3.%d.def)!", GRIB2_GTYPE_UNSTRUCTURED,
+              GRIB2_GTYPE_UNSTRUCTURED);
+    }
+  else
+    {
+      int errCount = 0;
+      int number = 0;
+      status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number);
+      if (status < 0) errCount++;
+      if (number < 0) number = 0;
+      GRIB_CHECK(my_grib_set_long(gh, "numberOfGridUsed", number), 0);
+
+      int position = 0;
+      status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position);
+      if (status < 0) errCount++;
+      if (position < 0) position = 0;
+      GRIB_CHECK(my_grib_set_long(gh, "numberOfGridInReference", position), 0);
+
+      unsigned char uuid[CDI_UUID_SIZE];
+      size_t len = CDI_UUID_SIZE;
+      memset(uuid, 0, len);
+      int length = CDI_UUID_SIZE;
+      status = cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+      if (status < 0) errCount++;
+      if (grib_set_bytes(gh, "uuidOfHGrid", uuid, &len) != 0) Warning("Can't write UUID!");
+
+      if (warning && errCount > 0)
+        {
+          warning = false;
+          char uuidStr[uuidNumHexChars + 1] = { 0 };
+          cdiUUID2Str(uuid, uuidStr);
+          Warning("GRIB2 grid parameter missing: numberOfGridUsed=%d numberOfGridInReference=%d uuidOfHGrid=%s", number, position,
+                  uuidStr);
+        }
+    }
+}
+
+static void
+gribapiDefGridSpectral(grib_handle *gh, int gridID)
+{
+  int trunc = gridInqTrunc(gridID);
+  enum
+  {
+    numTruncAtt = 3
+  };
+  static const char truncAttNames[numTruncAtt][2] = { "J", "K", "M" };
+  for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames[i], trunc), 0);
+
+  if (gridInqComplexPacking(gridID))
+    {
+      static const char truncAttNames2[numTruncAtt][3] = { "JS", "KS", "MS" };
+      for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames2[i], 20), 0);
+    }
+}
+
+static void
+gribapiDefPackingType(grib_handle *gh, bool lieee, bool lspectral, bool lcomplex, int comptype, SizeType gridsize)
+{
+  static const char mesg_spectral_complex[] = "spectral_complex";
+  static const char mesg_spectral_simple[] = "spectral_simple";
+  static const char mesg_grid_jpeg[] = "grid_jpeg";
+  static const char mesg_grid_ccsds[] = "grid_ccsds";
+  static const char mesg_ieee[] = "grid_ieee";
+  static const char mesg_simple[] = "grid_simple";
+  const char *mesg = mesg_simple;
+
+  if (lspectral)
+    {
+      mesg = lcomplex ? mesg_spectral_complex : mesg_spectral_simple;
+    }
+  else if (comptype == CDI_COMPRESS_JPEG && gridsize > 1)
+    {
+      mesg = mesg_grid_jpeg;
+    }
+  else if ((comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC) && gridsize > 1)
+    {
+      mesg = mesg_grid_ccsds;
+    }
+  else if (lieee)
+    {
+      mesg = mesg_ieee;
+    }
+
+  size_t len = strlen(mesg);
+  GRIB_CHECK(my_grib_set_string(gh, "packingType", mesg, &len), 0);
+}
+
+static void
+gribapiDefGrid(int editionNumber, grib_handle *gh, int gridID, int comptype, int datatype, int uvRelativeToGrid)
+{
+  SizeType gridsize = gridInqSize(gridID);
+  bool gridIsRotated = false;
+  bool gridIsCurvilinear = false;
+  int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear);
+
+  bool lieee = (editionNumber == 2 && (datatype == CDI_DATATYPE_FLT32 || datatype == CDI_DATATYPE_FLT64));
+  bool lspectral = (gridtype == GRID_SPECTRAL);
+  bool lcomplex = (lspectral && gridInqComplexPacking(gridID));
+
+  if (lieee) comptype = 0;
+  if (lspectral) lieee = false;
+
+  if (lspectral)  // gridType needs to be defined before packingType !!!
+    {
+      static const char mesg[] = "sh";
+      size_t len = sizeof(mesg) - 1;
+      GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0);
+    }
+
+  gribapiDefPackingType(gh, lieee, lspectral, lcomplex, comptype, gridsize);
+
+  if (lieee) GRIB_CHECK(my_grib_set_long(gh, "precision", datatype == CDI_DATATYPE_FLT64 ? 2 : 1), 0);
+
+  if (editionNumber == 2) GRIB_CHECK(my_grib_set_long(gh, "numberOfValues", (long) gridsize), 0);
+
+  switch (gridtype)
+    {
+    case GRID_LONLAT:
+    case GRID_GAUSSIAN:
+    case GRID_GAUSSIAN_REDUCED:
+    case GRID_TRAJECTORY:
+      {
+        gribapiDefGridRegular(gh, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid);
+        break;
+      }
+    case CDI_PROJ_LCC:
+      {
+        gribapiDefGridLCC(gh, editionNumber, gridID, uvRelativeToGrid);
+        break;
+      }
+    case CDI_PROJ_STERE:
+      {
+        gribapiDefGridSTERE(gh, editionNumber, gridID, uvRelativeToGrid);
+        break;
+      }
+    case CDI_PROJ_HEALPIX:
+      {
+        if (editionNumber <= 1) Error("HEALPix grid can't be stored in GRIB edition %d!", editionNumber);
+        gribapiDefGridHEALPIX(gh, gridID, uvRelativeToGrid);
+        break;
+      }
+    case GRID_SPECTRAL:
+      {
+        gribapiDefGridSpectral(gh, gridID);
+        break;
+      }
+    case GRID_GME:
+      {
+        if (editionNumber <= 1) Error("GME grid can't be stored in GRIB edition %d!", editionNumber);
+        gribapiDefGridGME(gh, gridID, (long) gridsize);
+        break;
+      }
+    case GRID_UNSTRUCTURED:
+      {
+        if (editionNumber <= 1) Error("Unstructured grid can't be stored in GRIB edition %d!", editionNumber);
+        gribapiDefGridUnstructured(gh, gridID);
+        break;
+      }
+    default:
+      {
+        Error("Unsupported grid type: %s", gridNamePtr(gridtype));
+        break;
+      }
+    }
+}
+
+static void
+getLevelFactor(double level, long *factor, long *out_scaled_value)
+{
+  const double eps = 1.0e-7;
+
+  double scaled_value = level;
+  long iscaled_value = lround(scaled_value);
+
+  long i;
+  for (i = 0; (iscaled_value < (4294967295 / 10)) && (fabs(scaled_value - (double) iscaled_value) >= eps) && i < 7; i++)
+    {
+      scaled_value *= 10.0;
+      iscaled_value = lround(scaled_value);
+    }
+
+  (*factor) = i;
+  (*out_scaled_value) = iscaled_value;
+}
+
+static void
+gribapiDefLevelType(grib_handle *gh, int gcinit, const char *keyname, long leveltype)
+{
+  bool lset = false;
+  if ((leveltype == GRIB1_LTYPE_ISOBARIC_PA || leveltype == 99 || leveltype == 100) && gribEditionNumber(gh) == 1)
+    {
+      if (gribGetLong(gh, "indicatorOfTypeOfLevel") != leveltype) lset = true;
+    }
+
+  if (!gcinit || lset) GRIB_CHECK(my_grib_set_long(gh, keyname, leveltype), 0);
+}
+
+static void
+grib1DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1,
+              double dlevel2)
+{
+  (void) leveltype2;
+  gribapiDefLevelType(gh, gcinit, "indicatorOfTypeOfLevel", leveltype1);
+
+  if (hasBounds)
+    {
+      GRIB_CHECK(my_grib_set_long(gh, "topLevel", lround(dlevel1)), 0);
+      GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", lround(dlevel2)), 0);
+    }
+  else
+    {
+      GRIB_CHECK(my_grib_set_long(gh, "level", lround(level)), 0);
+    }
+}
+
+static void
+grib2DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1,
+              double dlevel2)
+{
+  gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", leveltype1);
+  if (hasBounds) gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", leveltype2);
+
+  if (!hasBounds) dlevel1 = level;
+
+  long scaled_level, factor;
+  getLevelFactor(dlevel1, &factor, &scaled_level);
+  GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfFirstFixedSurface", factor), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfFirstFixedSurface", scaled_level), 0);
+
+  if (hasBounds)
+    {
+      getLevelFactor(dlevel2, &factor, &scaled_level);
+      GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfSecondFixedSurface", factor), 0);
+      GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfSecondFixedSurface", scaled_level), 0);
+    }
+}
+
+static void
+gribapiDefLevel(int editionNumber, grib_handle *gh, int zaxisID, int levelID, int gcinit, int proddef_template_num)
+{
+  int zaxistype = zaxisInqType(zaxisID);
+  int ltype = 0, ltype2 = -1;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype);
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, &ltype2);
+
+  bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL));
+  double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1;
+  double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level;
+  double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0;
+
+  if (zaxistype == ZAXIS_GENERIC && ltype == 0)
+    {
+      Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE));
+      zaxistype = ZAXIS_PRESSURE;
+      zaxisChangeType(zaxisID, zaxistype);
+      cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa");
+    }
+
+  long grib_ltype;
+  {
+    int (*ltypeMap)(int grib_ltype) = editionNumber <= 1 ? zaxisTypeToGrib1ltype : zaxisTypeToGrib2ltype;
+    grib_ltype = ltypeMap(zaxistype);
+  }
+  long grib_ltype2 = (ltype != ltype2 && ltype2 != -1) ? ltype2 : grib_ltype;
+
+  void (*defLevel)(grib_handle * gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1,
+                   double dlevel2)
+      = (editionNumber <= 1) ? grib1DefLevel : grib2DefLevel;
+
+  switch (zaxistype)
+    {
+    case ZAXIS_SURFACE:
+    case ZAXIS_MEANSEA:
+    case ZAXIS_HEIGHT:
+    case ZAXIS_ALTITUDE:
+    case ZAXIS_SIGMA:
+    case ZAXIS_DEPTH_BELOW_SEA:
+    case ZAXIS_ISENTROPIC:
+      {
+        if (zaxistype == ZAXIS_HEIGHT)
+          {
+            double sf = zaxis_units_to_meter(zaxisID);
+            level *= sf;
+            dlevel1 *= sf;
+            dlevel2 *= sf;
+          }
+
+        /* GRIB2: PRODUCT DEFINITION TEMPLATE NUMBER 32:
+
+           "Analysis or forecast at a horizontal level or in a
+           horizontal layer at a point in time for simulate
+           (synthetic) satellite data"
+
+           The key/value pairs that are set in "grib2DefLevel" do not
+           exist for this template. */
+        if (editionNumber <= 1 || proddef_template_num != 32)
+          defLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2);
+
+        break;
+      }
+    case ZAXIS_CLOUD_BASE:
+    case ZAXIS_CLOUD_TOP:
+    case ZAXIS_ISOTHERM_ZERO:
+    case ZAXIS_TROPOPAUSE:
+    case ZAXIS_TOA:
+    case ZAXIS_SEA_BOTTOM:
+    case ZAXIS_LAKE_BOTTOM:
+    case ZAXIS_SEDIMENT_BOTTOM:
+    case ZAXIS_SEDIMENT_BOTTOM_TA:
+    case ZAXIS_SEDIMENT_BOTTOM_TW:
+    case ZAXIS_MIX_LAYER:
+    case ZAXIS_ATMOSPHERE:
+      {
+        defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2);
+      }
+      break;
+    case ZAXIS_HYBRID:
+    case ZAXIS_HYBRID_HALF:
+      {
+        if (editionNumber <= 1)
+          {
+            grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID;
+          }
+        defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2);
+
+        if (!gcinit)
+          {
+            int vctsize = zaxisInqVctSize(zaxisID);
+            if (vctsize > 0)
+              {
+                GRIB_CHECK(my_grib_set_long(gh, "PVPresent", 1), 0);
+                GRIB_CHECK(grib_set_double_array(gh, "pv", zaxisInqVctPtr(zaxisID), (size_t) vctsize), 0);
+              }
+          }
+
+        break;
+      }
+    case ZAXIS_PRESSURE:
+      {
+        if (level < 0) Warning("Pressure level of %f Pa is below zero!", level);
+
+        if (!zaxis_units_is_Pa(zaxisID))
+          {
+            level *= 100;
+            dlevel1 *= 100;
+            dlevel2 *= 100;
+          }
+
+        if (editionNumber <= 1)
+          {
+            double dum;
+            if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0))
+              grib_ltype = GRIB1_LTYPE_ISOBARIC_PA;
+            else
+              level /= 100;
+
+            static bool lwarn = true;
+            if (lwarn && modf(level, &dum) > 0.001)
+              {
+                lwarn = false;
+                Warning("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level,
+                        (int) lround(level));
+              }
+          }
+        else if (ltype2 == -1)
+          ltype2 = GRIB2_LTYPE_ISOBARIC;
+
+        defLevel(gh, gcinit, grib_ltype, ltype2, hasBounds, level, dlevel1, dlevel2);
+
+        break;
+      }
+    case ZAXIS_SNOW:
+      if (editionNumber <= 1)
+        ;  // not available
+      else
+        {
+          grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2);
+        }
+
+      break;
+    case ZAXIS_DEPTH_BELOW_LAND:
+      {
+        double sf = editionNumber <= 1 ? zaxis_units_to_centimeter(zaxisID) : zaxis_units_to_meter(zaxisID);
+        grib_ltype = editionNumber <= 1 ? (hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH) : grib_ltype;
+        defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level * sf, dlevel1 * sf, dlevel2 * sf);
+
+        break;
+      }
+    case ZAXIS_REFERENCE:
+      {
+        if (!gcinit) GRIB_CHECK(my_grib_set_long(gh, "genVertHeightCoords", 1), 0);
+
+        if (editionNumber <= 1)
+          ;  // not available
+        else
+          {
+            if (hasBounds)
+              {
+                gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", grib_ltype);
+                gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", grib_ltype2);
+                GRIB_CHECK(my_grib_set_long(gh, "topLevel", (long) dlevel1), 0);
+                GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", (long) dlevel2), 0);
+              }
+            else
+              {
+                grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2);
+              }
+
+            GRIB_CHECK(my_grib_set_long(gh, "NV", 6), 0);
+            int number = 0;
+            cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &number);
+            GRIB_CHECK(my_grib_set_long(gh, "numberOfVGridUsed", number), 0);
+            int nlev = 0;
+            cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev);
+            GRIB_CHECK(my_grib_set_long(gh, "nlev", nlev), 0);
+            unsigned char uuid[CDI_UUID_SIZE];
+            int length = CDI_UUID_SIZE;
+            memset(uuid, 0, (size_t) length);
+            cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+            size_t len = CDI_UUID_SIZE;
+            if (grib_set_bytes(gh, "uuidOfVGrid", uuid, &len) != 0) Warning("Can't write UUID!");
+          }
+
+        break;
+      }
+    case ZAXIS_GENERIC:
+      {
+        defLevel(gh, gcinit, ltype, ltype, hasBounds, level, dlevel1, dlevel2);
+        break;
+      }
+    default:
+      {
+        Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype));
+        break;
+      }
+    }
+}
+
+int
+gribapiGetScanningMode(grib_handle *gh)
+{
+  long iScansNegatively, jScansPositively, jPointsAreConsecutive;
+  GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0);
+  GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0);
+  GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0);
+  int scanningMode = 128 * (bool) iScansNegatively + 64 * (bool) jScansPositively + 32 * (bool) jPointsAreConsecutive;
+  if (cdiDebugExt >= 30)
+    printf("gribapiGetScanningMode(): Scanning mode = %02d (%1d%1d%1d)*32; \n", scanningMode, (int) jPointsAreConsecutive,
+           (int) jScansPositively, (int) iScansNegatively);
+
+  return scanningMode;
+}
+
+void
+gribapiSetScanningMode(grib_handle *gh, int scanningMode)
+{
+  // 127: reserved for testing; generated test data will be in 64 scanning mode
+  // if (scanningMode== 127)  scanningMode = 64;
+
+  long iScansNegatively = (scanningMode & 128) / 128;
+  long jScansPositively = (scanningMode & 64) / 64;
+  long jPointsAreConsecutive = (scanningMode & 32) / 32;
+
+  if (cdiDebugExt >= 30 && gribEditionNumber(gh) <= 1)
+    {
+      long paramId, levelTypeId, levelId, uvRelativeToGrid;
+      GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &uvRelativeToGrid), 0);
+      GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", &paramId), 0);
+      GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0);
+      GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0);
+      printf("gribapiSetScanningMode(): (param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d (%1d%1d%1d)*32;  "
+             "uvRelativeToGrid = %02d\n",
+             (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, (int) jPointsAreConsecutive, (int) jScansPositively,
+             (int) iScansNegatively, (int) uvRelativeToGrid);
+    }
+
+  GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", iScansNegatively), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", jScansPositively), 0);
+  GRIB_CHECK(my_grib_set_long(gh, "jPointsAreConsecutive", jPointsAreConsecutive), 0);
+}
+
+/*
+  TABLE 8. SCANNING MODE FLAG
+
+  (GDS Octet 28)
+  BIT     VALUE     MEANING
+  1       0       Points scan in +i direction
+          1       Points scan in -i direction
+  2       0       Points scan in -j direction
+          1       Points scan in +j direction
+  3       0       Adjacent points in i direction are consecutive
+                    (FORTRAN: (I,J))
+          1       Adjacent points in j direction are consecutive
+                  (FORTRAN: (J,I))
+
+  => Scanning Mode     0 0 0 0 0 0 0 0  (00 dec)  +i, -j; i direction consecutive (row-major    order West->East   & North->South)
+  => Scanning Mode     0 1 0 0 0 0 0 0  (64 dec)  +i, +j; i direction consecutive (row-major    order West->East   & South->North )
+  => Scanning Mode     1 1 0 0 0 0 0 0  (96 dec)  +i, +j; j direction consecutive (column-major order South->North & West->East )
+
+  NOTE:  South->North  - As if you would plot the data as image on the screen
+                         where [0,0] of the data is the top-left pixel.
+
+                         grib2ppm LAMH_D11_201302150000_00000_oro | display ppm:-
+                         ImageMagick (display): [0,0] of an image belongs to the top-left pixel
+  [DEFAULT] : 64 dec
+
+  iScansNegatively = 0;
+  jScansPositively = 1;
+  jPointsAreConsecutive = 0;    => Scanning Mode 64
+
+  cdo selindexbox,1,726,100,550 LAMH_D11_201302150000_00000_oro LAMH_D11_201302150000_00000_oro_cropped
+  grib2ppm LAMH_D11_201302150000_00000_oro_cropped | /usr/bin/display ppm:- &
+  # ^^^ this image will be missing the souther parts of data
+
+  grib2ppm LAMH_D11_201302150000_00000_oro | /usr/bin/display ppm:- &
+  # ^ full domain data
+*/
+
+#ifdef HIRLAM_EXTENSIONS
+static void
+verticallyFlipGridDefinitionWhenScanningModeChanged(grib_handle *gh, double yfirst, double ylast, double yinc)
+{
+  /*
+  Nj = 550;
+  latitudeOfFirstGridPointInDegrees = -30.8;
+  latitudeOfLastGridPointInDegrees = 24.1;
+  iScansNegatively = 0;
+  jScansPositively = 0;
+  jPointsAreConsecutive = 0;
+  jDirectionIncrementInDegrees = 0.1;
+
+  When switching from scanning mode 0 <=> 64
+  yfirst = -30.8 + (550-1)*0.1
+
+  yfirst = yfirst + (ysize-1) * yinc
+  yinc   = -1.0*yinc
+  */
+
+  // long jDim=0;
+  // GRIB_CHECK(grib_get_long(gh, "Nj", &jDim), 0);
+
+  double latitudeOfFirstGridPointInDegrees;
+  double latitudeOfLastGridPointInDegrees;
+  double jDirectionIncrementInDegrees;
+
+  // GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0);  // yfirst
+  // GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0);    // ylast
+  // GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0);  // yinc
+
+  if (cdiDebugExt >= 10) Message(" BEFORE: yfirst = %f; ylast = %f; yinc = %f; ", yfirst, ylast, yinc);
+
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", ylast), 0);
+  GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", yfirst), 0);
+  // yinc *= -1.0; // don't set yinc here ...
+  // GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0);
+
+  if (cdiDebugExt >= 10)
+    {
+      GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0);  // yfirst
+      GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0);    // ylast
+      GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0);            // yinc
+      Message("CHANGED INTO:  yfirst = %f, ylast = %f, yinc = %f", latitudeOfFirstGridPointInDegrees,
+              latitudeOfLastGridPointInDegrees, jDirectionIncrementInDegrees);
+    }
+}
+
+static void
+convertDataScanningMode(int scanModeIN, int scanModeOUT, double *data, size_t gridsize, size_t iDim, size_t jDim)
+{
+  size_t idxIN, idxOUT;
+
+  // 127: reserved for testing; it will generate test data in 64 scanning mode
+  if (scanModeOUT == 127)  // fill with testdata ...
+    {
+      scanModeOUT = 64;
+      if (cdiDebugExt >= 30) printf("convertDataScanningMode(): Generating test data in 64 scanning mode..\n");
+      for (size_t j = 0; j < jDim; j++)
+        {
+          size_t jXiDim = j * iDim;
+          for (size_t i = 0; i < iDim; i++)
+            {
+              idxIN = i + jXiDim;
+              data[idxIN] = (double) (100.0 * j + i);
+            }
+        }
+    }
+
+  if ((iDim * jDim) != gridsize)
+    {
+      if (cdiDebugExt >= 30)
+        printf("convertDataScanningMode(): ERROR: (iDim*jDim)!= gridsize;  (%zu * %zu) != %zu\n", iDim, jDim, gridsize);
+      return;
+    }
+  if (cdiDebugExt >= 30)
+    printf("convertDataScanningMode(): scanModeIN=%02d => scanModeOUT=%02d ; where: (iDim * jDim == gridsize)  (%zu*%zu == %zu)\n",
+           scanModeIN, scanModeOUT, iDim, jDim, gridsize);
+
+  if (cdiDebugExt >= 100)
+    {
+      printf("convertDataScanningMode(): data IN:\n");
+      for (size_t j = 0; j < jDim; j++)
+        {
+          size_t jXiDim = j * iDim;
+          for (size_t i = 0; i < iDim; i++)
+            {
+              idxIN = i + jXiDim;
+              printf("%03.0f, ", data[idxIN]);
+            }
+          printf("\n");
+        }
+    }
+
+  if (scanModeIN == scanModeOUT)
+    {
+      if (cdiDebugExt >= 30) printf("convertDataScanningMode(): INFO: Nothing to do;  scanModeIN==scanModeOUT..\n");
+      return;
+    }
+
+  if (0)
+    {
+      return;
+      if (scanModeOUT == 00)
+        {
+          if (cdiDebugExt > 0) printf("convertDataScanningMode(): Leave data unchaged BUT set scanModeOUT=00.\n");
+          // CHECK:  Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the
+          // gribfile as 64 !!
+          return;
+        }
+    }
+  double *dataCopy = (double *) Malloc(gridsize * sizeof(double));
+  memcpy((void *) dataCopy, (void *) data, gridsize * sizeof(double));
+
+  if (scanModeIN
+      == 64)  // Scanning Mode (00 dec)  +i, -j; i direction consecutive (row-major    order West->East   & South->North )
+    {         // Scanning Mode (64 dec)  +i, +j; i direction consecutive (row-major    order West->East   & North->South )
+              // Scanning Mode (96 dec)  +i, +j; j direction consecutive (column-major order North->South & West->East )
+      if (scanModeOUT == 00)
+      // CHECK:  Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the gribfile
+      // as 64 !!
+#define VERTICAL_FLIP
+#ifdef VERTICAL_FLIP
+        {  // flip the data vertically ..
+          idxIN = 0;
+          idxOUT = (jDim - 1) * iDim;
+          if (cdiDebugExt >= 30) printf("convertDataScanningMode():  copying rows nr. (%04d : %04zu)\n", 0, jDim - 1);
+          for (size_t j = 0; j < jDim; j++)
+            {
+              memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double));
+              idxIN += iDim;
+              idxOUT -= iDim;
+            }
+        }  // end if (scanModeOUT==00)*/
+#endif
+#ifdef HORIZONTAL_FLIP
+      {  // flip data horizontally ...
+        if (1)
+          {
+            if (cdiDebugExt >= 30) printf("convertDataScanningMode():  copying columns nr. (%04d : %04d);\n", 0, iDim - 1);
+            for (size_t i = 0; i < iDim; i++)
+              {
+                for (size_t j = 0; j < jDim; j++)
+                  {
+                    size_t jXiDim = j * iDim;
+                    idxIN = i + jXiDim;
+                    // data[idxIN] = (double) (100.0*j +i);  // just some testdata ..
+                    idxOUT = iDim - i - 1 + jXiDim;
+                    // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]);
+                    data[idxOUT] = dataCopy[idxIN];
+                  }
+              }
+          }
+      }  // end if (scanModeOUT==00)
+#endif
+
+      if (scanModeOUT == 96)
+        {  // transpose the data
+          if (cdiDebugExt >= 30)
+            printf("convertDataScanningMode():  transpose data rows=>columns nr. (%04d : %04zu) => (%04d : %04zu);\n", 0, iDim - 1,
+                   0, jDim - 1);
+          for (size_t j = 0; j < jDim; j++)
+            {
+              size_t jXiDim = j * iDim;
+              for (size_t i = 0; i < iDim; i++)
+                {
+                  idxIN = i + jXiDim;
+                  idxOUT = j + i * jDim;
+                  // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]);
+                  data[idxOUT] = dataCopy[idxIN];
+                }
+              // printf(".\n");
+            }
+        }  // end if (scanModeOUT==96)
+    }      // end if (scanModeIN==64)
+
+  if (scanModeIN
+      == 00)  // Scanning Mode (00 dec)  +i, -j; i direction consecutive (row-major    order West->East   & South->North )
+    {         // Scanning Mode (64 dec)  +i, +j; i direction consecutive (row-major    order West->East   & North->South )
+              // Scanning Mode (96 dec)  +i, +j; j direction consecutive (column-major order North->South & West->East )
+      if (scanModeOUT == 64)
+        {  // flip the data vertically ..
+          idxIN = 0;
+          idxOUT = (jDim - 1) * iDim;
+          for (size_t j = 0; j < jDim; j++)
+            {
+              if (cdiDebugExt >= 25)
+                printf("convertDataScanningMode():  copying row nr. %04zu; [idxIN=%08zu] => [idxOUT=%08zu]\n", j, idxIN, idxOUT);
+              memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double));
+              idxIN += iDim;
+              idxOUT -= iDim;
+            }
+        }  // end if (scanModeOUT==64)
+
+      if (scanModeOUT == 96)
+        {  // transpose the data
+          size_t jInv;
+          for (size_t j = 0; j < jDim; j++)
+            {
+              if (cdiDebugExt >= 30) printf("convertDataScanningMode():  processing row nr. %04zu;\n", j);
+              jInv = (jDim - 1) - j;
+              for (size_t i = 0; i < iDim; i++) data[j + i * jDim] = dataCopy[i + jInv * iDim];  // source data has -j
+            }
+        }  // end if (scanModeOUT==96)
+    }      // end if (scanModeIN==00)
+
+  if (scanModeIN
+      == 96)  // Scanning Mode (00 dec)  +i, -j; i direction consecutive (row-major    order West->East   & South->North )
+    {         // Scanning Mode (64 dec)  +i, +j; i direction consecutive (row-major    order West->East   & North->South )
+              // Scanning Mode (96 dec)  +i, +j; j direction consecutive (column-major order North->South & West->East )
+      if (scanModeOUT == 64)
+        {  // transpose the data
+          for (size_t j = 0; j < jDim; j++)
+            {
+              if (cdiDebugExt >= 30) printf("convertDataScanningMode():  processing row nr. %04zu;\n", j);
+              size_t jXiDim = j * iDim;
+              for (size_t i = 0; i < iDim; i++)
+                // data[j + i*jDim] =  dataCopy[i + j*iDim];
+                data[i + jXiDim] = dataCopy[j + i * jDim];
+            }
+        }  // end if (scanModeOUT==64)
+
+      if (scanModeOUT == 00)
+        {  // transpose the data
+          idxIN = 0;
+          idxOUT = 0;
+          size_t jInv;
+          for (size_t j = 0; j < jDim; j++)
+            {
+              if (cdiDebugExt >= 30) printf("convertDataScanningMode():  processing row nr. %04zu;\n", j);
+              jInv = (jDim - 1) - j;
+              size_t jXiDim = j * iDim;
+              for (size_t i = 0; i < iDim; i++)
+                // data[jInv + iXjDim] =  dataCopy[i + jXiDim];  // target data has -j
+                data[i + jXiDim] = dataCopy[jInv + i * jDim];  // target data has -j
+            }
+        }  // end if (scanModeOUT==00)
+    }      // end if (scanModeIN==96)
+
+  if (cdiDebugExt >= 100)
+    {
+      printf("convertDataScanningMode(): data OUT (new scanning mode):\n");
+      for (size_t j = 0; j < jDim; j++)
+        {
+          size_t jXiDim = j * iDim;
+          for (size_t i = 0; i < iDim; i++)
+            {
+              idxIN = i + jXiDim;
+              printf("%03.0f, ", data[idxIN]);
+            }
+          printf("\n");
+        }
+    }
+
+  free(dataCopy);
+}
+#endif  // HIRLAM_EXTENSIONS
+
+static void
+gribapiSetExtMode(grib_handle *gh, int gridID, size_t datasize, const void *data)
+{
+#ifndef HIRLAM_EXTENSIONS
+  (void) gh;
+  (void) data;
+  (void) datasize;
+#endif
+  int gridtype = gridInqType(gridID);
+  if (gridtype == GRID_PROJECTION)
+    {
+      int projtype = gridInqProjType(gridID);
+      // clang-format off
+      if      (projtype == CDI_PROJ_RLL)   gridtype = GRID_LONLAT;
+      else if (projtype == CDI_PROJ_LCC)   gridtype = CDI_PROJ_LCC;
+      else if (projtype == CDI_PROJ_STERE) gridtype = CDI_PROJ_STERE;
+      // clang-format on
+    }
+
+  if (gridtype == GRID_GENERIC || gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED
+      || gridtype == CDI_PROJ_LCC)
+    {
+#ifdef HIRLAM_EXTENSIONS
+      int scanModeIN = 0;
+      cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanModeIN);
+
+      if (cdiDebugExt >= 100) Message("scanModeIN=%d; gridsize=%zu", scanModeIN, gridInqSize(gridID));
+
+      if (cdiGribDataScanningMode.active)  // allowed modes: <0, 64, 96>; Default is 64
+        {
+          size_t iDim = gridInqXsize(gridID);
+          size_t jDim = gridInqYsize(gridID);
+
+          double yfirst = gridInqYval(gridID, 0);
+          double ylast = gridInqYval(gridID, jDim - 1);
+          double yinc = gridInqYinc(gridID);
+
+          int scanModeOUT = cdiGribDataScanningMode.value;
+          convertDataScanningMode(scanModeIN, scanModeOUT, (double *) data, datasize, iDim, jDim);
+          // This will overrule the old scanning mode of the given grid
+          if (cdiDebugExt >= 10) Message("Set GribDataScanningMode (%d) => (%d)", scanModeIN, cdiGribDataScanningMode.value);
+          gribapiSetScanningMode(gh, cdiGribDataScanningMode.value);
+
+          if (((scanModeIN == 00) && (cdiGribDataScanningMode.value == 64))
+              || ((scanModeIN == 64) && (cdiGribDataScanningMode.value == 00)))
+            verticallyFlipGridDefinitionWhenScanningModeChanged(gh, yfirst, ylast, yinc);
+        }
+      else
+        {
+          if (cdiDebugExt >= 100) Message("Set GribDataScanningMode => (%d) based on used grid", scanModeIN);
+          gribapiSetScanningMode(gh, scanModeIN);
+        }
+#endif
+    }
+}
+
+// #define GRIBAPIENCODETEST 1
+
+size_t
+gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype,
+              int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer, size_t *gribbuffersize,
+              int comptype, void *gribContainer)
+{
+  long editionNumber = 2;
+
+  // extern unsigned char _grib_template_GRIB2[];
+  cdi_check_gridsize_int_limit("GRIB", datasize);
+
+  int param = vlistInqVarParam(vlistID, varID);
+  int datatype = vlistInqVarDatatype(vlistID, varID);
+  int typeOfGeneratingProcess = 0;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess);
+  int productDefinitionTemplate = -1;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, &productDefinitionTemplate);
+
+  int uvRelativeToGrid = -1;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid);
+
+#ifdef GRIBAPIENCODETEST
+  grib_handle *gh = (grib_handle *) gribHandleNew(editionNumber);
+#else
+  gribContainer_t *gc = (gribContainer_t *) gribContainer;
+  assert(gc != NULL);
+  grib_handle *gh = (struct grib_handle *) gc->gribHandle;
+#endif
+
+  GRIB_CHECK(grib_get_long(gh, "editionNumber", &editionNumber), 0);
+
+  if (editionNumber == 2)
+    {
+      if (!gc->init)
+        {
+          int backgroundProcess = 0;
+          cdiInqKeyInt(vlistID, varID, CDI_KEY_BACKGROUNDPROCESS, &backgroundProcess);
+          GRIB_CHECK(my_grib_set_long(gh, "typeOfGeneratingProcess", typeOfGeneratingProcess), 0);
+          GRIB_CHECK(my_grib_set_long(gh, "backgroundProcess", backgroundProcess), 0);
+          int status, tablesVersion, localTablesVersion;
+          status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TABLESVERSION, &tablesVersion);
+          if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "tablesVersion", (long) tablesVersion), 0);
+          status = cdiInqKeyInt(vlistID, varID, CDI_KEY_LOCALTABLESVERSION, &localTablesVersion);
+          if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "localTablesVersion", (long) localTablesVersion), 0);
+          int typeOfProcessedData = 0;
+          status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFPROCESSEDDATA, &typeOfProcessedData);
+          if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "typeOfProcessedData", (long) typeOfProcessedData), 0);
+          /*
+          int constituentType = 0;
+          status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CONSTITUENTTYPE, &constituentType);
+          if ( status == 0 ) GRIB_CHECK(my_grib_set_long(gh, "constituentType", (long)constituentType), 0);
+          */
+        }
+    }
+
+  gribapiDefTime((int) editionNumber, productDefinitionTemplate, typeOfGeneratingProcess, gh, vDateTime, tsteptype, numavg,
+                 vlistInqTaxis(vlistID), gc->init);
+
+  {
+    int typeOfTimeIncrement = 0;
+    int status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFTIMEINCREMENT, &typeOfTimeIncrement);
+    if (status == 0) grib_set_long(gh, "typeOfTimeIncrement", (long) typeOfTimeIncrement);
+  }
+
+  {
+    int status, perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast;
+    status = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble);
+    if (status == 0) grib_set_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble);
+    status = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber);
+    if (status == 0) grib_set_long(gh, "perturbationNumber", perturbationNumber);
+    status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast);
+    if (status == 0) grib_set_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast);
+  }
+
+  if (!gc->init) gribapiDefInstitut(gh, vlistID, varID);
+  if (!gc->init) gribapiDefModel(gh, vlistID, varID);
+
+  if (!gc->init)
+    {
+      char name[256], stdname[256];
+      vlistInqVarName(vlistID, varID, name);
+      vlistInqVarStdname(vlistID, varID, stdname);
+      gribapiDefParam((int) editionNumber, gh, param, name, stdname);
+    }
+
+  if (!gc->init && editionNumber == 2)
+    {
+      int shapeOfTheEarth = 0;
+      cdiInqKeyInt(vlistID, varID, CDI_KEY_SHAPEOFTHEEARTH, &shapeOfTheEarth);
+      GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", (long) shapeOfTheEarth), 0);
+
+      int grib2LocalSectionNumber, section2PaddingLength;
+      int mpimType, mpimClass, mpimUser;
+      if (cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMTYPE, &mpimType) == CDI_NOERR
+          && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMCLASS, &mpimClass) == CDI_NOERR
+          && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMUSER, &mpimUser) == CDI_NOERR)
+        {
+          grib_set_long(gh, "grib2LocalSectionPresent", 1);
+          grib_set_long(gh, "grib2LocalSectionNumber", 1);
+          grib_set_long(gh, "mpimType", mpimType);
+          grib_set_long(gh, "mpimClass", mpimClass);
+          grib_set_long(gh, "mpimUser", mpimUser);
+
+          int revNumLen = 20;
+          unsigned char revNumber[revNumLen];
+          if (cdiInqKeyBytes(vlistID, varID, CDI_KEY_REVNUMBER, revNumber, &revNumLen) == CDI_NOERR)
+            {
+              size_t revNumLenS = (size_t) revNumLen;
+              grib_set_bytes(gh, "revNumber", revNumber, &revNumLenS);
+            }
+          int revStatus;
+          if (cdiInqKeyInt(vlistID, varID, CDI_KEY_REVSTATUS, &revStatus) == CDI_NOERR) grib_set_long(gh, "revStatus", revStatus);
+        }
+      else if (cdiInqKeyInt(vlistID, varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, &grib2LocalSectionNumber) == CDI_NOERR
+               && cdiInqKeyInt(vlistID, varID, CDI_KEY_SECTION2PADDINGLENGTH, &section2PaddingLength) == CDI_NOERR)
+        {
+          grib_set_long(gh, "grib2LocalSectionPresent", 1);
+          grib_set_long(gh, "grib2LocalSectionNumber", grib2LocalSectionNumber);
+          unsigned char *section2Padding = (unsigned char *) Malloc((size_t) section2PaddingLength);
+          cdiInqKeyBytes(vlistID, varID, CDI_KEY_SECTION2PADDING, section2Padding, &section2PaddingLength);
+          size_t len = (size_t) section2PaddingLength;
+          // Does not work anymore with ecCodes 2.22.0/2.25.0!!!
+          // ECCODES ERROR   :  pack_bytes: Wrong size (10) for section2Padding. It is 0 bytes long
+          grib_set_bytes(gh, "section2Padding", section2Padding, &len);
+          Free(section2Padding);
+        }
+    }
+
+  // bitsPerValue have to be defined first (complex packing)
+  GRIB_CHECK(my_grib_set_long(gh, "bitsPerValue", (long) grbBitsPerValue(datatype)), 0);
+
+  if (!gc->init) gribapiDefGrid((int) editionNumber, gh, gridID, comptype, datatype, uvRelativeToGrid);
+
+  gribapiDefLevel((int) editionNumber, gh, zaxisID, levelID, gc->init, productDefinitionTemplate);
+
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int zaxisSize = zaxisInqSize(zaxisID);
+  // if (!gc->init)
+  {
+    int ret = 0;
+
+    // NOTE: Optional key/value pairs: Note that we do not distinguish between tiles here!
+
+    for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++)
+      {
+        if (vlistptr->vars[varID].opt_grib_kvpair[i].update)
+          {
+            // DR: Fix for multi-level fields (otherwise only the 1st level is correct)
+            if (zaxisSize == (levelID + 1)) vlistptr->vars[varID].opt_grib_kvpair[i].update = false;
+
+            if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double)
+              {
+                if (CDI_Debug)
+                  Message("key \"%s\"  :   double value = %g", vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
+                          vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val);
+                my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
+                                   vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val);
+                GRIB_CHECK(ret, 0);
+              }
+            if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int)
+              {
+                if (CDI_Debug)
+                  Message("key \"%s\"  :   integer value = %d", vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
+                          vlistptr->vars[varID].opt_grib_kvpair[i].int_val);
+                my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword,
+                                 (long) vlistptr->vars[varID].opt_grib_kvpair[i].int_val);
+                GRIB_CHECK(ret, 0);
+              }
+          }
+      }
+  }
+
+  if (numMissVals > 0)
+    {
+      GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 1), 0);
+      GRIB_CHECK(my_grib_set_double(gh, "missingValue", vlistInqVarMissval(vlistID, varID)), 0);
+    }
+
+  gribapiSetExtMode(gh, gridID, (size_t) datasize, data);
+
+  if (memType == MEMTYPE_FLOAT)
+    {
+#ifdef HAVE_GRIBAPI_FLOAT_INTERFACE
+      GRIB_CHECK(grib_set_float_array(gh, "values", (const float *) data, (size_t) datasize), 0);
+#else
+      Error("grib_set_float_array() not found!");
+#endif
+    }
+  else
+    {
+      GRIB_CHECK(grib_set_double_array(gh, "values", (const double *) data, (size_t) datasize), 0);
+    }
+
+  if (numMissVals)
+    {
+      long numberOfMissing = -1;
+      GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &numberOfMissing), 0);
+      if (numberOfMissing == 0) GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 0), 0);
+    }
+
+  // get the size of coded message
+  const void *dummy = NULL;
+  size_t recsize = 0;
+  GRIB_CHECK(grib_get_message(gh, &dummy, &recsize), 0);
+  recsize += 512;  // add some space for possible filling
+  *gribbuffersize = recsize;
+  *gribbuffer = Malloc(*gribbuffersize);
+
+  if (CDI_Debug && !gc->init && editionNumber == 2)
+    {
+      long pdis;
+      grib_get_long(gh, "discipline", &pdis);
+      if (pdis != 255)
+        {
+          char cdi_name[CDI_MAX_NAME];
+          cdi_name[0] = 0;
+          vlistInqVarName(vlistID, varID, cdi_name);
+          char grb_name[256];
+          gribapi_get_string(gh, "shortName", grb_name, sizeof(grb_name));
+          str_to_lower(cdi_name);
+          str_to_lower(grb_name);
+          bool checkName = (!grb_name[0] && strncmp(cdi_name, "param", 5) == 0) ? false : true;
+          if (checkName && ((strlen(cdi_name) != strlen(grb_name)) || !strStartsWith(cdi_name, grb_name)))
+            Warning("*** GRIB2 shortName does not correspond to chosen variable name: \"%s\" (\"%s\").",
+                    grb_name[0] ? grb_name : "unknown", cdi_name);
+        }
+    }
+
+  // get a copy of the coded message
+  GRIB_CHECK(grib_get_message_copy(gh, *gribbuffer, &recsize), 0);
+
+#ifdef GRIBAPIENCODETEST
+  gribHandleDelete(gh);
+#endif
+
+  gc->init = true;
+
+  return recsize;
+}
+
+void
+gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int level)
+{
+  //  timeRangeIndicator: could be included later
+  if (gribEditionNumber(gh) <= 1)
+    {
+      if (code != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", code), 0);
+      if (ltype != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfTypeOfLevel", ltype), 0);
+      if (level != -1) GRIB_CHECK(my_grib_set_long(gh, "level", level), 0);
+    }
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <float.h>
+
+
+
+#ifdef HAVE_LIBIEG
+
+static int
+iegInqDatatype(int prec)
+{
+  return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+}
+
+static int
+iegDefDatatype(int datatype)
+{
+  if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/IEG library does not support complex numbers!");
+
+  if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32;
+
+  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
+}
+
+static void
+ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *iegp = streamptr->record->objectp;
+  if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!");
+
+  iegInqDataFP32(iegp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  *numMissVals = get_num_missvalsSP(size, data, (float) missval);
+
+  streamptr->numvals += (SizeType) size;
+}
+
+static void
+ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *iegp = streamptr->record->objectp;
+  if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!");
+
+  iegInqDataFP64(iegp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  *numMissVals = get_num_missvalsDP(size, data, missval);
+
+  streamptr->numvals += (SizeType) size;
+}
+
+void
+ieg_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    ieg_read_recordDP(streamptr, (double *) data, numMissVals);
+  else
+    ieg_read_recordSP(streamptr, (float *) data, numMissVals);
+}
+
+static int
+iegGetZaxisType(int iegleveltype)
+{
+  // clang-format off
+  switch (iegleveltype)
+    {
+    case IEG_LTYPE_SURFACE:         return ZAXIS_SURFACE;
+    case IEG_LTYPE_99:
+    case IEG_LTYPE_ISOBARIC:        return ZAXIS_PRESSURE;
+    case IEG_LTYPE_HEIGHT:          return ZAXIS_HEIGHT;
+    case IEG_LTYPE_ALTITUDE:        return ZAXIS_ALTITUDE;
+    case IEG_LTYPE_HYBRID:
+    case IEG_LTYPE_HYBRID_LAYER:    return ZAXIS_HYBRID;
+    case IEG_LTYPE_LANDDEPTH:
+    case IEG_LTYPE_LANDDEPTH_LAYER: return ZAXIS_DEPTH_BELOW_LAND;
+    case IEG_LTYPE_SEADEPTH:        return ZAXIS_DEPTH_BELOW_SEA;
+    }
+  // clang-format on
+  return ZAXIS_GENERIC;
+}
+
+static void
+iegDefTime(int *pdb, CdiDateTime datetime, int taxisID)
+{
+  int timetype = (taxisID != -1) ? taxisInqType(taxisID) : -1;
+  if (timetype == TAXIS_ABSOLUTE || timetype == TAXIS_RELATIVE)
+    {
+      IEG_P_Year(pdb) = datetime.date.year;
+      IEG_P_Month(pdb) = datetime.date.month;
+      IEG_P_Day(pdb) = datetime.date.day;
+      IEG_P_Hour(pdb) = datetime.time.hour;
+      IEG_P_Minute(pdb) = datetime.time.minute;
+
+      pdb[15] = 1;
+      pdb[16] = 0;
+      pdb[17] = 0;
+      pdb[18] = 10;
+      pdb[36] = 1;
+    }
+
+  pdb[5] = 128;
+}
+
+/* find smallest power of 10 in [1000,10000000] that upon multiplication results in fractional part
+   close to zero for all arguments */
+static double
+calc_resfac(double xfirst, double xlast, double xinc, double yfirst, double ylast, double yinc)
+{
+  double resfac = 1000.0;
+  enum
+  {
+    nPwrOf10 = 5,
+    nMultTests = 6,
+  };
+  static const double scaleFactors[nPwrOf10] = { 1000, 10000, 100000, 1000000, 10000000 };
+  const double vals[nMultTests] = { xfirst, xlast, xinc, yfirst, ylast, yinc };
+
+  for (size_t j = 0; j < nPwrOf10; ++j)
+    {
+      double scaleBy = scaleFactors[j];
+      bool fractionalScale = false;
+      for (size_t i = 0; i < nMultTests; ++i)
+        {
+          fractionalScale = fractionalScale || fabs(vals[i] * scaleBy - round(vals[i] * scaleBy)) > FLT_EPSILON;
+        }
+      if (!fractionalScale)
+        {
+          resfac = scaleBy;
+          break;
+        }
+    }
+
+  return resfac;
+}
+
+static void
+iegDefGrid(int *gdb, int gridID)
+{
+  int projID = gridInqProj(gridID);
+  if (projID != CDI_UNDEFID && gridInqProjType(projID) == CDI_PROJ_RLL) gridID = projID;
+
+  int gridtype = gridInqType(gridID);
+  int projtype = CDI_UNDEFID;
+  if (gridtype == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) projtype = CDI_PROJ_RLL;
+
+  SizeType xsize = gridInqXsize(gridID);
+  SizeType ysize = gridInqYsize(gridID);
+
+  cdi_check_gridsize_int_limit("IEG", xsize * ysize);
+
+  if (gridtype == GRID_GENERIC)
+    {
+      if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160) && (xsize == 2 * ysize || xsize == 1))
+        {
+          gridtype = GRID_GAUSSIAN;
+          gridChangeType(gridID, gridtype);
+        }
+      else if ((xsize == 1 && ysize == 1) || (xsize == 0 && ysize == 0))
+        {
+          gridtype = GRID_LONLAT;
+          gridChangeType(gridID, gridtype);
+        }
+      else if (gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL))
+        {
+          gridtype = GRID_LONLAT;
+          gridChangeType(gridID, gridtype);
+        }
+    }
+  else if (gridtype == GRID_CURVILINEAR)
+    {
+      gridtype = GRID_LONLAT;
+    }
+
+  bool lrotated = (projtype == CDI_PROJ_RLL);
+
+  if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL)
+    {
+      double xfirst = 0.0, xlast = 0.0, xinc = 0.0;
+      double yfirst = 0.0, ylast = 0.0, yinc = 0.0;
+
+      if (xsize == 0)
+        xsize = 1;
+      else
+        {
+          xfirst = gridInqXval(gridID, 0);
+          xlast = gridInqXval(gridID, xsize - 1);
+          xinc = gridInqXinc(gridID);
+        }
+
+      if (ysize == 0)
+        ysize = 1;
+      else
+        {
+          yfirst = gridInqYval(gridID, 0);
+          ylast = gridInqYval(gridID, ysize - 1);
+          yinc = gridInqYinc(gridID);
+        }
+
+      if (gridtype == GRID_GAUSSIAN)
+        IEG_G_GridType(gdb) = 4;
+      else if (lrotated)
+        IEG_G_GridType(gdb) = 10;
+      else
+        IEG_G_GridType(gdb) = 0;
+
+      double resfac = calc_resfac(xfirst, xlast, xinc, yfirst, ylast, yinc);
+      int iresfac = (int) resfac;
+      if (iresfac == 1000) iresfac = 0;
+
+      IEG_G_ResFac(gdb) = iresfac;
+
+      IEG_G_NumLon(gdb) = (int) xsize;
+      IEG_G_NumLat(gdb) = (int) ysize;
+      IEG_G_FirstLat(gdb) = (int) lround(yfirst * resfac);
+      IEG_G_LastLat(gdb) = (int) lround(ylast * resfac);
+      IEG_G_FirstLon(gdb) = (int) lround(xfirst * resfac);
+      IEG_G_LastLon(gdb) = (int) lround(xlast * resfac);
+      IEG_G_LonIncr(gdb) = (int) lround(xinc * resfac);
+      if (fabs(xinc * resfac - IEG_G_LonIncr(gdb)) > FLT_EPSILON) IEG_G_LonIncr(gdb) = 0;
+
+      if (gridtype == GRID_GAUSSIAN)
+        IEG_G_LatIncr(gdb) = (int) ysize / 2;
+      else
+        {
+          IEG_G_LatIncr(gdb) = (int) lround(yinc * resfac);
+          if (fabs(yinc * resfac - IEG_G_LatIncr(gdb)) > FLT_EPSILON) IEG_G_LatIncr(gdb) = 0;
+
+          if (IEG_G_LatIncr(gdb) < 0) IEG_G_LatIncr(gdb) = -IEG_G_LatIncr(gdb);
+        }
+
+      if (IEG_G_NumLon(gdb) > 1 && IEG_G_NumLat(gdb) == 1)
+        if (IEG_G_LonIncr(gdb) != 0 && IEG_G_LatIncr(gdb) == 0) IEG_G_LatIncr(gdb) = IEG_G_LonIncr(gdb);
+
+      if (IEG_G_NumLon(gdb) == 1 && IEG_G_NumLat(gdb) > 1)
+        if (IEG_G_LonIncr(gdb) == 0 && IEG_G_LatIncr(gdb) != 0) IEG_G_LonIncr(gdb) = IEG_G_LatIncr(gdb);
+
+      IEG_G_ResFlag(gdb) = (IEG_G_LatIncr(gdb) == 0 || IEG_G_LonIncr(gdb) == 0) ? 0 : 128;
+
+      if (lrotated)
+        {
+          double xpole = 0.0, ypole = 0.0, angle = 0.0;
+          gridInqParamRLL(gridID, &xpole, &ypole, &angle);
+
+          IEG_G_LatSP(gdb) = -(int) lround(ypole * resfac);
+          IEG_G_LonSP(gdb) = (int) lround((xpole + 180) * resfac);
+          IEG_G_Size(gdb) = 42;
+        }
+      else
+        {
+          IEG_G_Size(gdb) = 32;
+        }
+    }
+  else
+    {
+      Error("Unsupported grid type: %s", gridNamePtr(gridtype));
+    }
+
+  IEG_G_ScanFlag(gdb) = 64;
+}
+
+static void
+pdbDefLevel(int *pdb, int leveltype, int level1, int level2)
+{
+  IEG_P_LevelType(pdb) = leveltype;
+  IEG_P_Level1(pdb) = level1;
+  IEG_P_Level2(pdb) = level2;
+}
+
+static void
+iegDefLevel(int *pdb, int *gdb, double *vct, int zaxisID, int levelID)
+{
+  double level;
+
+  int leveltype = zaxisInqType(zaxisID);
+  if (leveltype == ZAXIS_GENERIC)
+    {
+      Warning("Changed zaxis type from %s to %s", zaxisNamePtr(leveltype), zaxisNamePtr(ZAXIS_PRESSURE));
+      leveltype = ZAXIS_PRESSURE;
+      zaxisChangeType(zaxisID, leveltype);
+      cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa");
+    }
+
+  // IEG_G_NumVCP(gdb) = 0;
+
+  switch (leveltype)
+    {
+    case ZAXIS_SURFACE:
+      {
+        pdbDefLevel(pdb, IEG_LTYPE_SURFACE, 0, (int) (zaxisInqLevel(zaxisID, levelID)));
+        break;
+      }
+    case ZAXIS_HYBRID:
+      {
+        if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL))
+          pdbDefLevel(pdb, IEG_LTYPE_HYBRID_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)),
+                      (int) (zaxisInqUbound(zaxisID, levelID)));
+        else
+          pdbDefLevel(pdb, IEG_LTYPE_HYBRID, 0, (int) (zaxisInqLevel(zaxisID, levelID)));
+
+        int vctsize = zaxisInqVctSize(zaxisID);
+        if (vctsize > 100)
+          {
+            static bool vct_warning = true;
+            // IEG_G_NumVCP(gdb) = 0;
+            if (vct_warning)
+              {
+                Warning("VCT size of %d is too large (maximum is 100). Set to 0!", vctsize);
+                vct_warning = false;
+              }
+          }
+        else
+          {
+            IEG_G_Size(gdb) += (vctsize * 4);
+            memcpy(vct, zaxisInqVctPtr(zaxisID), (size_t) vctsize / 2 * sizeof(double));
+            memcpy(vct + 50, zaxisInqVctPtr(zaxisID) + vctsize / 2, (size_t) vctsize / 2 * sizeof(double));
+          }
+        break;
+      }
+    case ZAXIS_PRESSURE:
+      {
+        level = zaxisInqLevel(zaxisID, levelID);
+        if (level < 0) Warning("pressure level of %f Pa is below 0.", level);
+
+        char units[CDI_MAX_NAME];
+        int length = CDI_MAX_NAME;
+        cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length);
+        if (memcmp(units, "hPa", 3) == 0 || memcmp(units, "mb", 2) == 0) level = level * 100;
+
+        double dum;
+        int ilevel = (int) level;
+        if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0))
+          pdbDefLevel(pdb, IEG_LTYPE_99, 0, ilevel);
+        else
+          pdbDefLevel(pdb, IEG_LTYPE_ISOBARIC, 0, ilevel / 100);
+
+        break;
+      }
+    case ZAXIS_HEIGHT:
+      {
+        level = zaxisInqLevel(zaxisID, levelID);
+        pdbDefLevel(pdb, IEG_LTYPE_HEIGHT, 0, (int) level);
+        break;
+      }
+    case ZAXIS_ALTITUDE:
+      {
+        level = zaxisInqLevel(zaxisID, levelID);
+        pdbDefLevel(pdb, IEG_LTYPE_ALTITUDE, 0, (int) level);
+        break;
+      }
+    case ZAXIS_DEPTH_BELOW_LAND:
+      {
+        if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL))
+          pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)),
+                      (int) (zaxisInqUbound(zaxisID, levelID)));
+        else
+          pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH, 0, (int) (zaxisInqLevel(zaxisID, levelID)));
+
+        break;
+      }
+    case ZAXIS_DEPTH_BELOW_SEA:
+      {
+        level = zaxisInqLevel(zaxisID, levelID);
+        pdbDefLevel(pdb, IEG_LTYPE_SEADEPTH, 0, (int) level);
+        break;
+      }
+    case ZAXIS_ISENTROPIC:
+      {
+        level = zaxisInqLevel(zaxisID, levelID);
+        pdbDefLevel(pdb, 113, 0, (int) level);
+        break;
+      }
+    default:
+      {
+        Error("Unsupported zaxis type: %s", zaxisNamePtr(leveltype));
+        break;
+      }
+    }
+}
+
+void
+iegCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
+{
+  streamFCopyRecord(streamptr2, streamptr1, "IEG");
+}
+
+void
+iegDefRecord(stream_t *streamptr)
+{
+  Record *record = streamptr->record;
+
+  int vlistID = streamptr->vlistID;
+  int byteorder = streamptr->byteorder;
+
+  int varID = record->varID;
+  int levelID = record->levelID;
+  int tsID = streamptr->curTsID;
+  CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime;
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+  iegrec_t *iegp = (iegrec_t *) record->objectp;
+  iegInitMem(iegp);
+  for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1;
+
+  iegp->byteswap = getByteswap(byteorder);
+
+  int param = vlistInqVarParam(vlistID, varID);
+  int pdis, pcat, pnum;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+  IEG_P_Parameter(iegp->ipdb) = pnum;
+  if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat;
+
+  iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID));
+  iegDefGrid(iegp->igdb, gridID);
+  iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levelID);
+
+  iegp->dprec = iegDefDatatype(record->prec);
+}
+
+static double
+calc_refvalSP(size_t size, const float *data)
+{
+  float refval = data[0];
+  for (size_t i = 1; i < size; ++i)
+    if (data[i] < refval) refval = data[i];
+  return refval;
+}
+
+static double
+calc_refvalDP(size_t size, const double *data)
+{
+  double refval = data[0];
+  for (size_t i = 1; i < size; ++i)
+    if (data[i] < refval) refval = data[i];
+  return refval;
+}
+
+static void
+ieg_write_recordSP(stream_t *streamptr, const float *data)
+{
+  Record *record = streamptr->record;
+  iegrec_t *iegp = (iegrec_t *) record->objectp;
+
+  int fileID = streamptr->fileID;
+  size_t gridsize = (size_t) gridInqSize(record->gridID);
+
+  iegp->refval = calc_refvalSP(gridsize, data);
+
+  iegDefDataFP32(iegp, data);
+  iegWrite(fileID, iegp);
+}
+
+static void
+ieg_write_recordDP(stream_t *streamptr, const double *data)
+{
+  Record *record = streamptr->record;
+  iegrec_t *iegp = (iegrec_t *) record->objectp;
+
+  int fileID = streamptr->fileID;
+  size_t gridsize = (size_t) gridInqSize(record->gridID);
+
+  iegp->refval = calc_refvalDP(gridsize, data);
+
+  iegDefDataFP64(iegp, data);
+  iegWrite(fileID, iegp);
+}
+
+void
+ieg_write_record(stream_t *streamptr, int memtype, const void *data)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    ieg_write_recordDP(streamptr, (const double *) data);
+  else
+    ieg_write_recordSP(streamptr, (const float *) data);
+}
+
+static void
+iegAddRecord(stream_t *streamptr, int param, int *pdb, int *gdb, double *vct, size_t recsize, off_t position, int prec)
+{
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int recID = recordNewEntry(streamptr, tsID);
+  record_t *record = &streamptr->tsteps[tsID].records[recID];
+
+  int level1, level2;
+  if (IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER)
+    {
+      level1 = IEG_P_Level1(pdb);
+      level2 = IEG_P_Level2(pdb);
+    }
+  else
+    {
+      level1 = IEG_P_Level2(pdb);
+      level2 = 0;
+      if (IEG_P_LevelType(pdb) == 100) level1 *= 100;
+    }
+
+  record->size = recsize;
+  record->position = position;
+  record->param = param;
+  record->ilevel = level1;
+  record->ilevel2 = level2;
+  record->ltype = IEG_P_LevelType(pdb);
+
+  int gridtype = (IEG_G_GridType(gdb) == 0)    ? GRID_LONLAT
+                 : (IEG_G_GridType(gdb) == 10) ? GRID_PROJECTION
+                 : (IEG_G_GridType(gdb) == 4)  ? GRID_GAUSSIAN
+                                               : GRID_GENERIC;
+
+  grid_t *grid = (grid_t *) Malloc(sizeof(*grid));
+  grid_init(grid);
+  size_t xsize = (size_t) IEG_G_NumLon(gdb);
+  size_t ysize = (size_t) IEG_G_NumLat(gdb);
+  cdiGridTypeInit(grid, gridtype, xsize * ysize);
+  grid->x.size = xsize;
+  grid->y.size = ysize;
+  grid->x.inc = 0;
+  grid->y.inc = 0;
+  grid->x.flag = 0;
+
+  int iresfac = IEG_G_ResFac(gdb);
+  if (iresfac == 0) iresfac = 1000;
+  double resfac = 1. / (double) iresfac;
+
+  // if ( IEG_G_FirstLon != 0 || IEG_G_LastLon != 0 )
+  {
+    if (xsize > 1)
+      {
+        if (IEG_G_ResFlag(gdb) && IEG_G_LonIncr(gdb) > 0)
+          grid->x.inc = IEG_G_LonIncr(gdb) * resfac;
+        else
+          grid->x.inc = (IEG_G_LastLon(gdb) - IEG_G_FirstLon(gdb)) * resfac / ((double) xsize - 1);
+
+        // correct xinc if necessary
+        if (IEG_G_FirstLon(gdb) == 0 && IEG_G_LastLon(gdb) > 354000)
+          {
+            double xinc = 360. / (double) xsize;
+            // FIXME: why not use grid->x.inc != xinc as condition?
+            if (fabs(grid->x.inc - xinc) > 0.0)
+              {
+                grid->x.inc = xinc;
+                if (CDI_Debug) Message("set xinc to %g", grid->x.inc);
+              }
+          }
+      }
+    grid->x.first = IEG_G_FirstLon(gdb) * resfac;
+    grid->x.last = IEG_G_LastLon(gdb) * resfac;
+    grid->x.flag = 2;
+  }
+  grid->y.flag = 0;
+  // if ( IEG_G_FirstLat != 0 || IEG_G_LastLat != 0 )
+  {
+    if (ysize > 1)
+      {
+        if (IEG_G_ResFlag(gdb) && IEG_G_LatIncr(gdb) > 0)
+          grid->y.inc = IEG_G_LatIncr(gdb) * resfac;
+        else
+          grid->y.inc = (IEG_G_LastLat(gdb) - IEG_G_FirstLat(gdb)) * resfac / (double) (ysize - 1);
+      }
+    grid->y.first = IEG_G_FirstLat(gdb) * resfac;
+    grid->y.last = IEG_G_LastLat(gdb) * resfac;
+    grid->y.flag = 2;
+  }
+
+  double xpole = 0, ypole = 0;
+  if (IEG_G_GridType(gdb) == 10)
+    {
+      xpole = IEG_G_LonSP(gdb) * resfac - 180;
+      ypole = -IEG_G_LatSP(gdb) * resfac;
+      grid->projtype = CDI_PROJ_RLL;
+    }
+
+  struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0);
+  int gridID = gridAdded.Id;
+  if (!gridAdded.isNew)
+    {
+      grid_free(grid);
+      Free(grid);
+    }
+  else if (gridtype == GRID_PROJECTION)
+    gridDefParamRLL(gridID, xpole, ypole, 0);
+
+  int leveltype = iegGetZaxisType(IEG_P_LevelType(pdb));
+  if (leveltype == ZAXIS_HYBRID)
+    {
+      double tmpvct[100];
+      size_t vctsize = (size_t) IEG_G_NumVCP(gdb);
+
+      for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i] = vct[i];
+      for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i + vctsize / 2] = vct[i + 50];
+
+      varDefVCT(vctsize, tmpvct);
+    }
+
+  int lbounds = IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER ? 1 : 0;
+
+  int datatype = iegInqDatatype(prec);
+
+  int varID, levelID = 0;
+  varAddRecord(recID, param, gridID, leveltype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1,
+               NULL, NULL, NULL, NULL);
+
+  record->varID = (short) varID;
+  record->levelID = levelID;
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+
+  if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID);
+}
+
+#if 0
+static
+void iegCmpRecord(stream_t *streamptr, int tsID, int recID, off_t position, int param,
+		  int level, size_t xsize, size_t ysize)
+{
+  int varID = 0;
+  int levelID = 0;
+
+  record_t *record  = &streamptr->tsteps[tsID].records[recID];
+
+  if (param != (*record).param || level != (*record).ilevel) Error("inconsistent timestep");
+
+  (*record).position = position;
+  /*
+  varID   = (*record).varID;
+  levelID = (*record).levelID;
+
+  streamptr->vars[varID].level[levelID] = recID;
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+  */
+  if (CDI_Debug) Message("varID = %d levelID = %d", varID, levelID);
+}
+#endif
+
+static CdiDateTime
+iegDateTime(const int *pdb)
+{
+  int ryear = IEG_P_Year(pdb);
+  int rmonth = IEG_P_Month(pdb);
+  int rday = IEG_P_Day(pdb);
+
+  int rhour = IEG_P_Hour(pdb);
+  int rminute = IEG_P_Minute(pdb);
+
+  if (rminute == -1) rminute = 0;
+
+  CdiDateTime cdiDateTime;
+  cdiDateTime.date = cdiDate_encode(ryear, rmonth, rday);
+  cdiDateTime.time = cdiTime_encode(rhour, rminute, 0, 0);
+  return cdiDateTime;
+}
+
+static void
+iegScanTimestep1(stream_t *streamptr)
+{
+  CdiDateTime datetime0;
+  cdiDateTime_init(&datetime0);
+  off_t recpos;
+  iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
+
+  streamptr->curTsID = 0;
+
+  int tsID = tstepsNewEntry(streamptr);
+  if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID);
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int fileID = streamptr->fileID;
+
+  int nrecs = 0;
+  while (true)
+    {
+      recpos = fileGetPos(fileID);
+      if (iegRead(fileID, iegp) != 0)
+        {
+          streamptr->ntsteps = 1;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      int prec = iegp->dprec;
+      int rcode = IEG_P_Parameter(iegp->ipdb);
+      int tabnum = IEG_P_CodeTable(iegp->ipdb);
+      int param = cdiEncodeParam(rcode, tabnum, 255);
+      int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb);
+
+      if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
+
+      CdiDateTime datetime = iegDateTime(iegp->ipdb);
+
+      if (nrecs == 0)
+        {
+          datetime0 = datetime;
+          taxis->vDateTime = datetime;
+        }
+      else
+        {
+          record_t *records = streamptr->tsteps[tsID].records;
+          for (int recID = 0; recID < nrecs; recID++)
+            if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished;
+
+          if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for param %d level %d", param, rlevel);
+        }
+
+      nrecs++;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d %s", nrecs, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
+
+      iegAddRecord(streamptr, param, iegp->ipdb, iegp->igdb, iegp->vct, recsize, recpos, prec);
+    }
+
+tstepScanLoopFinished:
+  streamptr->rtsteps = 1;
+
+  cdi_generate_vars(streamptr);
+
+  int taxisID = taxisCreate(TAXIS_ABSOLUTE);
+  taxis->type = TAXIS_ABSOLUTE;
+  taxis->rDateTime = taxis->vDateTime;
+
+  int vlistID = streamptr->vlistID;
+  vlistDefTaxis(vlistID, taxisID);
+
+  vlist_check_contents(vlistID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+  streamScanTimeConstAdjust(streamptr, taxis);
+}
+
+static int
+iegScanTimestep2(stream_t *streamptr)
+{
+  off_t recpos = 0;
+  iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
+
+  streamptr->curTsID = 1;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int tsID = streamptr->rtsteps;
+  if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+  cdi_create_records(streamptr, tsID);
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  int nrecords = streamScanInitRecords2(streamptr);
+
+  for (int rindex = 0; rindex <= nrecords; rindex++)
+    {
+      recpos = fileGetPos(fileID);
+      if (iegRead(fileID, iegp) != 0)
+        {
+          streamptr->ntsteps = 2;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      int rcode = IEG_P_Parameter(iegp->ipdb);
+      int tabnum = IEG_P_CodeTable(iegp->ipdb);
+      int param = cdiEncodeParam(rcode, tabnum, 255);
+      int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb);
+
+      if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
+
+      CdiDateTime datetime = iegDateTime(iegp->ipdb);
+
+      if (rindex == 0)
+        {
+          taxis->type = TAXIS_ABSOLUTE;
+          taxis->vDateTime = datetime;
+        }
+
+      bool nextstep = false;
+      int recID = 0;
+      for (recID = 0; recID < nrecords; recID++)
+        {
+          if (param == records[recID].param && rlevel == records[recID].ilevel)
+            {
+              if (records[recID].used)
+                {
+                  nextstep = true;
+                }
+              else
+                {
+                  records[recID].used = true;
+                  streamptr->tsteps[tsID].recIDs[rindex] = recID;
+                }
+              break;
+            }
+        }
+      if (recID == nrecords)
+        {
+          char paramstr[32];
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+          Warning("param %s level %d not defined at timestep 1", paramstr, rlevel);
+          return CDI_EUFSTRUCT;
+        }
+
+      if (nextstep) break;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex + 1, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
+
+      if (param != records[recID].param || rlevel != records[recID].ilevel)
+        {
+          Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                  records[recID].ilevel, rlevel);
+          return CDI_EUFSTRUCT;
+        }
+
+      records[recID].position = recpos;
+      records[recID].size = recsize;
+    }
+
+  int nrecs = 0;
+  for (int recID = 0; recID < nrecords; recID++)
+    {
+      if (records[recID].used)
+        nrecs++;
+      else
+        vlistDefVarTimetype(vlistID, records[recID].varID, TIME_CONSTANT);
+    }
+  streamptr->tsteps[tsID].nrecs = nrecs;
+
+  streamptr->rtsteps = 2;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+
+  return 0;
+}
+
+int
+iegInqContents(stream_t *streamptr)
+{
+  streamptr->curTsID = 0;
+
+  iegScanTimestep1(streamptr);
+
+  int status = (streamptr->ntsteps == -1) ? iegScanTimestep2(streamptr) : 0;
+
+  fileSetPos(streamptr->fileID, 0, SEEK_SET);
+
+  return status;
+}
+
+static long
+iegScanTimestep(stream_t *streamptr)
+{
+  off_t recpos = 0;
+  iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
+
+  if (streamptr->rtsteps == 0) Error("Internal problem! Missing contents.");
+
+  int tsID = streamptr->rtsteps;
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int nrecs = 0;
+  if (streamptr->tsteps[tsID].recordSize == 0)
+    {
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      nrecs = streamScanInitRecords(streamptr, tsID);
+
+      int fileID = streamptr->fileID;
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+      for (int rindex = 0; rindex <= nrecs; rindex++)
+        {
+          recpos = fileGetPos(fileID);
+          if (iegRead(fileID, iegp) != 0)
+            {
+              streamptr->ntsteps = streamptr->rtsteps + 1;
+              break;
+            }
+
+          size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+          int rcode = IEG_P_Parameter(iegp->ipdb);
+          int tabnum = IEG_P_CodeTable(iegp->ipdb);
+          int param = cdiEncodeParam(rcode, tabnum, 255);
+          int rlevel
+              = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb);
+
+          if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100;
+
+          CdiDateTime datetime = iegDateTime(iegp->ipdb);
+
+          // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error
+          if (rindex == nrecs) continue;
+          int recID = streamptr->tsteps[tsID].recIDs[rindex];
+
+          if (rindex == 0)
+            {
+              taxis->type = TAXIS_ABSOLUTE;
+              taxis->vDateTime = datetime;
+            }
+
+          if (param != records[recID].param || rlevel != records[recID].ilevel)
+            {
+              Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                      records[recID].ilevel, rlevel);
+              Error("Invalid, unsupported or inconsistent record structure");
+            }
+
+          records[recID].position = recpos;
+          records[recID].size = recsize;
+
+          if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex, (int) recpos, param, rlevel, CdiDateTime_string(datetime));
+        }
+
+      streamptr->rtsteps++;
+
+      if (streamptr->ntsteps != streamptr->rtsteps)
+        {
+          tsID = tstepsNewEntry(streamptr);
+          if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+          streamptr->tsteps[tsID - 1].next = true;
+          streamptr->tsteps[tsID].position = recpos;
+        }
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+      streamptr->tsteps[tsID].position = recpos;
+    }
+
+  if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs)
+    {
+      Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID);
+      streamptr->ntsteps = tsID;
+    }
+
+  return streamptr->ntsteps;
+}
+
+int
+iegInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!");
+
+  if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps);
+
+  long ntsteps = CDI_UNDEFID;
+  while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = iegScanTimestep(streamptr);
+
+  int nrecs = 0;
+  if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID))
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+    }
+
+  return nrecs;
+}
+
+void
+iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  void *iegp = streamptr->record->objectp;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  int tsid = streamptr->curTsID;
+
+  off_t currentfilepos = fileGetPos(fileID);
+
+  int recID = streamptr->vars[varID].recordTable[0].recordID[levID];
+  off_t recpos = streamptr->tsteps[tsid].records[recID].position;
+  fileSetPos(fileID, recpos, SEEK_SET);
+  iegRead(fileID, iegp);
+  iegInqDataFP64(iegp, data);
+
+  fileSetPos(fileID, currentfilepos, SEEK_SET);
+
+  *numMissVals = get_num_missvalsDP(gridsize, data, missval);
+}
+
+void
+iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
+
+  for (size_t levID = 0; levID < nlevs; levID++)
+    iegReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals);
+}
+
+void
+iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp;
+  iegInitMem(iegp);
+  for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+  CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime;
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+  int param = vlistInqVarParam(vlistID, varID);
+  int pdis, pcat, pnum;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+  IEG_P_Parameter(iegp->ipdb) = pnum;
+  if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat;
+
+  iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID));
+  iegDefGrid(iegp->igdb, gridID);
+  iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levID);
+
+  iegp->dprec = iegDefDatatype(vlistInqVarDatatype(vlistID, varID));
+
+  size_t gridsize = (size_t) gridInqSize(gridID);
+  iegp->refval = calc_refvalDP(gridsize, data);
+
+  iegDefDataFP64(iegp, data);
+  iegWrite(fileID, iegp);
+}
+
+void
+iegWriteVarDP(stream_t *streamptr, int varID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t nlevels = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
+
+  for (size_t levID = 0; levID < nlevels; levID++) iegWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]);
+}
+
+#endif /* HAVE_LIBIEG */
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+
+
+void
+recordInitEntry(record_t *record)
+{
+  record->position = CDI_UNDEFID;
+  record->size = 0;
+  record->gridsize = 0;
+  record->param = 0;
+  record->ilevel = CDI_UNDEFID;
+  record->used = false;
+  record->tsteptype = CDI_UNDEFID;
+  record->varID = CDI_UNDEFID;
+  record->levelID = CDI_UNDEFID;
+  memset(record->varname, 0, sizeof(record->varname));
+  varScanKeysInit(&record->scanKeys);
+  memset(&record->tiles, 0, sizeof(record->tiles));
+#ifdef HAVE_LIBFDB5
+  record->fdbItemIndex = -1;
+#endif
+}
+
+int
+recordNewEntry(stream_t *streamptr, int tsID)
+{
+  int recordSize = streamptr->tsteps[tsID].recordSize;
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  // Look for a free slot in record.
+  int recordID = 0;
+  if (recordSize)
+    {
+      while (recordID < recordSize && records[recordID].used != CDI_UNDEFID) ++recordID;
+    }
+  else  // Create the table the first time through.
+    {
+      recordSize = 1;  //  <<<<----
+      records = (record_t *) Malloc((size_t) recordSize * sizeof(record_t));
+      for (int i = recordID; i < recordSize; i++) records[i].used = CDI_UNDEFID;
+    }
+
+  // If the table overflows, double its size.
+  if (recordID == recordSize)
+    {
+      // clang-format off
+      if      (recordSize <= INT_MAX / 2) recordSize *= 2;
+      else if (recordSize < INT_MAX)      recordSize = INT_MAX;
+      else Error("Cannot handle this many records!\n");
+      // clang-format on
+      records = (record_t *) Realloc(records, (size_t) recordSize * sizeof(record_t));
+
+      for (int i = recordID; i < recordSize; i++) records[i].used = CDI_UNDEFID;
+    }
+
+  recordInitEntry(&records[recordID]);
+
+  records[recordID].used = true;
+
+  streamptr->tsteps[tsID].recordSize = recordSize;
+  streamptr->tsteps[tsID].records = records;
+
+  return recordID;
+}
+
+static void
+cdiInitRecord(stream_t *streamptr)
+{
+  Record *record = (Record *) Malloc(sizeof(Record));
+  streamptr->record = record;
+
+  record->param = 0;
+  record->ilevel = 0;
+  record->vdate = 0;
+  record->vtime = 0;
+  record->gridID = 0;
+  record->buffer = NULL;
+  record->buffersize = 0;
+  record->position = 0;
+  record->varID = 0;
+  record->levelID = CDI_UNDEFID;
+}
+
+void
+streamInqRecord(int streamID, int *varID, int *levelID)
+{
+  check_parg(varID);
+  check_parg(levelID);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  cdiDefAccesstype(streamID, TYPE_REC);
+
+  if (!streamptr->record) cdiInitRecord(streamptr);
+
+  int tsID = streamptr->curTsID;
+  int rindex = streamptr->tsteps[tsID].curRecID + 1;
+
+  if (rindex >= streamptr->tsteps[tsID].nrecs) Error("record %d not available at timestep %d", rindex + 1, tsID + 1);
+
+  int recID = streamptr->tsteps[tsID].recIDs[rindex];
+
+  if (recID == -1 || recID >= streamptr->tsteps[tsID].nallrecs) Error("Internal problem! tsID = %d recID = %d", tsID, recID);
+
+  *varID = streamptr->tsteps[tsID].records[recID].varID;
+  if (*varID == -1) Error("Internal problem! varID = %d recID = %d", *varID, recID);
+
+  int lindex = streamptr->tsteps[tsID].records[recID].levelID;
+
+  int isub = subtypeInqActiveIndex(streamptr->vars[*varID].subtypeID);
+  *levelID = streamptr->vars[*varID].recordTable[isub].lindex[lindex];
+
+  if (CDI_Debug) Message("streamID = %d tsID = %d, recID = %d, varID = %d, levelID = %d", streamID, tsID, recID, *varID, *levelID);
+
+  streamptr->curTsID = tsID;
+  streamptr->tsteps[tsID].curRecID = rindex;
+}
+
+/*
+@Function  streamDefRecord
+@Title     Define the next record
+
+@Prototype void streamDefRecord(int streamID, int varID, int levelID)
+@Parameter
+    @Item  streamID  Stream ID, from a previous call to @fref{streamOpenWrite}.
+    @Item  varID     Variable identifier.
+    @Item  levelID   Level identifier.
+
+@Description
+The function streamDefRecord defines the meta-data of the next record.
+@EndFunction
+*/
+void
+streamDefRecord(int streamID, int varID, int levelID)
+{
+  stream_t *streamptr = stream_to_pointer(streamID);
+
+  int tsID = streamptr->curTsID;
+  if (tsID == CDI_UNDEFID)
+    {
+      tsID++;
+      streamDefTimestep(streamID, tsID);
+    }
+
+  if (!streamptr->record) cdiInitRecord(streamptr);
+
+  int vlistID = streamptr->vlistID;
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+  int param = vlistInqVarParam(vlistID, varID);
+  int ilevel = (int) lround(zaxisInqLevel(zaxisID, levelID));
+
+  Record *record = streamptr->record;
+  record->varID = varID;
+  record->levelID = levelID;
+  record->param = param;
+  record->ilevel = ilevel;
+  record->vdate = (int) cdiDate_get(streamptr->tsteps[tsID].taxis.vDateTime.date);
+  record->vtime = cdiTime_get(streamptr->tsteps[tsID].taxis.vDateTime.time);
+  record->gridID = gridID;
+  record->prec = vlistInqVarDatatype(vlistID, varID);
+
+  switch (cdiBaseFiletype(streamptr->filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grbDefRecord(streamptr); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvDefRecord(streamptr); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extDefRecord(streamptr); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegDefRecord(streamptr); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+      if (streamptr->accessmode == 0) cdfEndDef(streamptr);
+      cdfDefRecord(streamptr);
+      break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(streamptr->filetype)); break;
+    }
+}
+
+void
+streamCopyRecord(int streamID2, int streamID1)
+{
+  stream_t *streamptr1 = stream_to_pointer(streamID1), *streamptr2 = stream_to_pointer(streamID2);
+  int filetype1 = streamptr1->filetype, filetype2 = streamptr2->filetype, filetype = CDI_FILETYPE_UNDEF;
+
+  if (cdiBaseFiletype(filetype1) == cdiBaseFiletype(filetype2)) filetype = filetype2;
+
+  if (filetype == CDI_FILETYPE_UNDEF)
+    Error("Streams have different file types (%s -> %s)!", strfiletype(filetype1), strfiletype(filetype2));
+
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB: grbCopyRecord(streamptr2, streamptr1); break;
+#endif
+#ifdef HAVE_LIBSERVICE
+    case CDI_FILETYPE_SRV: srvCopyRecord(streamptr2, streamptr1); break;
+#endif
+#ifdef HAVE_LIBEXTRA
+    case CDI_FILETYPE_EXT: extCopyRecord(streamptr2, streamptr1); break;
+#endif
+#ifdef HAVE_LIBIEG
+    case CDI_FILETYPE_IEG: iegCopyRecord(streamptr2, streamptr1); break;
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF: cdfCopyRecord(streamptr2, streamptr1); break;
+#endif
+    default: Error("%s support not compiled in!", strfiletype(filetype));
+    }
+}
+
+void
+cdi_create_records(stream_t *streamptr, int tsID)
+{
+  unsigned nrecords, maxrecords;
+
+  tsteps_t *sourceTstep = streamptr->tsteps;
+  tsteps_t *destTstep = sourceTstep + tsID;
+
+  if (destTstep->records) return;
+
+  int vlistID = streamptr->vlistID;
+
+  if (tsID == 0)
+    {
+      maxrecords = 0;
+      int nvars = streamptr->nvars;
+      for (int varID = 0; varID < nvars; varID++)
+        for (int isub = 0; isub < streamptr->vars[varID].subtypeSize; isub++)
+          maxrecords += (unsigned) streamptr->vars[varID].recordTable[isub].nlevs;
+    }
+  else
+    {
+      maxrecords = (unsigned) sourceTstep->recordSize;
+    }
+
+  if (tsID == 0)
+    {
+      nrecords = maxrecords;
+    }
+  else if (tsID == 1)
+    {
+      nrecords = 0;
+      maxrecords = (unsigned) sourceTstep->recordSize;
+      if (sourceTstep->records)
+        {
+          for (size_t recID = 0; recID < maxrecords; recID++)
+            {
+              int varID = sourceTstep->records[recID].varID;
+              nrecords += (varID == CDI_UNDEFID /* varID = CDI_UNDEFID for write mode !!! */
+                           || vlistInqVarTimetype(vlistID, varID) != TIME_CONSTANT);
+              //    printf("varID nrecords %d %d %d \n", varID, nrecords, vlistInqVarTsteptype(vlistID, varID));
+            }
+        }
+      else
+        {
+          nrecords = maxrecords;
+        }
+    }
+  else
+    {
+      nrecords = (unsigned) streamptr->tsteps[1].nallrecs;
+    }
+  //  printf("tsID, nrecords %d %d\n", tsID, nrecords);
+
+  record_t *records = (maxrecords > 0) ? (record_t *) (Malloc(maxrecords * sizeof(record_t))) : (record_t *) NULL;
+
+  destTstep->records = records;
+  destTstep->recordSize = (int) maxrecords;
+  destTstep->nallrecs = (int) nrecords;
+#ifdef HAVE_LIBFDB5
+  destTstep->records->fdbItemIndex = -1;
+#endif
+
+  if (tsID == 0)
+    {
+      for (unsigned recID = 0; recID < maxrecords; recID++) recordInitEntry(&destTstep->records[recID]);
+    }
+  else if (sourceTstep->records)
+    {
+      memcpy(destTstep->records, sourceTstep->records, (size_t) maxrecords * sizeof(record_t));
+
+      for (size_t recID = 0; recID < maxrecords; recID++)
+        {
+          record_t *curRecord = &sourceTstep->records[recID];
+          destTstep->records[recID].used = curRecord->used;
+          if (curRecord->used != CDI_UNDEFID && curRecord->varID != -1)  // curRecord->varID = -1 for write mode !!!
+            {
+              if (vlistInqVarTimetype(vlistID, curRecord->varID) != TIME_CONSTANT)
+                {
+                  destTstep->records[recID].position = CDI_UNDEFID;
+                  destTstep->records[recID].size = 0;
+                  destTstep->records[recID].used = false;
+                }
+            }
+        }
+    }
+}
+
+
+void
+streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name)
+{
+  int fileID1 = streamptr1->fileID;
+  int fileID2 = streamptr2->fileID;
+
+  int tsID = streamptr1->curTsID;
+  int vrecID = streamptr1->tsteps[tsID].curRecID;
+  int recID = streamptr1->tsteps[tsID].recIDs[vrecID];
+  off_t recpos = streamptr1->tsteps[tsID].records[recID].position;
+  size_t recsize = streamptr1->tsteps[tsID].records[recID].size;
+
+  if (fileSetPos(fileID1, recpos, SEEK_SET) != 0) Error("Cannot seek input file for %s record copy!", container_name);
+
+  char *buffer = (char *) Malloc(recsize);
+
+  if (fileRead(fileID1, buffer, recsize) != recsize) Error("Failed to read record from %s file for copying!", container_name);
+
+  if (fileWrite(fileID2, buffer, recsize) != recsize) Error("Failed to write record to %s file when copying!", container_name);
+
+  Free(buffer);
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+
+#ifdef HAVE_LIBSERVICE
+
+static int
+srvInqDatatype(int prec)
+{
+  return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32;
+}
+
+static int
+srvDefDatatype(int datatype)
+{
+  if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64)
+    Error("CDI/SERVICE library does not support complex numbers!");
+
+  if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32;
+
+  return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32;
+}
+
+/* not used
+int srvInqRecord(stream_t *streamptr, int *varID, int *levelID)
+{
+  int status;
+  int fileID;
+  int icode, ilevel;
+  int zaxisID = -1;
+  int header[8];
+  int vlistID;
+  void *srvp = streamptr->record->objectp;
+
+  vlistID = streamptr->vlistID;
+  fileID  = streamptr->fileID;
+
+  *varID   = -1;
+  *levelID = -1;
+
+  status = srvRead(fileID, srvp);
+  if ( status != 0 ) return (0);
+
+  srvInqHeader(srvp, header);
+
+  icode  = header[0];
+  ilevel = header[1];
+
+  *varID = vlistInqVarID(vlistID, icode);
+
+  if ( *varID == CDI_UNDEFID ) Error("Code %d undefined", icode);
+
+  zaxisID = vlistInqVarZaxis(vlistID, *varID);
+
+  *levelID = zaxisInqLevelID(zaxisID, (double) ilevel);
+
+  return 1;
+}
+*/
+
+static void
+srv_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *srvp = streamptr->record->objectp;
+  if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file");
+
+  int header[8];
+  srvInqHeader(srvp, header);
+  srvInqDataFP32(srvp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  *numMissVals = get_num_missvalsSP((size_t) size, data, (float) missval);
+
+  streamptr->numvals += size;
+}
+
+static void
+srv_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *srvp = streamptr->record->objectp;
+  if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file");
+
+  int header[8];
+  srvInqHeader(srvp, header);
+  srvInqDataFP64(srvp, data);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  *numMissVals = get_num_missvalsDP((size_t) size, data, missval);
+
+  streamptr->numvals += size;
+}
+
+void
+srv_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    srv_read_recordDP(streamptr, (double *) data, numMissVals);
+  else
+    srv_read_recordSP(streamptr, (float *) data, numMissVals);
+}
+
+void
+srvCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
+{
+  streamFCopyRecord(streamptr2, streamptr1, "SRV");
+}
+
+void
+srvDefRecord(stream_t *streamptr)
+{
+  Record *record = streamptr->record;
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(record->param, &pnum, &pcat, &pdis);
+
+  int header[8];
+  header[0] = pnum;
+  header[1] = record->ilevel;
+  header[2] = record->vdate;
+  header[3] = record->vtime;
+
+  int gridID = record->gridID;
+  SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID);
+  if (xsize == 0 || ysize == 0)
+    {
+      xsize = gridInqSize(gridID);
+      ysize = 1;
+    }
+  if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1;
+  if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!");
+
+  cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID));
+
+  header[4] = (int) xsize;
+  header[5] = (int) ysize;
+  header[6] = 0;
+  header[7] = 0;
+
+  srvrec_t *srvp = (srvrec_t *) record->objectp;
+  srvp->dprec = srvDefDatatype(record->prec);
+
+  srvDefHeader(srvp, header);
+}
+
+static void
+srv_write_recordSP(stream_t *streamptr, const float *data)
+{
+  void *srvp = streamptr->record->objectp;
+  srvDefDataFP32(srvp, data);
+  srvWrite(streamptr->fileID, srvp);
+}
+
+static void
+srv_write_recordDP(stream_t *streamptr, const double *data)
+{
+  void *srvp = streamptr->record->objectp;
+  srvDefDataFP64(srvp, data);
+  srvWrite(streamptr->fileID, srvp);
+}
+
+void
+srv_write_record(stream_t *streamptr, int memtype, const void *data)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    srv_write_recordDP(streamptr, (const double *) data);
+  else
+    srv_write_recordSP(streamptr, (const float *) data);
+}
+
+static void
+srv_add_record(stream_t *streamptr, int param, int level, size_t xsize, size_t ysize, size_t recsize, off_t position, int prec)
+{
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int recID = recordNewEntry(streamptr, tsID);
+  record_t *record = &streamptr->tsteps[tsID].records[recID];
+
+  record->size = recsize;
+  record->position = position;
+  record->param = param;
+  record->ilevel = level;
+
+  grid_t *grid = (grid_t *) Malloc(sizeof(*grid));
+  grid_init(grid);
+  cdiGridTypeInit(grid, GRID_GENERIC, xsize * ysize);
+  grid->x.size = xsize;
+  grid->y.size = ysize;
+  struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0);
+  int gridID = gridAdded.Id;
+  if (!gridAdded.isNew)
+    {
+      grid_free(grid);
+      Free(grid);
+    }
+
+  int leveltype = ZAXIS_GENERIC;
+  int datatype = srvInqDatatype(prec);
+
+  int varID, levelID = 0;
+  varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL,
+               NULL, NULL);
+
+  xassert(varID <= SHRT_MAX && levelID <= SHRT_MAX);
+  record->varID = (short) varID;
+  record->levelID = levelID;
+
+  streamptr->tsteps[tsID].nallrecs++;
+  streamptr->nrecs++;
+
+  if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID);
+}
+
+static void
+srvScanTimestep1(stream_t *streamptr)
+{
+  CdiDateTime datetime0;
+  cdiDateTime_init(&datetime0);
+  off_t recpos;
+  srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp;
+
+  streamptr->curTsID = 0;
+
+  int tsID = tstepsNewEntry(streamptr);
+  if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID);
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  int fileID = streamptr->fileID;
+
+  int nrecs = 0;
+  while (true)
+    {
+      recpos = fileGetPos(fileID);
+      if (srvRead(fileID, srvp) != 0)
+        {
+          streamptr->ntsteps = 1;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      int header[8];
+      srvInqHeader(srvp, header);
+
+      int prec = srvp->dprec;
+      int rcode = header[0];
+      int rlevel = header[1];
+      int vdate = header[2];
+      int vtime = header[3];
+      int rxsize = header[4];
+      int rysize = header[5];
+      int param = cdiEncodeParam(rcode, 255, 255);
+      CdiDateTime datetime = cdiDateTime_set(vdate, vtime);
+
+      if (nrecs == 0)
+        {
+          datetime0 = datetime;
+          taxis->vDateTime = datetime;
+        }
+      else
+        {
+          record_t *records = streamptr->tsteps[tsID].records;
+          for (int recID = 0; recID < nrecs; recID++)
+            if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished;
+
+          if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel);
+        }
+
+      nrecs++;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime);
+
+      srv_add_record(streamptr, param, rlevel, (size_t) rxsize, (size_t) rysize, recsize, recpos, prec);
+    }
+
+tstepScanLoopFinished:
+  streamptr->rtsteps = 1;
+
+  cdi_generate_vars(streamptr);
+
+  int taxisID = taxisCreate(TAXIS_ABSOLUTE);
+  taxis->type = TAXIS_ABSOLUTE;
+  taxis->rDateTime = taxis->vDateTime;
+
+  int vlistID = streamptr->vlistID;
+  vlistDefTaxis(vlistID, taxisID);
+
+  vlist_check_contents(vlistID);
+
+  streamScanResizeRecords1(streamptr);
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+  streamScanTimeConstAdjust(streamptr, taxis);
+}
+
+static int
+srvScanTimestep2(stream_t *streamptr)
+{
+  int header[8];
+  off_t recpos = 0;
+  void *srvp = streamptr->record->objectp;
+
+  streamptr->curTsID = 1;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int tsID = streamptr->rtsteps;
+  if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1);
+
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+  cdi_create_records(streamptr, tsID);
+  record_t *records = streamptr->tsteps[tsID].records;
+
+  int nrecords = streamScanInitRecords2(streamptr);
+
+  for (int rindex = 0; rindex <= nrecords; rindex++)
+    {
+      recpos = fileGetPos(fileID);
+      if (srvRead(fileID, srvp) != 0)
+        {
+          streamptr->ntsteps = 2;
+          break;
+        }
+
+      size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+      srvInqHeader(srvp, header);
+
+      int rcode = header[0];
+      int rlevel = header[1];
+      int vdate = header[2];
+      int vtime = header[3];
+      int param = cdiEncodeParam(rcode, 255, 255);
+
+      if (rindex == 0)
+        {
+          taxis->type = TAXIS_ABSOLUTE;
+          taxis->vDateTime = cdiDateTime_set(vdate, vtime);
+        }
+
+      bool nextstep = false;
+      int recID;
+      for (recID = 0; recID < nrecords; recID++)
+        {
+          if (param == records[recID].param && rlevel == records[recID].ilevel)
+            {
+              if (records[recID].used)
+                {
+                  nextstep = true;
+                }
+              else
+                {
+                  records[recID].used = true;
+                  streamptr->tsteps[tsID].recIDs[rindex] = recID;
+                }
+              break;
+            }
+        }
+      if (recID == nrecords)
+        {
+          Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1);
+          return CDI_EUFSTRUCT;
+        }
+
+      if (nextstep) break;
+
+      if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime);
+
+      if (param != records[recID].param || rlevel != records[recID].ilevel)
+        {
+          Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                  records[recID].ilevel, rlevel);
+          return CDI_EUFSTRUCT;
+        }
+
+      records[recID].position = recpos;
+      records[recID].size = recsize;
+    }
+
+  int nrecs = 0;
+  for (int recID = 0; recID < nrecords; recID++)
+    {
+      if (records[recID].used)
+        nrecs++;
+      else
+        vlistDefVarTimetype(vlistID, records[recID].varID, TIME_CONSTANT);
+    }
+  streamptr->tsteps[tsID].nrecs = nrecs;
+
+  streamptr->rtsteps = 2;
+
+  streamScanTsFixNtsteps(streamptr, recpos);
+
+  return 0;
+}
+
+int
+srvInqContents(stream_t *streamptr)
+{
+  streamptr->curTsID = 0;
+
+  srvScanTimestep1(streamptr);
+
+  int status = (streamptr->ntsteps == -1) ? srvScanTimestep2(streamptr) : 0;
+
+  fileSetPos(streamptr->fileID, 0, SEEK_SET);
+
+  return status;
+}
+
+static long
+srvScanTimestep(stream_t *streamptr)
+{
+  int header[8];
+  off_t recpos = 0;
+  int nrecs = 0;
+  void *srvp = streamptr->record->objectp;
+
+  int tsID = streamptr->rtsteps;
+  taxis_t *taxis = &streamptr->tsteps[tsID].taxis;
+
+  if (streamptr->tsteps[tsID].recordSize == 0)
+    {
+      cdi_create_records(streamptr, tsID);
+      record_t *records = streamptr->tsteps[tsID].records;
+
+      nrecs = streamScanInitRecords(streamptr, tsID);
+
+      int fileID = streamptr->fileID;
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+
+      for (int rindex = 0; rindex <= nrecs; rindex++)
+        {
+          recpos = fileGetPos(fileID);
+          if (srvRead(fileID, srvp) != 0)
+            {
+              streamptr->ntsteps = streamptr->rtsteps + 1;
+              break;
+            }
+
+          size_t recsize = (size_t) (fileGetPos(fileID) - recpos);
+
+          srvInqHeader(srvp, header);
+
+          int rcode = header[0];
+          int rlevel = header[1];
+          int vdate = header[2];
+          int vtime = header[3];
+          int param = cdiEncodeParam(rcode, 255, 255);
+
+          // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error
+          if (rindex == nrecs) continue;
+          int recID = streamptr->tsteps[tsID].recIDs[rindex];
+
+          if (rindex == 0)
+            {
+              taxis->type = TAXIS_ABSOLUTE;
+              taxis->vDateTime = cdiDateTime_set(vdate, vtime);
+            }
+
+          if (param != records[recID].param || rlevel != records[recID].ilevel)
+            {
+              Message("tsID = %d recID = %d param = %3d new %3d  level = %3d new %3d", tsID, recID, records[recID].param, param,
+                      records[recID].ilevel, rlevel);
+              Error("Invalid, unsupported or inconsistent record structure!");
+            }
+
+          records[recID].position = recpos;
+          records[recID].size = recsize;
+
+          if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime);
+        }
+
+      streamptr->rtsteps++;
+
+      if (streamptr->ntsteps != streamptr->rtsteps)
+        {
+          tsID = tstepsNewEntry(streamptr);
+          if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID);
+
+          streamptr->tsteps[tsID - 1].next = true;
+          streamptr->tsteps[tsID].position = recpos;
+        }
+
+      fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET);
+      streamptr->tsteps[tsID].position = recpos;
+    }
+
+  if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs)
+    {
+      Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID);
+      streamptr->ntsteps = tsID;
+    }
+
+  return streamptr->ntsteps;
+}
+
+int
+srvInqTimestep(stream_t *streamptr, int tsID)
+{
+  if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!");
+
+  if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps);
+
+  long ntsteps = CDI_UNDEFID;
+  while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = srvScanTimestep(streamptr);
+
+  int nrecs = 0;
+  if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID))
+    {
+      streamptr->curTsID = tsID;
+      nrecs = streamptr->tsteps[tsID].nrecs;
+    }
+
+  return nrecs;
+}
+
+void
+srvReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsid = streamptr->curTsID;
+
+  off_t currentfilepos = fileGetPos(fileID);
+
+  int recID = streamptr->vars[varID].recordTable[0].recordID[levID];
+  off_t recpos = streamptr->tsteps[tsid].records[recID].position;
+
+  fileSetPos(fileID, recpos, SEEK_SET);
+
+  void *srvp = streamptr->record->objectp;
+  if (srvRead(fileID, srvp) < 0) abort();
+
+  int header[8];
+  srvInqHeader(srvp, header);
+  srvInqDataFP64(srvp, data);
+
+  fileSetPos(fileID, currentfilepos, SEEK_SET);
+
+  double missval = vlistInqVarMissval(vlistID, varID);
+  SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID));
+
+  *numMissVals = get_num_missvalsDP((size_t) size, data, missval);
+}
+
+void
+srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID));
+  size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs;
+
+  for (size_t levID = 0; levID < nlevs; levID++)
+    srvReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals);
+}
+
+void
+srvWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levID = %d", streamptr->self, varID, levID);
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int tsID = streamptr->curTsID;
+  CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime;
+  int gridID = vlistInqVarGrid(vlistID, varID);
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis);
+
+  int header[8];
+  header[0] = pnum;
+  header[1] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID));
+  header[2] = (int) cdiDate_get(vDateTime.date);
+  header[3] = cdiTime_get(vDateTime.time);
+
+  SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID);
+  if (xsize == 0 || ysize == 0)
+    {
+      xsize = gridInqSize(gridID);
+      ysize = 1;
+    }
+  if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1;
+  if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!");
+
+  cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID));
+
+  header[4] = (int) xsize;
+  header[5] = (int) ysize;
+  header[6] = 0;
+  header[7] = 0;
+
+  int datatype = vlistInqVarDatatype(vlistID, varID);
+
+  srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp;
+  srvp->dprec = srvDefDatatype(datatype);
+
+  srvDefHeader(srvp, header);
+  srvDefDataFP64(srvp, data);
+  srvWrite(fileID, srvp);
+}
+
+void
+srvWriteVarDP(stream_t *streamptr, int varID, const double *data)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  SizeType gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID));
+  int nlevs = zaxisInqSize(vlistInqVarZaxis(vlistID, varID));
+
+  for (int levID = 0; levID < nlevs; levID++)
+    srvWriteVarSliceDP(streamptr, varID, levID, data + (size_t) levID * (size_t) gridsize);
+}
+
+#endif /* HAVE_LIBSERVICE */
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+
+static void
+streamvar_init_recordtable(stream_t *streamptr, int varID, int isub)
+{
+  streamptr->vars[varID].recordTable[isub].nlevs = 0;
+  streamptr->vars[varID].recordTable[isub].recordID = NULL;
+  streamptr->vars[varID].recordTable[isub].lindex = NULL;
+}
+
+static void
+streamvar_init_entry(stream_t *streamptr, int varID)
+{
+  streamptr->vars[varID].ncvarid = CDI_UNDEFID;
+  streamptr->vars[varID].defmiss = false;
+
+  streamptr->vars[varID].subtypeSize = 0;
+  streamptr->vars[varID].recordTable = NULL;
+
+  streamptr->vars[varID].gridID = CDI_UNDEFID;
+  streamptr->vars[varID].zaxisID = CDI_UNDEFID;
+  streamptr->vars[varID].tsteptype = CDI_UNDEFID;
+  streamptr->vars[varID].subtypeID = CDI_UNDEFID;
+}
+
+static int
+streamvar_new_entry(stream_t *streamptr)
+{
+  int varID = 0;
+  int streamvarSize = streamptr->varsAllocated;
+  svarinfo_t *streamvar = streamptr->vars;
+  /*
+    Look for a free slot in streamvar.
+    (Create the table the first time through).
+  */
+  if (!streamvarSize)
+    {
+      streamvarSize = 2;
+      streamvar = (svarinfo_t *) Malloc((size_t) streamvarSize * sizeof(svarinfo_t));
+      if (streamvar == NULL)
+        {
+          Message("streamvarSize = %d", streamvarSize);
+          SysError("Allocation of svarinfo_t failed");
+        }
+
+      for (int i = 0; i < streamvarSize; i++) streamvar[i].isUsed = false;
+    }
+  else
+    {
+      while (varID < streamvarSize)
+        {
+          if (!streamvar[varID].isUsed) break;
+          varID++;
+        }
+    }
+  /*
+    If the table overflows, double its size.
+  */
+  if (varID == streamvarSize)
+    {
+      streamvarSize = 2 * streamvarSize;
+      streamvar = (svarinfo_t *) Realloc(streamvar, (size_t) streamvarSize * sizeof(svarinfo_t));
+      if (streamvar == NULL)
+        {
+          Message("streamvarSize = %d", streamvarSize);
+          SysError("Reallocation of svarinfo_t failed");
+        }
+      varID = streamvarSize / 2;
+
+      for (int i = varID; i < streamvarSize; i++) streamvar[i].isUsed = false;
+    }
+
+  streamptr->varsAllocated = streamvarSize;
+  streamptr->vars = streamvar;
+
+  streamvar_init_entry(streamptr, varID);
+
+  streamptr->vars[varID].isUsed = true;
+
+  return varID;
+}
+
+static void
+allocate_record_table_entry(stream_t *streamptr, int varID, int subID, int nlevs)
+{
+  int *level = (int *) Malloc((size_t) nlevs * sizeof(int));
+  int *lindex = (int *) Malloc((size_t) nlevs * sizeof(int));
+
+  for (int levID = 0; levID < nlevs; levID++)
+    {
+      level[levID] = CDI_UNDEFID;
+      lindex[levID] = levID;
+    }
+
+  streamptr->vars[varID].recordTable[subID].nlevs = nlevs;
+  streamptr->vars[varID].recordTable[subID].recordID = level;
+  streamptr->vars[varID].recordTable[subID].lindex = lindex;
+}
+
+int
+stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID)
+{
+  if (CDI_Debug) Message("gridID = %d  zaxisID = %d", gridID, zaxisID);
+
+  int varID = streamvar_new_entry(streamptr);
+  int nlevs = zaxisInqSize(zaxisID);
+
+  streamptr->nvars++;
+
+  streamptr->vars[varID].gridID = gridID;
+  streamptr->vars[varID].zaxisID = zaxisID;
+
+  int nsub = 1;
+  if (tilesetID != CDI_UNDEFID) nsub = subtypeInqSize(tilesetID); /* e.g. no of tiles */
+  if (CDI_Debug) Message("varID %d: create %d tiles with %d level(s), zaxisID=%d", varID, nsub, nlevs, zaxisID);
+  streamptr->vars[varID].recordTable = (sleveltable_t *) Malloc((size_t) nsub * sizeof(sleveltable_t));
+  if (streamptr->vars[varID].recordTable == NULL) SysError("Allocation of leveltable failed!");
+  streamptr->vars[varID].subtypeSize = nsub;
+
+  for (int isub = 0; isub < nsub; isub++)
+    {
+      streamvar_init_recordtable(streamptr, varID, isub);
+      allocate_record_table_entry(streamptr, varID, isub, nlevs);
+      if (CDI_Debug)
+        Message("streamptr->vars[varID].recordTable[isub].recordID[0]=%d", streamptr->vars[varID].recordTable[isub].recordID[0]);
+    }
+
+  streamptr->vars[varID].subtypeID = tilesetID;
+
+  return varID;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBGRIB
+
+#ifdef HAVE_LIBFDB5
+#endif
+
+#ifdef HAVE_ACROSS
+#endif
+
+
+static size_t
+grb_encode(int filetype, int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime,
+           int tsteptype, int numavg, SizeType datasize, const void *data, size_t numMissVals, void **gribbuffer, int comptype,
+           void *gribContainers)
+{
+  size_t nbytes = 0;
+
+#ifdef HAVE_LIBCGRIBEX
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    {
+      size_t gribbuffersize = (size_t) datasize * 4 + 3000;
+      *gribbuffer = Malloc(gribbuffersize);
+
+      nbytes = cgribexEncode(memType, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize, data,
+                             (SizeType) numMissVals, *gribbuffer, gribbuffersize);
+    }
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    {
+#ifdef GRIBCONTAINER2D
+      void *gribContainer = (void *) &((gribContainer_t **) gribContainers)[varID][levelID];
+#else
+      void *gribContainer = (void *) &((gribContainer_t *) gribContainers)[varID];
+#endif
+      bool useFloatInterface = false;
+      int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE;
+      const void *datap = data;
+
+      // if (useFloatInterface) printf("gribapi write: useFloatInterface\n");
+
+      if (!useFloatInterface && memType == MEMTYPE_FLOAT)
+        {
+          // printf("gribapi write: convert float to double\n");
+          const float *dataf = (const float *) data;
+          double *datad = (double *) Malloc((size_t) datasize * sizeof(double));
+          for (size_t i = 0; i < (size_t) datasize; ++i) datad[i] = (double) dataf[i];
+          datap = (const void *) datad;
+        }
+
+      size_t gribbuffersize;
+      nbytes = gribapiEncode(memTypeX, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, (size_t) datasize,
+                             datap, (SizeType) numMissVals, gribbuffer, &gribbuffersize, comptype, gribContainer);
+
+      if (!useFloatInterface && memType == MEMTYPE_FLOAT) Free((void *) datap);
+    }
+#else
+  {
+    Error("ecCodes support not compiled in!");
+    (void) gribContainers;
+    (void) comptype;
+  }
+#endif
+
+  return nbytes;
+}
+
+static size_t
+grbSzip(int filetype, void *gribbuffer, size_t gribbuffersize)
+{
+  size_t buffersize = gribbuffersize + 1000;  // compressed record can be greater than source record
+  void *buffer = Malloc(buffersize);
+
+  // memcpy(buffer, gribbuffer, gribbuffersize);
+
+  size_t nbytes = 0;
+  if (filetype == CDI_FILETYPE_GRB)
+    {
+      nbytes = (size_t) gribZip((unsigned char *) gribbuffer, (long) gribbuffersize, (unsigned char *) buffer, (long) buffersize);
+    }
+  else
+    {
+      static int lszip_warn = 1;
+      if (lszip_warn) Warning("Szip compression of GRIB2 records not implemented!");
+      lszip_warn = 0;
+      nbytes = gribbuffersize;
+    }
+
+  Free(buffer);
+
+  return nbytes;
+}
+
+typedef struct
+{
+  char date[16];
+  char time[8];
+  char param[8];
+  char levtype[8];
+  char levelist[8];
+} FDB_Keys;
+
+#ifdef HAVE_LIBFDB5
+static void
+cdi_fdb_store(void *fdbHandle, const char *filename, void *gribbuffer, size_t nbytes, const FDB_Keys *fdbKeys)
+{
+  size_t len = strlen(filename);
+  if (len == 6) Error("FDB keys missing!");
+
+  KeyValueItem keyValue;
+  keyValue.item = NULL;
+  decode_fdbitem(filename + 6, &keyValue);
+
+  if (keyValue.numKeys == 0) Error("FDB keys missing!");
+
+  bool expverDefined = false;
+  bool classDefined = false;
+  for (int k = 0; k < keyValue.numKeys; k++)
+    {
+      // clang-format off
+      if      (!expverDefined && str_is_equal(keyValue.keys[k], "expver")) expverDefined = true;
+      else if (!classDefined  && str_is_equal(keyValue.keys[k], "class")) classDefined = true;
+      // clang-format on
+    }
+
+  if (!expverDefined) Error("FDB parameter <expver> undefined!");
+  if (!classDefined) Error("FDB parameter <class> undefined!");
+
+  if (CDI_Debug)
+    {
+      printf("{");
+      for (int k = 0; k < keyValue.numKeys; k++)
+        {
+          printf("%s%s=%s", (k > 0) ? "," : "", keyValue.keys[k], keyValue.values[k]);
+        }
+      printf(",date=%s,time=%s,domain=g}", fdbKeys->date, fdbKeys->time);
+      printf("{type=an,levtype=%s}{step=0,", fdbKeys->levtype);
+      if (fdbKeys->levelist[0]) printf("levelist=%s,", fdbKeys->levelist);
+      printf("param=%s},length=%zu\n", fdbKeys->param, nbytes);
+    }
+
+  fdb_key_t *key;
+  check_fdb_error(fdb_new_key(&key));
+  for (int k = 0; k < keyValue.numKeys; k++)
+    {
+      check_fdb_error(fdb_key_add(key, keyValue.keys[k], keyValue.values[k]));
+    }
+  check_fdb_error(fdb_key_add(key, "domain", "g"));
+  check_fdb_error(fdb_key_add(key, "date", fdbKeys->date));
+  check_fdb_error(fdb_key_add(key, "time", fdbKeys->time));
+  check_fdb_error(fdb_key_add(key, "type", "an"));
+  check_fdb_error(fdb_key_add(key, "levtype", fdbKeys->levtype));
+  check_fdb_error(fdb_key_add(key, "step", "0"));
+  check_fdb_error(fdb_key_add(key, "param", fdbKeys->param));
+  if (fdbKeys->levelist[0]) check_fdb_error(fdb_key_add(key, "levelist", fdbKeys->levelist));
+
+  check_fdb_error(fdb_archive(fdbHandle, key, gribbuffer, nbytes));
+  // alternative: write to tmpfile and use C++ code from fdb_write
+
+  check_fdb_error(fdb_delete_key(key));
+}
+#endif
+
+static int
+map_grib2_param(int pnum, int pcat, int pdis)
+{
+  // clang-format off
+  if      (pnum ==  8 && pcat == 2 && pdis == 0) return 135;
+  else if (pnum ==  0 && pcat == 0 && pdis == 0) return 130;
+  else if (pnum ==  0 && pcat == 1 && pdis == 0) return 133;
+  else if (pnum == 83 && pcat == 1 && pdis == 0) return 246;
+  else if (pnum == 84 && pcat == 1 && pdis == 0) return 247;
+  else if (pnum == 85 && pcat == 1 && pdis == 0) return  75;
+  else if (pnum == 86 && pcat == 1 && pdis == 0) return  76;
+  else if (pnum ==  2 && pcat == 2 && pdis == 0) return 131;
+  else if (pnum ==  3 && pcat == 2 && pdis == 0) return 132;
+  else if (pnum == 25 && pcat == 3 && pdis == 0) return 152;
+  else if (pnum ==  4 && pcat == 3 && pdis == 0) return 129;
+  // clang-format on
+
+  return -1;
+}
+
+static int
+get_fdb_param(int cdiParam)
+{
+  int pnum, pcat, pdis;
+  cdiDecodeParam(cdiParam, &pnum, &pcat, &pdis);
+  if (pnum < 0) pnum = -pnum;
+  if (pnum > 255) pnum = pnum % 256;
+
+  int fdbParam = (pdis == 255) ? pnum : map_grib2_param(pnum, pcat, pdis);
+
+  return fdbParam;
+}
+
+static void
+fillup_gribbuffer(size_t nbytes, unsigned char *gribbuffer)
+{
+  while (nbytes & 7) gribbuffer[nbytes++] = 0;
+}
+
+void
+grbCopyRecord(stream_t *streamptr2, stream_t *streamptr1)
+{
+  int filetype = streamptr1->filetype;
+  int fileID1 = streamptr1->fileID;
+  int fileID2 = streamptr2->fileID;
+  int tsID = streamptr1->curTsID;
+  int vrecID = streamptr1->tsteps[tsID].curRecID;
+  int recID = streamptr1->tsteps[tsID].recIDs[vrecID];
+  const record_t *record = &streamptr1->tsteps[tsID].records[recID];
+  off_t recpos = record->position;
+  size_t recsize = record->size;
+
+  void *gribbuffer = NULL;
+
+  if (streamptr1->protocol == CDI_PROTOCOL_FDB)
+    {
+#ifdef HAVE_LIBFDB5
+      int fdbItemIndex = streamptr1->tsteps[tsID].records[recID].fdbItemIndex;
+      if (fdbItemIndex == -1) Error("fdbItem not available!");
+
+      size_t buffersize = 0;
+      recsize
+          = cdi_fdb_read_record(streamptr1->protocolData, &(streamptr1->fdbKeyValueList[fdbItemIndex]), &buffersize, &gribbuffer);
+
+      // round up recsize to next multiple of 8
+      size_t gribbuffersize = ((recsize + 7U) & ~7U);
+
+      gribbuffer = (unsigned char *) Realloc(gribbuffer, gribbuffersize);
+#endif
+    }
+  else
+    {
+      fileSetPos(fileID1, recpos, SEEK_SET);
+
+      // round up recsize to next multiple of 8
+      size_t gribbuffersize = ((recsize + 7U) & ~7U);
+
+      gribbuffer = (unsigned char *) Malloc(gribbuffersize);
+
+      if (fileRead(fileID1, gribbuffer, recsize) != recsize) Error("Could not read GRIB record for copying!");
+    }
+
+  size_t nbytes = recsize;
+
+#ifdef HAVE_LIBCGRIBEX
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    {
+      if (cdiGribChangeParameterID.active)
+        {
+          // Even if you are stream-copy records you might need to change a bit of grib-header !
+          void *gh = cgribex_handle_new_from_meassage((void *) gribbuffer, recsize);
+          cgribexChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype,
+                                               cdiGribChangeParameterID.lev);
+          cgribex_handle_delete(gh);
+          cdiGribChangeParameterID.active = false;  // after grib attributes have been changed turn it off again
+        }
+    }
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    {
+      if (cdiGribChangeParameterID.active)
+        {
+          // Even if you are stream-copy records you might need to change a bit of grib-header !
+          grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize);
+          gribapiChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype,
+                                               cdiGribChangeParameterID.lev);
+          grib_handle_delete(gh);
+          cdiGribChangeParameterID.active = false;  // after grib attributes have been changed turn it off again
+        }
+    }
+#else
+  {
+    Error("ecCodes support not compiled in!");
+  }
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+#ifdef HIRLAM_EXTENSIONS
+  // Even if you are stream-copy records you might need to change a bit of grib-header !
+
+  if (cdiGribDataScanningMode.active)
+    // allowed modes: <0, 64, 96>; Default is 64
+    // This will overrule the old scanning mode of the given grid
+    {
+      grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize);
+
+      int scanModeIN = gribapiGetScanningMode(gh);
+
+      grib_handle_delete(gh);
+
+      if (cdiDebugExt >= 20)
+        Message("Change GribDataScanningMode => %d (scanModeIN = %d)", cdiGribDataScanningMode.value, scanModeIN);
+
+      if (scanModeIN != cdiGribDataScanningMode.value)
+        {
+          size_t numMissVals = 0;
+
+          int vlistID = streamptr1->vlistID;
+          int varID = record->varID;
+          int levelID = record->levelID;
+          int gridID = vlistInqVarGrid(vlistID, varID);
+
+          size_t gridsize = gridInqSize(gridID);
+          if (vlistNumber(vlistID) != CDI_REAL) gridsize *= 2;
+          double *data = (double *) Malloc(gridsize * sizeof(double));
+
+          if (cdiDebugExt >= 20) Message(" processing varID %d; levelID %d", varID, levelID);
+
+          grb_write_var_slice(streamptr2, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals);
+
+          free(data);
+        }
+    }
+#endif  // HIRLAM_EXTENSIONS
+#endif
+
+  if (filetype == CDI_FILETYPE_GRB)
+    {
+      size_t unzipsize;
+      int izip = gribGetZip(recsize, (unsigned char *) gribbuffer, &unzipsize);
+
+      if (izip == 0 && (streamptr2->comptype == CDI_COMPRESS_SZIP || streamptr2->comptype == CDI_COMPRESS_AEC))
+        nbytes = grbSzip(filetype, gribbuffer, nbytes);
+    }
+
+  fillup_gribbuffer(nbytes, (unsigned char *) gribbuffer);
+
+  if (streamptr2->protocol == CDI_PROTOCOL_FDB)
+    {
+      int vlistID = streamptr1->vlistID;
+      int varID = record->varID;
+      int zaxisID = vlistInqVarZaxis(vlistID, varID);
+      int zaxisType = zaxisInqType(zaxisID);
+      CdiDateTime vDateTime = streamptr1->tsteps[tsID].taxis.vDateTime;
+
+      FDB_Keys fdbKeys;
+      snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date));
+      snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100));
+      snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(record->param));
+      bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF);
+      snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc");
+      fdbKeys.levelist[0] = 0;
+      if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? record->ilevel : 0);
+
+#ifdef HAVE_LIBFDB5
+      cdi_fdb_store(streamptr2->protocolData, streamptr2->filename, gribbuffer, nbytes, &fdbKeys);
+#endif
+    }
+  else
+    {
+      size_t nwrite = fileWrite(fileID2, gribbuffer, nbytes);
+      if (nwrite != nbytes) SysError("Could not write record for copying!");
+    }
+
+  Free(gribbuffer);
+}
+
+void
+grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals)
+{
+  int filetype = streamptr->filetype;
+  int fileID = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+  int tsteptype = vlistInqVarTsteptype(vlistID, varID);
+  int tsID = streamptr->curTsID;
+  CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime;
+  int numavg = (tsteptype == TSTEP_AVG) ? streamptr->tsteps[tsID].taxis.numavg : 0;
+  int comptype = streamptr->comptype;
+
+  if (CDI_Debug) Message("gridID = %d zaxisID = %d", gridID, zaxisID);
+
+  SizeType datasize = gridInqSize(gridID);
+
+  if (comptype != CDI_COMPRESS_JPEG && comptype != CDI_COMPRESS_SZIP && comptype != CDI_COMPRESS_AEC) comptype = CDI_COMPRESS_NONE;
+
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1 && comptype == CDI_COMPRESS_JPEG)
+    {
+      static bool ljpeg_warn = true;
+      if (ljpeg_warn) Warning("JPEG compression of GRIB1 records not available!");
+      ljpeg_warn = false;
+    }
+
+  void *gribbuffer = NULL;
+  size_t nbytes = grb_encode(filetype, memtype, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize,
+                             data, numMissVals, &gribbuffer, comptype, streamptr->gribContainers);
+
+  if (filetype == CDI_FILETYPE_GRB && (comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC))
+    nbytes = grbSzip(filetype, gribbuffer, nbytes);
+
+  switch (streamptr->protocol)
+    {
+    case CDI_PROTOCOL_ACROSS:
+      {
+#ifdef HAVE_ACROSS
+        if (across_write_grib_message(streamptr, gribbuffer, nbytes)) SysError("Failed to write GRIB slice!");
+#endif
+      }
+      break;
+
+    case CDI_PROTOCOL_FDB:
+      {
+#ifdef HAVE_LIBFDB5
+        int zaxisType = zaxisInqType(zaxisID);
+        double level = zaxisInqLevel(zaxisID, levelID);
+
+        FDB_Keys fdbKeys;
+        snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date));
+        snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100));
+        snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(vlistInqVarParam(vlistID, varID)));
+        bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF);
+        snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc");
+        fdbKeys.levelist[0] = 0;
+        int ilevel = (isML) ? (int) level : 0;
+        if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? ilevel : 0);
+
+        cdi_fdb_store(streamptr->protocolData, streamptr->filename, gribbuffer, nbytes, &fdbKeys);
+#endif
+      }
+      break;
+
+    case CDI_PROTOCOL_OTHER:
+    case CDI_PROTOCOL_FILE:
+      {
+        size_t (*myFileWrite)(int fileID, const void *restrict buffer, size_t len)
+            = (size_t(*)(int, const void *restrict, size_t)) namespaceSwitchGet(NSSWITCH_FILE_WRITE).func;
+
+        size_t nwrite = myFileWrite(fileID, gribbuffer, nbytes);
+        if (nwrite != nbytes) SysError("Failed to write GRIB slice!");
+      }
+      break;
+    }
+
+  if (gribbuffer) Free(gribbuffer);
+}
+
+void
+grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals)
+{
+  int vlistID = streamptr->vlistID, gridID = vlistInqVarGrid(vlistID, varID), zaxisID = vlistInqVarZaxis(vlistID, varID),
+      nlevs = zaxisInqSize(zaxisID);
+  size_t gridsize = (size_t) gridInqSize(gridID);
+  double missval = vlistInqVarMissval(vlistID, varID);
+
+  size_t chunkLen = gridsize;
+  if (memtype == MEMTYPE_FLOAT)
+    for (int levelID = 0; levelID < nlevs; levelID++)
+      {
+        const float *restrict fdata = ((const float *) data) + (size_t) levelID * gridsize;
+
+        size_t numMissVals_slice = 0;
+        if (numMissVals)
+          for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(fdata[i], missval);
+
+        grb_write_var_slice(streamptr, varID, levelID, memtype, fdata, numMissVals_slice);
+      }
+  else
+    for (int levelID = 0; levelID < nlevs; levelID++)
+      {
+        const double *restrict ddata = ((const double *) data) + (size_t) levelID * gridsize;
+
+        size_t numMissVals_slice = 0;
+        if (numMissVals)
+          for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(ddata[i], missval);
+
+        grb_write_var_slice(streamptr, varID, levelID, memtype, ddata, numMissVals_slice);
+      }
+}
+
+void
+grb_write_record(stream_t *streamptr, int memtype, const void *data, size_t numMissVals)
+{
+  int varID = streamptr->record->varID;
+  int levelID = streamptr->record->levelID;
+  grb_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals);
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBGRIB
+
+#ifdef HAVE_LIBFDB5
+#endif
+
+
+static int
+grb_decode(int filetype, int memType, int datatype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize,
+           int unreduced, size_t *numMissVals, double missval)
+{
+  int status = 0;
+
+#ifdef HAVE_LIBCGRIBEX
+  if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1)
+    {
+#ifdef HAVE_LIBGRIB_API
+      extern int cdiNAdditionalGRIBKeys;
+      if (cdiNAdditionalGRIBKeys > 0) Error("CGRIBEX decode does not support reading of additional GRIB keys!");
+#endif
+      status = cgribexDecode(memType, cgribexp, gribbuffer, gribsize, data, datasize, unreduced, numMissVals, missval);
+    }
+  else
+#endif
+#ifdef HAVE_LIBGRIB_API
+    {
+      bool useFloatInterface = (have_gribapi_float_interface() && datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64);
+      int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE;
+      void *datap = (!useFloatInterface && memType == MEMTYPE_FLOAT) ? Malloc(datasize * sizeof(double)) : data;
+
+      // if (useFloatInterface) printf("gribapi read: useFloatInterface\n");
+
+      status = gribapiDecode(memTypeX, gribbuffer, gribsize, datap, datasize, unreduced, numMissVals, missval);
+
+      if (!useFloatInterface && memType == MEMTYPE_FLOAT)
+        {
+          // printf("gribapi read: convert double to float\n");
+          float *dataf = (float *) data;
+          double *datad = (double *) datap;
+          for (size_t i = 0; i < datasize; ++i) dataf[i] = (float) datad[i];
+          Free(datap);
+        }
+    }
+#else
+  {
+    (void) datatype;
+    Error("ecCodes support not compiled in!");
+  }
+#endif
+
+  return status;
+}
+
+// Decompresses the grib data in gribbuffer.
+static int
+grib1_unzip_record(void *gribbuffer, size_t *gribsize)
+{
+  int zip = 0;
+
+  size_t igribsize = *gribsize;
+  size_t ogribsize = *gribsize;
+
+  int izip;
+  size_t unzipsize;
+  if ((izip = gribGetZip(igribsize, (unsigned char *) gribbuffer, &unzipsize)) > 0)
+    {
+      zip = izip;
+      if (izip == 128)  // szip
+        {
+          if (unzipsize < igribsize)
+            {
+              fprintf(stderr, "Decompressed size smaller than compressed size (in %zu; out %zu)!\n", igribsize, unzipsize);
+              return 0;
+            }
+
+          unzipsize += 100;  // need 0 to 1 bytes for rounding of bds
+
+          void *buffer = Malloc(igribsize);
+          memcpy(buffer, gribbuffer, igribsize);
+
+          ogribsize
+              = (size_t) gribUnzip((unsigned char *) gribbuffer, (long) unzipsize, (unsigned char *) buffer, (long) igribsize);
+
+          Free(buffer);
+
+          if (ogribsize <= 0) Error("Decompression problem!");
+        }
+      else
+        {
+          Error("Decompression for %d not implemented!", izip);
+        }
+    }
+
+  *gribsize = ogribsize;
+
+  return zip;
+}
+
+typedef struct JobArgsGRB
+{
+  int recID, tsID, *outZip, filetype, memType, datatype, unreduced;
+  void *cgribexp, *gribbuffer, *data;
+  size_t recsize, gridsize, numMissVals;
+  double missval;
+} JobArgsGRB;
+
+static int
+grb_decode_record(void *untypedArgs)
+{
+  JobArgsGRB *args = (JobArgsGRB *) untypedArgs;
+  *args->outZip = grib1_unzip_record(args->gribbuffer, &args->recsize);
+  grb_decode(args->filetype, args->memType, args->datatype, args->cgribexp, args->gribbuffer, args->recsize, args->data,
+             args->gridsize, args->unreduced, &args->numMissVals, args->missval);
+  return 0;
+}
+
+static JobArgsGRB
+grb_read_raw_data(stream_t *streamptr, int tsID, int recID, int memType, void *gribbuffer, void *data, bool resetFilePos)
+{
+  int vlistID = streamptr->vlistID;
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  size_t recsize = streamptr->tsteps[tsID].records[recID].size;
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  size_t gridsize = (size_t) gridInqSize(gridID);
+  if (CDI_Debug) Message("gridID = %d gridsize = %zu", gridID, gridsize);
+
+  void *cgribexp = (gribbuffer && streamptr->record->objectp) ? streamptr->record->objectp : NULL;
+  if (!gribbuffer) gribbuffer = Malloc(streamptr->record->buffersize);
+  if (!data) data = Malloc(gridsize * ((memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double)));
+
+  if (streamptr->protocol == CDI_PROTOCOL_FDB)
+    {
+#ifdef HAVE_LIBFDB5
+      int fdbItemIndex = streamptr->tsteps[tsID].records[recID].fdbItemIndex;
+      if (fdbItemIndex == -1) Error("fdbItem not available!");
+
+      recsize = cdi_fdb_read_record(streamptr->protocolData, &(streamptr->fdbKeyValueList[fdbItemIndex]),
+                                    &(streamptr->record->buffersize), &gribbuffer);
+#endif
+    }
+  else
+    {
+      if (recsize == 0) Error("Internal problem! Recordsize is zero for record %d at timestep %d", recID + 1, tsID + 1);
+
+      int fileID = streamptr->fileID;
+      off_t recpos = streamptr->tsteps[tsID].records[recID].position;
+      off_t currentfilepos = (resetFilePos ? fileGetPos(fileID) : 0);
+
+      fileSetPos(fileID, recpos, SEEK_SET);
+      if (fileRead(fileID, gribbuffer, recsize) != recsize) Error("Failed to read GRIB record!");
+
+      if (resetFilePos) fileSetPos(fileID, currentfilepos, SEEK_SET);
+      if (!resetFilePos) streamptr->numvals += (SizeType) gridsize;
+    }
+
+  return (JobArgsGRB){
+    .recID = recID,
+    .tsID = tsID,
+    .outZip = &streamptr->tsteps[tsID].records[recID].zip,
+    .filetype = streamptr->filetype,
+    .memType = memType,
+    .datatype = vlistInqVarDatatype(vlistID, varID),
+    .unreduced = streamptr->unreduced,
+    .cgribexp = cgribexp,
+    .gribbuffer = gribbuffer,
+    .data = data,
+    .recsize = recsize,
+    .gridsize = gridsize,
+    .numMissVals = 0,
+    .missval = vlistInqVarMissval(vlistID, varID),
+  };
+}
+
+static size_t
+grb_read_and_decode_record(stream_t *streamptr, int recID, int memType, void *data, bool resetFilePos)
+{
+  JobArgsGRB args = grb_read_raw_data(streamptr, streamptr->curTsID, recID, memType, streamptr->record->buffer, data, resetFilePos);
+  grb_decode_record(&args);
+  return args.numMissVals;
+}
+
+typedef struct JobDescriptorGRB
+{
+  JobArgsGRB args;
+  AsyncJob *job;
+} JobDescriptorGRB;
+
+static void
+JobDescriptor_startJob(AsyncManager *jobManager, JobDescriptorGRB *me, stream_t *streamptr, int tsID, int recID, int memType)
+{
+  me->args = grb_read_raw_data(streamptr, tsID, recID, memType, NULL, NULL, false);
+  me->job = AsyncWorker_requestWork(jobManager, grb_decode_record, &me->args);
+  if (!me->job) xabort("error while trying to send job to worker thread");
+}
+
+static void
+grb_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorGRB *me, void *data, size_t *numMissVals)
+{
+  if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread");
+  memcpy(data, me->args.data, me->args.gridsize * ((me->args.memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double)));
+  *numMissVals = me->args.numMissVals;
+
+  Free(me->args.gribbuffer);
+  Free(me->args.data);
+  me->args.recID = -1;  // mark as inactive
+  me->args.tsID = -1;   // mark as inactive
+}
+/*
+static long
+get_global_recId(stream_t *streamptr, int tsID, int recID)
+{
+  const tsteps_t *tsteps = streamptr->tsteps;
+  long globalRecId = recID;
+  if (tsID > 0) globalRecId += tsteps[0].nrecs;
+  if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1);
+  return globalRecId;
+}
+*/
+
+static void
+grb_get_local_step_and_recId(stream_t *streamptr, long globalRecId, int *tsID, long *recID)
+{
+  int localTsId = 0;
+  long numSteps = streamptr->ntsteps;
+  const tsteps_t *tsteps = streamptr->tsteps;
+  if (numSteps > 0 && globalRecId >= tsteps[0].nrecs)
+    {
+      localTsId++;
+      globalRecId -= tsteps[0].nrecs;
+    }
+  if (globalRecId >= tsteps[1].nrecs)
+    {
+      ldiv_t nadjust = ldiv(globalRecId, tsteps[1].nrecs);
+      localTsId += (int) nadjust.quot;
+      globalRecId = nadjust.rem;
+    }
+
+  *tsID = localTsId;
+  *recID = globalRecId;
+}
+
+static void
+grb_read_next_record_async(AsyncManager *jobManager, JobDescriptorGRB *jd, stream_t *streamptr, int memType)
+{
+  int tsId = -1;
+  long recId = -1;
+  grb_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId, &tsId, &recId);
+  int xRecId = streamptr->tsteps[tsId].recIDs[recId];
+  JobDescriptor_startJob(jobManager, jd, streamptr, tsId, xRecId, memType);
+  streamptr->nextGlobalRecId++;
+}
+
+static void
+grb_read_next_record(stream_t *streamptr, int recID, int memType, void *data, size_t *numMissVals)
+{
+  bool jobFound = false;
+
+  int workerCount = streamptr->numWorker;
+  if (workerCount > 0)
+    {
+      int tsID = streamptr->curTsID;
+
+      AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager;
+      JobDescriptorGRB *jobs = (JobDescriptorGRB *) streamptr->jobs;
+
+      // if this is the first call, init and start worker threads
+      if (!jobs)
+        {
+          jobs = (JobDescriptorGRB *) Malloc((size_t) workerCount * sizeof(*jobs));
+          streamptr->jobs = jobs;
+          for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1;
+          for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1;
+          if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads");
+          streamptr->jobManager = jobManager;
+
+          // Start as many new jobs as possible.
+          for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++)
+            if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0)
+              grb_read_next_record_async(jobManager, jobs + i, streamptr, memType);
+        }
+
+      // search for a job descriptor with the given tsID and recID, and use its results if it exists
+      for (int i = 0; !jobFound && i < workerCount; i++)
+        if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID)
+          {
+            jobFound = true;
+            grb_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals);
+            if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs)
+              grb_read_next_record_async(jobManager, jobs + i, streamptr, memType);
+          }
+    }
+
+  // perform the work synchronously if we didn't start a job for it yet
+  if (!jobFound) *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, false);
+}
+
+void
+grb_read_record(stream_t *streamptr, int memType, void *data, size_t *numMissVals)
+{
+  int tsID = streamptr->curTsID;
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+
+  grb_read_next_record(streamptr, recID, memType, data, numMissVals);
+}
+
+void
+grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memType, void *data, size_t *numMissVals)
+{
+  int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID);
+  int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID];
+
+  *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, true);
+}
+
+void
+grb_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *numMissVals)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  size_t gridsize = (size_t) gridInqSize(gridID);
+
+  off_t currentfilepos = fileGetPos(fileID);
+
+  int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID);
+  int nlevs = streamptr->vars[varID].recordTable[0].nlevs;
+
+  if (CDI_Debug) Message("nlevs = %d gridID = %d gridsize = %zu", nlevs, gridID, gridsize);
+
+  *numMissVals = 0;
+  for (int levelID = 0; levelID < nlevs; levelID++)
+    {
+      int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID];
+      size_t offset = (size_t) levelID * gridsize;
+      void *datap = (memType == MEMTYPE_FLOAT) ? (void *) ((float *) data + offset) : (void *) ((double *) data + offset);
+
+      *numMissVals += grb_read_and_decode_record(streamptr, recID, memType, datap, false);
+    }
+
+  fileSetPos(fileID, currentfilepos, SEEK_SET);
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef VLIST_VAR_H
+#define VLIST_VAR_H
+
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifndef VLIST_H
+#endif
+
+int vlistVarGetPackSize(vlist_t *p, int varID, void *context);
+void vlistVarPack(vlist_t *p, int varID, char *buffer, int bufferSize, int *pos, void *context);
+void vlistVarUnpack(int vlistID, char *buf, int size, int *position, int, void *context);
+int vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB);
+void vlistDefVarIOrank(int, int, int);
+int vlistInqVarIOrank(int, int);
+
+void cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+#include <stdbool.h>
+
+
+void
+cdfDefVarDeflate(int ncid, int ncvarID, int shuffle, int compLevel)
+{
+#ifdef HAVE_NETCDF4
+  int deflate = 1;
+
+  if (CDI_Shuffle > 0 && shuffle == 0) shuffle = 1;
+
+  if (compLevel < 1 || compLevel > 9) compLevel = 1;
+
+  int status;
+  if ((status = nc_def_var_deflate(ncid, ncvarID, shuffle, deflate, compLevel)))
+    {
+      Error("nc_def_var_deflate failed: %s", nc_strerror(status));
+    }
+#else
+  static bool lwarn = true;
+  if (lwarn)
+    {
+      lwarn = false;
+      Warning("Deflate compression failed, NetCDF4 not available!");
+    }
+#endif
+}
+
+void
+cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block)
+{
+#ifdef HAVE_NC_DEF_VAR_SZIP
+  // Set options_mask.
+  /*
+    H5_SZIP_ALLOW_K13_OPTION_MASK   1
+    H5_SZIP_CHIP_OPTION_MASK        2
+    H5_SZIP_EC_OPTION_MASK          4
+    H5_SZIP_NN_OPTION_MASK          32
+    H5_SZIP_ALL_MASKS (H5_SZIP_CHIP_OPTION_MASK|H5_SZIP_EC_OPTION_MASK|H5_SZIP_NN_OPTION_MASK)
+  */
+  int options_mask = 38;
+  int status;
+  if ((status = nc_def_var_szip(ncid, ncvarID, options_mask, pixels_per_block)))
+    Error("nc_def_var_szip failed: %s", nc_strerror(status));
+#else
+  (void) ncid;
+  (void) ncvarID;
+  (void) pixels_per_block;
+  static bool lwarn = true;
+  if (lwarn)
+    {
+      lwarn = false;
+      Warning("Szip compression failed, NetCDF4/szlib not available!");
+    }
+#endif
+}
+
+#ifdef HAVE_NETCDF4
+static nc_type
+cdfTypeComplexFloat(stream_t *streamptr)
+{
+  if (streamptr->nc_complex_float_id == CDI_UNDEFID)
+    {
+      typedef struct complex_float
+      {
+        float r, i;
+      } complex_float;
+      int fileID = streamptr->fileID;
+      int nc_complex_id;
+      int status;
+      status = nc_def_compound(fileID, sizeof(complex_float), "complex_float", &nc_complex_id);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_float, r), NC_FLOAT);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_float, i), NC_FLOAT);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      streamptr->nc_complex_float_id = nc_complex_id;
+    }
+
+  return (nc_type) streamptr->nc_complex_float_id;
+}
+
+static nc_type
+cdfTypeComplexDouble(stream_t *streamptr)
+{
+  if (streamptr->nc_complex_double_id == CDI_UNDEFID)
+    {
+      typedef struct complex_double
+      {
+        double r, i;
+      } complex_double;
+      int fileID = streamptr->fileID;
+      int nc_complex_id;
+      int status;
+      status = nc_def_compound(fileID, sizeof(complex_double), "complex_double", &nc_complex_id);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_double, r), NC_DOUBLE);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_double, i), NC_DOUBLE);
+      if (status != NC_NOERR) Error("%s", nc_strerror(status));
+      streamptr->nc_complex_double_id = nc_complex_id;
+    }
+
+  return (nc_type) streamptr->nc_complex_double_id;
+}
+#endif
+
+nc_type
+cdfDefDatatype(int datatype, stream_t *streamptr)
+{
+  nc_type xtype = NC_FLOAT;
+
+  // clang-format off
+  if (streamptr->filetype == CDI_FILETYPE_NC4)
+    {
+      if      (datatype == CDI_DATATYPE_INT8  ) xtype = NC_BYTE;
+      else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT;
+      else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT;
+#ifdef  HAVE_NETCDF4
+      else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_UBYTE;
+      else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_USHORT;
+      else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_UINT;
+      else if (datatype == CDI_DATATYPE_CPX32 ) xtype = cdfTypeComplexFloat(streamptr);
+      else if (datatype == CDI_DATATYPE_CPX64 ) xtype = cdfTypeComplexDouble(streamptr);
+#else
+      else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_SHORT;
+      else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_INT;
+      else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_INT;
+      else if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64)
+        Error("CDI library does not support complex numbers with NetCDF4 classic!");
+#endif
+      else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE;
+      else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT;
+    }
+  else
+    {
+      if      (datatype == CDI_DATATYPE_INT8  ) xtype = NC_BYTE;
+      else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT;
+      else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT;
+      else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_SHORT;
+      else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_INT;
+      else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_INT;
+      else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE;
+      else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT;
+      else if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64)
+        Error("CDI library does not support complex numbers with NetCDF classic!");
+    }
+  // clang-format on
+
+  return xtype;
+}
+
+static void
+cdfDefVarMissval(stream_t *streamptr, int varID, int dtype, int lcheck)
+{
+  if (streamptr->vars[varID].defmiss == false)
+    {
+      int vlistID = streamptr->vlistID;
+      int fileID = streamptr->fileID;
+      int ncvarID = streamptr->vars[varID].ncvarid;
+      double missval = vlistInqVarMissval(vlistID, varID);
+
+      if (lcheck && streamptr->ncmode == 2) cdf_redef(fileID);
+
+      nc_type xtype = cdfDefDatatype(dtype, streamptr);
+      if (xtype == NC_BYTE && missval > 127 && missval < 256) xtype = NC_INT;
+
+      if (lcheck == 0 || streamptr->ncmode != 2 || streamptr->filetype == CDI_FILETYPE_NC || streamptr->filetype == CDI_FILETYPE_NC2
+          || streamptr->filetype == CDI_FILETYPE_NC5)
+        cdf_put_att_double(fileID, ncvarID, "_FillValue", xtype, 1, &missval);
+
+      cdf_put_att_double(fileID, ncvarID, "missing_value", xtype, 1, &missval);
+
+      if (lcheck && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self);
+
+      streamptr->vars[varID].defmiss = true;
+    }
+}
+
+static void
+cdfDefInstituteGlobal(const stream_t *streamptr)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int instID = vlistInqInstitut(vlistID);
+
+  if (instID != CDI_UNDEFID)
+    {
+      const char *longname = institutInqLongnamePtr(instID);
+      if (longname)
+        {
+          size_t len = strlen(longname);
+          if (len > 0)
+            {
+              if (streamptr->ncmode == 2) cdf_redef(fileID);
+              cdf_put_att_text(fileID, NC_GLOBAL, "institution", len, longname);
+              if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self);
+            }
+        }
+    }
+}
+
+static void
+cdfDefSourceGlobal(const stream_t *streamptr)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int modelID = vlistInqModel(vlistID);
+
+  if (modelID != CDI_UNDEFID)
+    {
+      const char *longname = modelInqNamePtr(modelID);
+      if (longname)
+        {
+          size_t len = strlen(longname);
+          if (len > 0)
+            {
+              if (streamptr->ncmode == 2) cdf_redef(fileID);
+              cdf_put_att_text(fileID, NC_GLOBAL, "source", len, longname);
+              if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self);
+            }
+        }
+    }
+}
+
+static inline void *
+resizeBuf(void **buf, size_t *bufSize, size_t reqSize)
+{
+  if (reqSize > *bufSize)
+    {
+      *buf = Realloc(*buf, reqSize);
+      *bufSize = reqSize;
+    }
+  return *buf;
+}
+
+static void
+cdfDefineCellMethods(stream_t *streamptr, int cdiID, int varID, int fileID, int ncvarID)
+{
+  taxis_t *taxis = &streamptr->tsteps[0].taxis;
+  if (!taxis->hasBounds) return;
+
+  int timeVarId = streamptr->basetime.ncvarid;
+  char timeVarName[CDI_MAX_NAME];
+  cdf_inq_varname(fileID, timeVarId, timeVarName);
+
+  int stepType = vlistInqVarTsteptype(cdiID, varID);
+
+  const char *cellMethod = NULL;
+  // clang-format off
+  if      (stepType == TSTEP_AVG)   cellMethod = "mean";
+  else if (stepType == TSTEP_SUM)   cellMethod = "sum";
+  else if (stepType == TSTEP_RANGE) cellMethod = "range";
+  else if (stepType == TSTEP_MIN)   cellMethod = "minimum";
+  else if (stepType == TSTEP_MAX)   cellMethod = "maximum";
+  // clang-format on
+
+  if (cellMethod)
+    {
+      const char *attname = "cell_methods";
+      char atttxt[CDI_MAX_NAME + 10];
+      snprintf(atttxt, sizeof(atttxt), "%s: %s", timeVarName, cellMethod);
+      cdf_put_att_text(fileID, ncvarID, attname, strlen(atttxt), atttxt);
+    }
+}
+
+static nc_type
+int_datatype_to_xtype(int filetype, int datatype)
+{
+  // clang-format off
+  if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR)
+    {
+      return (datatype == CDI_DATATYPE_INT8)   ? NC_BYTE :
+             (datatype == CDI_DATATYPE_INT16)  ? NC_SHORT :
+#ifdef  HAVE_NETCDF4
+             (datatype == CDI_DATATYPE_UINT8)  ? NC_UBYTE :
+             (datatype == CDI_DATATYPE_UINT16) ? NC_USHORT :
+             (datatype == CDI_DATATYPE_UINT32) ? NC_UINT :
+#endif
+                                                 NC_INT;
+    }
+
+  return (datatype == CDI_DATATYPE_INT8)   ? NC_BYTE :
+         (datatype == CDI_DATATYPE_INT16)  ? NC_SHORT :
+                                             NC_INT;
+  // clang-format on
+}
+
+void
+cdfDefineAttributes(int filetype, int cdiID, int varID, int fileID, int ncvarID)
+{
+  int atttype, attlen;
+  char attname[CDI_MAX_NAME + 1];
+  void *attBuf = NULL;
+  size_t attBufSize = 0;
+
+  int natts;
+  cdiInqNatts(cdiID, varID, &natts);
+
+  for (int iatt = 0; iatt < natts; ++iatt)
+    {
+      cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen);
+
+      // if (attlen == 0) continue;
+
+      if (atttype == CDI_DATATYPE_TXT)
+        {
+          size_t attSize = (size_t) attlen * sizeof(char);
+          char *atttxt = (char *) resizeBuf(&attBuf, &attBufSize, attSize);
+          cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt);
+          size_t len = (size_t) attlen;
+          cdf_put_att_text(fileID, ncvarID, attname, len, atttxt);
+        }
+      else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16
+               || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32)
+        {
+          if (attlen == 0) continue;
+          size_t attSize = (size_t) attlen * sizeof(int);
+          int *attint = (int *) resizeBuf(&attBuf, &attBufSize, attSize);
+          cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]);
+          size_t len = (size_t) attlen;
+          cdf_put_att_int(fileID, ncvarID, attname, int_datatype_to_xtype(filetype, atttype), len, attint);
+        }
+      else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64)
+        {
+          if (attlen == 0) continue;
+          size_t attSize = (size_t) attlen * sizeof(double);
+          double *attflt = (double *) resizeBuf(&attBuf, &attBufSize, attSize);
+          cdiInqAttFlt(cdiID, varID, attname, attlen, attflt);
+          size_t len = (size_t) attlen;
+          if (atttype == CDI_DATATYPE_FLT32)
+            {
+              float attflt_sp[8];
+              float *pattflt_sp = (len > 8) ? (float *) malloc(len * sizeof(float)) : attflt_sp;
+              for (size_t i = 0; i < len; ++i) pattflt_sp[i] = (float) attflt[i];
+              cdf_put_att_float(fileID, ncvarID, attname, NC_FLOAT, len, pattflt_sp);
+              if (len > 8) free(pattflt_sp);
+            }
+          else
+            cdf_put_att_double(fileID, ncvarID, attname, NC_DOUBLE, len, attflt);
+        }
+    }
+
+  if (attBuf) Free(attBuf);
+}
+
+static void
+cdfDefineInstituteName(int vlistID, int varID, int fileID, int ncvarID)
+{
+  int instID = vlistInqVarInstitut(vlistID, varID);
+  if (instID != CDI_UNDEFID)
+    {
+      const char *name = institutInqNamePtr(instID);
+      if (name) cdf_put_att_text(fileID, ncvarID, "institution", strlen(name), name);
+    }
+}
+
+static void
+cdfDefGlobalAtts(stream_t *streamptr)
+{
+  if (streamptr->globalatts) return;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  cdfDefSourceGlobal(streamptr);
+  cdfDefInstituteGlobal(streamptr);
+
+  int natts;
+  cdiInqNatts(vlistID, CDI_GLOBAL, &natts);
+
+  if (natts > 0 && streamptr->ncmode == 2) cdf_redef(fileID);
+
+  cdfDefineAttributes(streamptr->filetype, vlistID, CDI_GLOBAL, fileID, NC_GLOBAL);
+
+  if (natts > 0 && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self);
+
+  streamptr->globalatts = 1;
+}
+
+static void
+cdf_get_gmapvarname(int gridID, char *gmapvarname)
+{
+  int length = CDI_MAX_NAME;
+  int pgridID = gridID;
+  cdiInqKeyString(pgridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length);
+
+  if (!gmapvarname[0])
+    {
+      length = CDI_MAX_NAME;
+      pgridID = gridInqProj(gridID);
+      if (pgridID != CDI_UNDEFID) cdiInqKeyString(pgridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length);
+    }
+}
+
+static int
+nc_grid_index(stream_t *streamptr, int gridID)
+{
+  int index = 0;
+  int vlistID = streamptr->vlistID;
+  int ngrids = vlistNumGrids(vlistID);
+  for (index = 0; index < ngrids; ++index)
+    if (streamptr->ncgrid[index].gridID == gridID) break;
+
+  assert(index < ngrids);
+
+  return index;
+}
+
+// convert NetCDF xtype to pixels_per_block
+static int
+xtype2ppb(nc_type xtype)
+{
+  int ppb = 32;
+
+  // clang-format off
+  if      (xtype == NC_BYTE)   ppb = 8;
+  else if (xtype == NC_SHORT)  ppb = 16;
+#ifdef  HAVE_NETCDF4
+  else if (xtype == NC_UBYTE)  ppb = 8;
+  else if (xtype == NC_USHORT) ppb = 16;
+#endif
+  // clang-format on
+
+  return ppb;
+}
+
+static void
+cdfDefVarFilter(int fileID, int fileType, int ncvarID, const char *filterSpec)
+{
+  if (filterSpec)
+    {
+      if (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR)
+        {
+          cdf_def_var_filter(fileID, ncvarID, filterSpec);
+        }
+      else
+        {
+          static bool lwarn = true;
+          if (lwarn)
+            {
+              lwarn = false;
+              Warning("Filter is only available with NetCDF4!");
+            }
+        }
+    }
+}
+
+static void
+cdfDefVarCompression(const stream_t *streamptr, int ncvarID, nc_type xtype)
+{
+  if (streamptr->comptype == CDI_COMPRESS_ZIP)
+    {
+      if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C
+          || streamptr->filetype == CDI_FILETYPE_NCZARR)
+        {
+          cdfDefVarDeflate(streamptr->fileID, ncvarID, streamptr->shuffle, streamptr->complevel);
+        }
+      else
+        {
+          static bool lwarn = true;
+          if (lwarn)
+            {
+              lwarn = false;
+              Warning("Deflate compression is only available for NetCDF4!");
+            }
+        }
+    }
+  /*
+  else if (streamptr->comptype == CDI_COMPRESS_ZSTD)
+    {
+      if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C
+          || streamptr->filetype == CDI_FILETYPE_NCZARR)
+        {
+          cdfDefVarZstd(streamptr->fileID, ncvarID, streamptr->complevel);
+        }
+      else
+        {
+          static bool lwarn = true;
+          if (lwarn)
+            {
+              lwarn = false;
+              Warning("SZIP compression is only available for NetCDF4!");
+            }
+        }
+    }
+  */
+  else if (streamptr->comptype == CDI_COMPRESS_SZIP)
+    {
+      if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C
+          || streamptr->filetype == CDI_FILETYPE_NCZARR)
+        {
+          cdfDefVarSzip(streamptr->fileID, ncvarID, xtype2ppb(xtype));
+        }
+      else
+        {
+          static bool lwarn = true;
+          if (lwarn)
+            {
+              lwarn = false;
+              Warning("SZIP compression is only available for NetCDF4!");
+            }
+        }
+    }
+}
+
+static void
+cdfDefVarPacking(const stream_t *streamptr, int ncvarID, nc_type xtype, int vlistID, int varID)
+{
+  //  if ( xtype == NC_BYTE || xtype == NC_SHORT || xtype == NC_INT )
+  {
+    double addoffset = 0.0, scalefactor = 1.0;
+    bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
+    bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
+
+    if (haveAddoffset || haveScalefactor)
+      {
+        nc_type astype = (xtype == NC_FLOAT) ? NC_FLOAT : NC_DOUBLE;
+        if ((astype == NC_DOUBLE) && IS_EQUAL(addoffset, (double) ((float) addoffset))
+            && IS_EQUAL(scalefactor, (double) ((float) scalefactor)))
+          {
+            astype = NC_FLOAT;
+          }
+
+        cdf_put_att_double(streamptr->fileID, ncvarID, "add_offset", astype, 1, &addoffset);
+        cdf_put_att_double(streamptr->fileID, ncvarID, "scale_factor", astype, 1, &scalefactor);
+      }
+  }
+}
+
+static void
+cdfAppendCoordinates(int fileID, int ncvarID, char coordinates[CDI_MAX_NAME])
+{
+  if (ncvarID != CDI_UNDEFID)
+    {
+      size_t len = strlen(coordinates);
+      if (len) coordinates[len++] = ' ';
+      cdf_inq_varname(fileID, ncvarID, coordinates + len);
+    }
+}
+
+static void
+cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int gridtype, int gridID, int gridindex, int xid,
+                     int yid, size_t gridsize, char axis[5], size_t iax)
+{
+  int fileID = streamptr->fileID;
+
+  if (gridtype != GRID_GENERIC && gridtype != GRID_LONLAT && gridtype != GRID_PROJECTION && gridtype != GRID_CURVILINEAR
+      && gridtype != GRID_CHARXY)
+    {
+      size_t len = strlen(gridNamePtr(gridtype));
+      if (len > 0) cdf_put_att_text(fileID, ncvarID, "CDI_grid_type", len, gridNamePtr(gridtype));
+    }
+
+  char gmapvarname[CDI_MAX_NAME];
+  gmapvarname[0] = 0;
+  cdf_get_gmapvarname(gridID, gmapvarname);
+  if (gmapvarname[0]) cdf_put_att_text(fileID, ncvarID, "grid_mapping", strlen(gmapvarname), gmapvarname);
+
+  if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      int numLPE = gridInqNP(gridID);
+      if (numLPE > 0) cdf_put_att_int(fileID, ncvarID, "CDI_grid_num_LPE", NC_INT, 1, &numLPE);
+    }
+
+  if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      if (ncyvarID != CDI_UNDEFID)
+        {
+          char name[CDI_MAX_NAME];
+          name[0] = 0;
+          cdf_inq_varname(fileID, ncyvarID, name);
+          size_t len = strlen(name);
+          cdf_put_att_text(fileID, ncvarID, "CDI_grid_latitudes", len, name);
+        }
+
+      int ncrpvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_RP];
+      if (ncrpvarID != CDI_UNDEFID)
+        {
+          char name[CDI_MAX_NAME];
+          name[0] = 0;
+          cdf_inq_varname(fileID, ncrpvarID, name);
+          size_t len = strlen(name);
+          cdf_put_att_text(fileID, ncvarID, "CDI_grid_reduced_points", len, name);
+        }
+    }
+
+  // define coordinates attribute
+
+  char coordinates[CDI_MAX_NAME];
+  coordinates[0] = 0;
+
+  if (nczvarID != CDI_UNDEFID) cdfAppendCoordinates(fileID, nczvarID, coordinates);
+
+  if (gridtype == GRID_TRAJECTORY)
+    {
+      cdf_put_att_text(fileID, ncvarID, "coordinates", 9, "tlon tlat");
+    }
+  else if (gridtype == GRID_LONLAT && xid == CDI_UNDEFID && yid == CDI_UNDEFID && gridsize == 1)
+    {
+      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      cdfAppendCoordinates(fileID, ncyvarID, coordinates);
+      cdfAppendCoordinates(fileID, ncxvarID, coordinates);
+    }
+  else if (gridtype == GRID_GAUSSIAN_REDUCED)
+    {
+      /*
+      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      cdfAppendCoordinates(fileID, ncyvarID, coordinates);
+      cdfAppendCoordinates(fileID, ncxvarID, coordinates);
+      */
+    }
+  else if (gridtype == GRID_UNSTRUCTURED || gridtype == GRID_CURVILINEAR)
+    {
+      int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+      int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+      int ncavarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_A];
+      // CMOR order: coordinates = "lat lon"
+      if (CDI_Coordinates_Lon_Lat)
+        {
+          cdfAppendCoordinates(fileID, ncxvarID, coordinates);
+          cdfAppendCoordinates(fileID, ncyvarID, coordinates);
+        }
+      else
+        {
+          cdfAppendCoordinates(fileID, ncyvarID, coordinates);
+          cdfAppendCoordinates(fileID, ncxvarID, coordinates);
+        }
+
+      if (ncavarID != CDI_UNDEFID)
+        {
+          char cellarea[CDI_MAX_NAME] = "area: ";
+          size_t len = strlen(cellarea);
+          cdf_inq_varname(fileID, ncavarID, cellarea + len);
+          len = strlen(cellarea);
+          cdf_put_att_text(fileID, ncvarID, "cell_measures", len, cellarea);
+        }
+
+      if (gridtype == GRID_UNSTRUCTURED)
+        {
+          int position = gridInqPosition(gridID);
+          if (position > 0) cdf_put_att_int(fileID, ncvarID, "number_of_grid_in_reference", NC_INT, 1, &position);
+        }
+    }
+  else if (gridtype == GRID_SPECTRAL || gridtype == GRID_FOURIER)
+    {
+      axis[iax++] = '-';
+      axis[iax++] = '-';
+      cdf_put_att_text(fileID, ncvarID, "axis", iax, axis);
+      int gridTruncation = gridInqTrunc(gridID);
+      cdf_put_att_int(fileID, ncvarID, "truncation", NC_INT, 1, &gridTruncation);
+    }
+  else if (gridtype == GRID_CHARXY)
+    {
+      if (gridInqXIsc(gridID))
+        {
+          int ncxvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+          cdfAppendCoordinates(fileID, ncxvarID, coordinates);
+        }
+      else if (gridInqYIsc(gridID))
+        {
+          int ncyvarID = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+          cdfAppendCoordinates(fileID, ncyvarID, coordinates);
+        }
+    }
+
+  size_t len = strlen(coordinates);
+  if (len) cdf_put_att_text(fileID, ncvarID, "coordinates", len, coordinates);
+}
+
+static size_t
+calc_chunksize(size_t chunkSizeLim, size_t size)
+{
+  static const size_t pageSize = 4096;
+
+  if (size <= chunkSizeLim) return size;
+
+  size_t numChunks = (size / chunkSizeLim) + 1;
+  size_t chunkSize = size / numChunks;
+  if (chunkSize % pageSize) chunkSize = (chunkSize / pageSize + 1) * pageSize;
+
+  return chunkSize;
+}
+
+static const size_t chunkSizeMin = 262144;    // 256k
+static const size_t chunkSizeLim = 16777216;  // 16m
+
+size_t
+calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize)
+{
+  if (chunkType == CDI_CHUNK_AUTO)
+    return (gridsize <= chunkSizeMin) ? ysize : chunkSizeMin / xsize;
+  else
+    return (chunkType == CDI_CHUNK_LINES) ? 1 : ysize;
+}
+
+size_t
+calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool yIsUndefined)
+{
+  if (chunkType == CDI_CHUNK_AUTO && yIsUndefined)
+    return (chunkSize > 0 && (size_t) chunkSize < xsize) ? (size_t) chunkSize : ((xsize <= chunkSizeMin) ? xsize : chunkSizeMin);
+  else
+    return calc_chunksize(chunkSizeLim, xsize);
+}
+
+static int
+cdfDefineDimsAndChunks(const stream_t *streamptr, int varID, int xid, int yid, int zid, size_t gridsize, const int dimorder[3],
+                       int dims[4], bool useChunks, size_t chunks[4], char axis[5], size_t *piax)
+{
+  int fileID = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+
+  size_t iax = *piax;
+  int ndims = 0;
+
+  for (int i = 0; i < 4; ++i) chunks[i] = 0;
+
+  size_t xsize = 0, ysize = 0;
+  if (xid != CDI_UNDEFID) cdf_inq_dimlen(fileID, xid, &xsize);
+  if (yid != CDI_UNDEFID) cdf_inq_dimlen(fileID, yid, &ysize);
+
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+  if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT)
+    {
+      int tid = streamptr->basetime.ncdimid;
+      if (tid == CDI_UNDEFID) Error("Internal problem, time undefined!");
+      axis[iax++] = 'T';
+      chunks[ndims] = 1;
+      dims[ndims] = tid;
+      ndims++;
+    }
+
+  int chunkSize = 0;
+  int chunkType = CDI_CHUNK_GRID;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, &chunkType);
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize);
+  if (chunkSize > 0 && yid == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO;
+
+  if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim)
+    {
+      if (CDI_Debug) fprintf(stderr, "gridsize > %u, changed chunkType to CDI_CHUNK_LINES!\n", ChunkSizeLim);
+      chunkType = CDI_CHUNK_AUTO;
+    }
+
+  for (int id = 0; id < 3; ++id)
+    {
+      if (dimorder[id] == 3 && zid != CDI_UNDEFID)
+        {
+          axis[iax++] = 'Z';
+          chunks[ndims] = 1;
+          dims[ndims] = zid;
+          ndims++;
+        }
+      else if (dimorder[id] == 2 && yid != CDI_UNDEFID)
+        {
+          chunks[ndims] = calc_chunksize_y(chunkType, gridsize, xsize, ysize);
+          dims[ndims] = yid;
+          ndims++;
+        }
+      else if (dimorder[id] == 1 && xid != CDI_UNDEFID)
+        {
+          chunks[ndims] = calc_chunksize_x(chunkType, chunkSize, xsize, (yid == CDI_UNDEFID));
+          dims[ndims] = xid;
+          ndims++;
+        }
+    }
+
+  if (CDI_Debug)
+    fprintf(stderr, "useChunks %d chunkType %d chunkSize %d  chunks %zu %zu %zu %zu\n", useChunks, chunkType, chunkSize, chunks[0],
+            chunks[1], chunks[2], chunks[3]);
+
+  *piax = iax;
+  return ndims;
+}
+
+static void
+cdfDefineAttrLeveltype(int fileID, int ncvarID, int zaxisID, int zaxistype)
+{
+  // clang-format off
+  if ( zaxistype == ZAXIS_CLOUD_BASE          ||
+       zaxistype == ZAXIS_CLOUD_TOP           ||
+       zaxistype == ZAXIS_ISOTHERM_ZERO       ||
+       zaxistype == ZAXIS_TROPOPAUSE          ||
+       zaxistype == ZAXIS_TOA                 ||
+       zaxistype == ZAXIS_SEA_BOTTOM          ||
+       zaxistype == ZAXIS_LAKE_BOTTOM         ||
+       zaxistype == ZAXIS_SEDIMENT_BOTTOM     ||
+       zaxistype == ZAXIS_SEDIMENT_BOTTOM_TA  ||
+       zaxistype == ZAXIS_SEDIMENT_BOTTOM_TW  ||
+       zaxistype == ZAXIS_MIX_LAYER           ||
+       zaxistype == ZAXIS_ATMOSPHERE )
+    {
+      char varname[CDI_MAX_NAME];
+      int length = CDI_MAX_NAME;
+      cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, varname, &length);
+      cdf_put_att_text(fileID, ncvarID, "level_type", strlen(varname), varname);
+    }
+  // clang-format on
+}
+
+static void
+cdfDefineAttrEnsemble(int fileID, int ncvarID, int vlistID, int varID)
+{
+  int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast;
+  if (cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber) == 0)
+    cdf_put_att_int(fileID, ncvarID, "realization", NC_INT, 1, &perturbationNumber);
+  if (cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble) == 0)
+    cdf_put_att_int(fileID, ncvarID, "ensemble_members", NC_INT, 1, &numberOfForecastsInEnsemble);
+  if (cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast) == 0)
+    cdf_put_att_int(fileID, ncvarID, "forecast_init_type", NC_INT, 1, &typeOfEnsembleForecast);
+}
+
+static void
+cdfCheckVarname(int fileID, char name[CDI_MAX_NAME])
+{
+  if (name[0])
+    {
+      int ncvarID;
+      char varname[CDI_MAX_NAME];
+      snprintf(varname, sizeof(varname), "%s", name);
+      size_t len = strlen(varname);
+      char *varname2 = varname + len;
+      unsigned iz = 0;
+
+      do
+        {
+          if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1);
+
+          if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break;
+
+          ++iz;
+        }
+      while (iz <= 99);
+
+      if (iz > 99) Error("Variable name %s already exsist!", name);
+
+      if (!str_is_equal(name, varname))
+        Warning("Changed %s entry of variable name '%s' to '%s'!", (iz == 1) ? "double" : "multiple", name, varname);
+
+      strcpy(name, varname);
+    }
+}
+
+static void
+cdfGenVarname(int fileID, char name[CDI_MAX_NAME], int pnum, int pcat, int *pdis, int *pcode)
+{
+  char varname[CDI_MAX_NAME];
+
+  int code = *pcode;
+  if (code < 0) code = -code;
+  if (pnum < 0) pnum = -pnum;
+
+  if (*pdis == 255)
+    snprintf(varname, sizeof(varname), "var%d", code);
+  else
+    snprintf(varname, sizeof(varname), "param%d.%d.%d", pnum, pcat, *pdis);
+
+  size_t len = strlen(varname);
+  char *varname2 = varname + len;
+  int ncvarID;
+  unsigned iz = 0;
+
+  do
+    {
+      if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1);
+
+      if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break;
+
+      ++iz;
+    }
+  while (iz <= 99);
+
+  if (iz > 99) Error("Variable name %s already exsist!", name);
+
+  strcpy(name, varname);
+  *pcode = 0;
+  *pdis = 255;
+}
+
+static void
+cdfDefVarChunkCache(int fileID, int ncvarID)
+{
+  size_t size = 0;
+  size_t nelems = 0;
+  float preemption = 0;
+  if (CDI_Chunk_Cache > 0 && nc_get_var_chunk_cache(fileID, ncvarID, &size, &nelems, &preemption) == NC_NOERR)
+    {
+      size = (size_t) CDI_Chunk_Cache;
+    }
+
+  nc_set_var_chunk_cache(fileID, ncvarID, size, nelems, preemption);
+}
+
+int
+cdfDefVar(stream_t *streamptr, int varID)
+{
+  if (streamptr->vars[varID].ncvarid != CDI_UNDEFID) return streamptr->vars[varID].ncvarid;
+
+  int fileID = streamptr->fileID;
+  int fileType = streamptr->filetype;
+  if (CDI_Debug) Message("streamID = %d, fileID = %d, varID = %d", streamptr->self, fileID, varID);
+
+  int vlistID = streamptr->vlistID;
+  int param = vlistInqVarParam(vlistID, varID);
+  int code = vlistInqVarCode(vlistID, varID);
+  int pnum, pcat, pdis;
+  cdiDecodeParam(param, &pnum, &pcat, &pdis);
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  SizeType gridsize = gridInqSize(gridID);
+  int gridtype = gridInqType(gridID);
+  int gridindex = nc_grid_index(streamptr, gridID);
+  int xid = (gridtype != GRID_TRAJECTORY) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X] : CDI_UNDEFID;
+  int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y]
+                                                                               : CDI_UNDEFID;
+
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+  int zaxistype = zaxisInqType(zaxisID);
+  int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+  int zid = streamptr->zaxisID[zaxisindex];
+
+  int dimorder[3];  // ZYX/321 and ZXY/312
+  vlistInqVarDimorder(vlistID, varID, dimorder);
+  bool useChunks
+      = (gridsize >= 32) && ((dimorder[0] == 3) || (dimorder[1] == 3 && dimorder[2] == 1 && gridsize == gridInqXsize(gridID)));
+
+  if (((dimorder[0] > 0) + (dimorder[1] > 0) + (dimorder[2] > 0))
+      < ((xid != CDI_UNDEFID) + (yid != CDI_UNDEFID) + (zid != CDI_UNDEFID)))
+    {
+      printf("zid=%d  yid=%d  xid=%d\n", zid, yid, xid);
+      Error("Internal problem, dimension order missing!");
+    }
+
+  size_t iax = 0;
+  char axis[5];
+  int dims[4];
+  size_t chunks[4];
+  int ndims
+      = cdfDefineDimsAndChunks(streamptr, varID, xid, yid, zid, (size_t) gridsize, dimorder, dims, useChunks, chunks, axis, &iax);
+
+  char name[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length);
+
+  char longname[CDI_MAX_NAME];
+  vlistInqVarLongname(vlistID, varID, longname);
+
+  char units[CDI_MAX_NAME];
+  vlistInqVarUnits(vlistID, varID, units);
+
+  char stdname[CDI_MAX_NAME];
+  length = CDI_MAX_NAME;
+  cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length);
+
+  int tableID = vlistInqVarTable(vlistID, varID);
+  if (!name[0]) tableInqEntry(tableID, code, -1, name, longname, units);
+  if (name[0])
+    cdfCheckVarname(fileID, name);
+  else
+    cdfGenVarname(fileID, name, pnum, pcat, &pdis, &code);
+
+  int dtype = vlistInqVarDatatype(vlistID, varID);
+  nc_type xtype = cdfDefDatatype(dtype, streamptr);
+
+  if (streamptr->ncmode == 2)
+    {
+      cdf_redef(fileID);
+      streamptr->ncmode = 1;
+    }
+
+  int ncvarID = -1;
+  cdf_def_var(fileID, name, xtype, ndims, dims, &ncvarID);
+
+  cdfDefVarChunkCache(fileID, ncvarID);
+
+#ifdef HAVE_NETCDF4
+#ifdef NC_QUANTIZE_BITROUND
+  if (xtype == NC_FLOAT || xtype == NC_DOUBLE)
+    {
+      int nsb = vlistInqVarNSB(vlistID, varID);
+      if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_BITROUND, nsb);
+      // if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_GRANULARBR, nsb);
+    }
+#endif
+
+  if (useChunks && (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR))
+    cdf_def_var_chunking(fileID, ncvarID, NC_CHUNKED, chunks);
+#endif
+
+  if (useChunks) cdfDefVarCompression(streamptr, ncvarID, xtype);
+  if (useChunks)
+    {
+      char filterSpec[CDI_MAX_NAME];
+      length = CDI_MAX_NAME;
+      if (cdiInqKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, filterSpec, &length) == CDI_NOERR)
+        {
+          cdfDefVarFilter(fileID, fileType, ncvarID, filterSpec);
+        }
+      else if (streamptr->filterSpec)
+        {
+          cdfDefVarFilter(fileID, fileType, ncvarID, streamptr->filterSpec);
+        }
+    }
+
+  if (*stdname) cdf_put_att_text(fileID, ncvarID, "standard_name", strlen(stdname), stdname);
+  if (*longname) cdf_put_att_text(fileID, ncvarID, "long_name", strlen(longname), longname);
+  if (*units) cdf_put_att_text(fileID, ncvarID, "units", strlen(units), units);
+
+  if (code > 0 && pdis == 255) cdf_put_att_int(fileID, ncvarID, "code", NC_INT, 1, &code);
+
+  if (pdis != 255)
+    {
+      char paramstr[32];
+      cdiParamToString(param, paramstr, sizeof(paramstr));
+      cdf_put_att_text(fileID, ncvarID, "param", strlen(paramstr), paramstr);
+    }
+
+  if (tableID != CDI_UNDEFID)
+    {
+      int tablenum = tableInqNum(tableID);
+      if (tablenum > 0) cdf_put_att_int(fileID, ncvarID, "table", NC_INT, 1, &tablenum);
+    }
+
+  bool zaxisIsScalar = (zid == CDI_UNDEFID) ? (zaxisInqScalar(zaxisID) > 0) : false;
+  int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->nczvarID[zaxisindex] : CDI_UNDEFID;
+
+  cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, (size_t) gridsize, axis, iax);
+
+  cdfDefVarPacking(streamptr, ncvarID, xtype, vlistID, varID);
+
+  if (dtype == CDI_DATATYPE_UINT8 && xtype == NC_BYTE)
+    {
+      int validrange[2] = { 0, 255 };
+      cdf_put_att_int(fileID, ncvarID, "valid_range", NC_SHORT, 2, validrange);
+      cdf_put_att_text(fileID, ncvarID, "_Unsigned", 4, "true");
+    }
+
+  streamptr->vars[varID].ncvarid = ncvarID;
+
+  if (vlistInqVarMissvalUsed(vlistID, varID)) cdfDefVarMissval(streamptr, varID, vlistInqVarDatatype(vlistID, varID), 0);
+
+  if (zid == CDI_UNDEFID) cdfDefineAttrLeveltype(fileID, ncvarID, zaxisID, zaxistype);
+
+  cdfDefineAttrEnsemble(fileID, ncvarID, vlistID, varID);
+
+  // Attribute: cell_methods
+  cdfDefineCellMethods(streamptr, vlistID, varID, fileID, ncvarID);
+
+  // Attributes
+  cdfDefineAttributes(fileType, vlistID, varID, fileID, ncvarID);
+
+  // Institute
+  if (vlistInqInstitut(vlistID) == CDI_UNDEFID) cdfDefineInstituteName(vlistID, varID, fileID, ncvarID);
+
+  return ncvarID;
+}
+
+void
+cdfEndDef(stream_t *streamptr)
+{
+  cdfDefGlobalAtts(streamptr);
+
+  if (streamptr->accessmode == 0)
+    {
+      int fileID = streamptr->fileID;
+      if (streamptr->ncmode == 2)
+        {
+          cdf_redef(fileID);
+          streamptr->ncmode = 1;
+        }
+
+      int nvars = streamptr->nvars;
+      for (int varID = 0; varID < nvars; ++varID) cdfDefVar(streamptr, varID);
+
+      if (streamptr->ncmode != 2)
+        {
+          if (CDI_Netcdf_Hdr_Pad == 0UL)
+            cdf_enddef(fileID, streamptr->self);
+          else
+            cdf__enddef(fileID, streamptr->self, CDI_Netcdf_Hdr_Pad);
+          streamptr->ncmode = 2;
+        }
+
+      streamptr->accessmode = 1;
+    }
+}
+
+static void
+cdfWriteGridTraj(stream_t *streamptr, int gridID)
+{
+  int gridindex = nc_grid_index(streamptr, gridID);
+  int lonID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
+  int latID = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+  size_t index = (size_t) streamptr->curTsID;
+
+  double xlon = gridInqXval(gridID, 0);
+  double xlat = gridInqYval(gridID, 0);
+
+  cdf_put_var1_double(streamptr->fileID, lonID, &index, &xlon);
+  cdf_put_var1_double(streamptr->fileID, latID, &index, &xlat);
+}
+
+static void
+cdf_write_var_data(int fileID, int vlistID, int varID, int ncvarID, int dtype, size_t nvals, size_t xsize, size_t ysize,
+                   bool swapxy, size_t *start, size_t *count, int memtype, const void *data, size_t numMissVals)
+{
+  const double *pdata_dp = (const double *) data;
+  double *mdata_dp = NULL;
+  double *sdata_dp = NULL;
+  const float *pdata_sp = (const float *) data;
+  float *mdata_sp = NULL;
+  float *sdata_sp = NULL;
+
+  /*  if ( dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32 ) */
+  {
+    double missval = vlistInqVarMissval(vlistID, varID);
+    double addoffset = 0.0, scalefactor = 1.0;
+    bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
+    bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
+
+    if (haveAddoffset || haveScalefactor)
+      {
+        if (memtype == MEMTYPE_FLOAT)
+          {
+            mdata_sp = (float *) Malloc(nvals * sizeof(float));
+            memcpy(mdata_sp, pdata_sp, nvals * sizeof(float));
+            pdata_sp = mdata_sp;
+
+            if (numMissVals > 0)
+              {
+                for (size_t i = 0; i < nvals; ++i)
+                  {
+                    double temp = mdata_sp[i];
+                    if (!DBL_IS_EQUAL(temp, (float) missval))
+                      {
+                        if (haveAddoffset) temp -= addoffset;
+                        if (haveScalefactor) temp /= scalefactor;
+                        mdata_sp[i] = (float) temp;
+                      }
+                  }
+              }
+            else
+              {
+                for (size_t i = 0; i < nvals; ++i)
+                  {
+                    double temp = mdata_sp[i];
+                    if (haveAddoffset) temp -= addoffset;
+                    if (haveScalefactor) temp /= scalefactor;
+                    mdata_sp[i] = (float) temp;
+                  }
+              }
+          }
+        else
+          {
+            mdata_dp = (double *) Malloc(nvals * sizeof(double));
+            memcpy(mdata_dp, pdata_dp, nvals * sizeof(double));
+            pdata_dp = mdata_dp;
+
+            if (numMissVals > 0)
+              {
+                for (size_t i = 0; i < nvals; ++i)
+                  {
+                    if (!DBL_IS_EQUAL(mdata_dp[i], missval))
+                      {
+                        if (haveAddoffset) mdata_dp[i] -= addoffset;
+                        if (haveScalefactor) mdata_dp[i] /= scalefactor;
+                      }
+                  }
+              }
+            else
+              {
+                for (size_t i = 0; i < nvals; ++i)
+                  {
+                    if (haveAddoffset) mdata_dp[i] -= addoffset;
+                    if (haveScalefactor) mdata_dp[i] /= scalefactor;
+                  }
+              }
+          }
+      }
+
+    if (dtype == CDI_DATATYPE_UINT8 || dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_UINT16 || dtype == CDI_DATATYPE_INT16
+        || dtype == CDI_DATATYPE_UINT32 || dtype == CDI_DATATYPE_INT32)
+      {
+        if (memtype == MEMTYPE_FLOAT)
+          {
+            if (mdata_sp == NULL)
+              {
+                mdata_sp = (float *) Malloc(nvals * sizeof(float));
+                memcpy(mdata_sp, pdata_sp, nvals * sizeof(float));
+                pdata_sp = mdata_sp;
+              }
+
+            for (size_t i = 0; i < nvals; ++i) mdata_sp[i] = roundf(mdata_sp[i]);
+
+            if (dtype == CDI_DATATYPE_UINT8)
+              {
+                nc_type xtype;
+                cdf_inq_vartype(fileID, ncvarID, &xtype);
+                if (xtype == NC_BYTE)
+                  {
+                    for (size_t i = 0; i < nvals; ++i)
+                      if (mdata_sp[i] > 127) mdata_sp[i] -= 256;
+                  }
+              }
+          }
+        else
+          {
+            if (mdata_dp == NULL)
+              {
+                mdata_dp = (double *) Malloc(nvals * sizeof(double));
+                memcpy(mdata_dp, pdata_dp, nvals * sizeof(double));
+                pdata_dp = mdata_dp;
+              }
+
+            for (size_t i = 0; i < nvals; ++i) mdata_dp[i] = round(mdata_dp[i]);
+
+            if (dtype == CDI_DATATYPE_UINT8)
+              {
+                nc_type xtype;
+                cdf_inq_vartype(fileID, ncvarID, &xtype);
+                if (xtype == NC_BYTE)
+                  {
+                    for (size_t i = 0; i < nvals; ++i)
+                      if (mdata_dp[i] > 127) mdata_dp[i] -= 256;
+                  }
+              }
+          }
+      }
+
+    if (CDF_Debug)
+      {
+        double fmin = 1.0e200;
+        double fmax = -1.0e200;
+        if (memtype == MEMTYPE_FLOAT)
+          {
+            for (size_t i = 0; i < nvals; ++i)
+              {
+                if (!DBL_IS_EQUAL(pdata_sp[i], (float) missval))
+                  {
+                    if (pdata_sp[i] < fmin) fmin = pdata_sp[i];
+                    if (pdata_sp[i] > fmax) fmax = pdata_sp[i];
+                  }
+              }
+          }
+        else
+          {
+            for (size_t i = 0; i < nvals; ++i)
+              {
+                if (!DBL_IS_EQUAL(pdata_dp[i], missval))
+                  {
+                    if (pdata_dp[i] < fmin) fmin = pdata_dp[i];
+                    if (pdata_dp[i] > fmax) fmax = pdata_dp[i];
+                  }
+              }
+          }
+
+        Message("nvals = %zu, numMissVals = %d, missval = %g, minval = %g, maxval = %g", nvals, numMissVals, missval, fmin, fmax);
+      }
+  }
+
+  if (swapxy)  // implemented only for cdf_write_var_slice()
+    {
+      size_t gridsize = xsize * ysize;
+      if (memtype == MEMTYPE_FLOAT)
+        {
+          sdata_sp = (float *) Malloc(gridsize * sizeof(float));
+          for (size_t j = 0; j < ysize; ++j)
+            for (size_t i = 0; i < xsize; ++i) sdata_sp[i * ysize + j] = pdata_sp[j * xsize + i];
+          pdata_sp = sdata_sp;
+        }
+      else
+        {
+          sdata_dp = (double *) Malloc(gridsize * sizeof(double));
+          for (size_t j = 0; j < ysize; ++j)
+            for (size_t i = 0; i < xsize; ++i) sdata_dp[i * ysize + j] = pdata_dp[j * xsize + i];
+          pdata_dp = sdata_dp;
+        }
+    }
+
+  if (dtype == CDI_DATATYPE_CPX32 || dtype == CDI_DATATYPE_CPX64)
+    {
+      void *pdata = (memtype == MEMTYPE_FLOAT) ? (void *) pdata_sp : (void *) pdata_dp;
+      float *cdata_sp = NULL;
+      double *cdata_dp = NULL;
+      if (memtype == MEMTYPE_FLOAT && dtype == CDI_DATATYPE_CPX64)
+        {
+          cdata_dp = (double *) Malloc(2 * nvals * sizeof(double));
+          for (size_t i = 0; i < nvals; ++i)
+            {
+              cdata_dp[2 * i] = (double) (pdata_sp[2 * i]);
+              cdata_dp[2 * i + 1] = (double) (pdata_sp[2 * i + 1]);
+            }
+          pdata = cdata_dp;
+        }
+      else if (memtype == MEMTYPE_DOUBLE && dtype == CDI_DATATYPE_CPX32)
+        {
+          cdata_sp = (float *) Malloc(2 * nvals * sizeof(float));
+          for (size_t i = 0; i < nvals; ++i)
+            {
+              cdata_sp[2 * i] = (float) (pdata_dp[2 * i]);
+              cdata_sp[2 * i + 1] = (float) (pdata_dp[2 * i + 1]);
+            }
+          pdata = cdata_sp;
+        }
+
+      cdf_put_vara(fileID, ncvarID, start, count, pdata);
+      if (cdata_sp) Free(cdata_sp);
+      if (cdata_dp) Free(cdata_dp);
+    }
+  else
+    {
+      if (memtype == MEMTYPE_FLOAT)
+        cdf_put_vara_float(fileID, ncvarID, start, count, pdata_sp);
+      else
+        cdf_put_vara_double(fileID, ncvarID, start, count, pdata_dp);
+    }
+
+  if (mdata_dp) Free(mdata_dp);
+  if (sdata_dp) Free(sdata_dp);
+  if (mdata_sp) Free(mdata_sp);
+  if (sdata_sp) Free(sdata_sp);
+}
+
+static void
+cdfGetXYZid(stream_t *streamptr, int gridID, int zaxisID, int *xid, int *yid, int *zid)
+{
+  *xid = CDI_UNDEFID;
+  *yid = CDI_UNDEFID;
+
+  int gridtype = gridInqType(gridID);
+  if (gridtype == GRID_TRAJECTORY)
+    {
+      cdfWriteGridTraj(streamptr, gridID);
+    }
+  else
+    {
+      int gridindex = nc_grid_index(streamptr, gridID);
+      *xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
+      if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+    }
+
+  int vlistID = streamptr->vlistID;
+  int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+  *zid = streamptr->zaxisID[zaxisindex];
+}
+
+static void
+cdfDefineStartAndCount(stream_t *streamptr, int varID, int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize,
+                       size_t *ysize)
+{
+  size_t ndims = 0;
+  *xsize = 0;
+  *ysize = 0;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  long ntsteps = streamptr->ntsteps;
+  if (CDI_Debug) Message("ntsteps = %ld", ntsteps);
+
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+
+  if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT)
+    {
+      start[ndims] = (size_t) ntsteps - 1;
+      count[ndims] = 1;
+      ndims++;
+    }
+
+  if (zid != CDI_UNDEFID)
+    {
+      int zaxisID = vlistInqVarZaxis(vlistID, varID);
+      start[ndims] = 0;
+      count[ndims] = (size_t) zaxisInqSize(zaxisID);
+      ndims++;
+    }
+
+  if (yid != CDI_UNDEFID)
+    {
+      start[ndims] = 0;
+      size_t size;
+      cdf_inq_dimlen(fileID, yid, &size);
+      /*      count[ndims] = gridInqYsize(gridID); */
+      count[ndims] = size;
+      ndims++;
+    }
+
+  if (xid != CDI_UNDEFID)
+    {
+      start[ndims] = 0;
+      size_t size;
+      cdf_inq_dimlen(fileID, xid, &size);
+      /*      count[ndims] = gridInqXsize(gridID); */
+      count[ndims] = size;
+      ndims++;
+    }
+
+  if (CDI_Debug)
+    for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d  start = %d  count = %d", idim, start[idim], count[idim]);
+}
+
+void
+cdf_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals)
+{
+  if (streamptr->accessmode == 0) cdfEndDef(streamptr);
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int ncvarID = cdfDefVar(streamptr, varID);
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+  int xid, yid, zid;
+  cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid);
+
+  size_t xsize, ysize;
+  size_t start[5], count[5];
+  cdfDefineStartAndCount(streamptr, varID, xid, yid, zid, start, count, &xsize, &ysize);
+
+  if (streamptr->ncmode == 1)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  int dtype = vlistInqVarDatatype(vlistID, varID);
+
+  if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
+
+  size_t nvals = (size_t) gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID));
+
+  bool swapxy = false;
+  cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
+}
+
+static void
+cdfDefineStartAndCountChunk(stream_t *streamptr, const int rect[][2], int varID, int xid, int yid, int zid, size_t start[5],
+                            size_t count[5], size_t *xsize, size_t *ysize)
+{
+  size_t ndims = 0;
+  *xsize = 0;
+  *ysize = 0;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  long ntsteps = streamptr->ntsteps;
+  if (CDI_Debug) Message("ntsteps = %ld", ntsteps);
+
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+
+  if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT)
+    {
+      start[ndims] = (size_t) ntsteps - 1;
+      count[ndims] = 1;
+      ndims++;
+    }
+
+  if (zid != CDI_UNDEFID)
+    {
+      int zaxisID = vlistInqVarZaxis(vlistID, varID);
+      int size = zaxisInqSize(zaxisID);
+      xassert(rect[2][0] >= 0 && rect[2][0] <= rect[2][1] + 1 && rect[2][1] <= size);
+      start[ndims] = (size_t) rect[2][0];
+      count[ndims] = rect[2][1] < 0 ? (size_t) 0 : (size_t) rect[2][1] - (size_t) rect[2][0] + 1;
+      ndims++;
+    }
+
+  if (yid != CDI_UNDEFID)
+    {
+      size_t size;
+      cdf_inq_dimlen(fileID, yid, &size);
+      xassert(rect[1][0] >= 0 && rect[1][0] <= rect[1][1] + 1 && (rect[1][1] < 0 || (size_t) rect[1][1] <= size));
+      start[ndims] = (size_t) rect[1][0];
+      count[ndims] = rect[1][1] < 0 ? (size_t) 0 : ((size_t) rect[1][1] - (size_t) rect[1][0] + 1);
+      ndims++;
+    }
+
+  if (xid != CDI_UNDEFID)
+    {
+      size_t size;
+      cdf_inq_dimlen(fileID, xid, &size);
+      xassert(rect[0][0] >= 0 && rect[0][0] <= rect[0][1] + 1 && (rect[0][1] < 0 || (size_t) rect[0][1] <= size));
+      start[ndims] = (size_t) rect[0][0];
+      count[ndims] = rect[0][1] < 0 ? (size_t) 0 : (size_t) rect[0][1] - (size_t) rect[0][0] + 1;
+      ndims++;
+    }
+
+  if (CDI_Debug)
+    for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d  start = %d  count = %d", idim, start[idim], count[idim]);
+}
+
+void
+cdf_write_var_chunk(stream_t *streamptr, int varID, int memtype, const int rect[][2], const void *data, size_t numMissVals)
+{
+  if (streamptr->accessmode == 0) cdfEndDef(streamptr);
+
+  int streamID = streamptr->self;
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamID, varID);
+
+  int vlistID = streamInqVlist(streamID);
+  int fileID = streamInqFileID(streamID);
+
+  int ncvarID = cdfDefVar(streamptr, varID);
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+  int xid, yid, zid;
+  cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid);
+
+  size_t xsize, ysize;
+  size_t start[5], count[5];
+  cdfDefineStartAndCountChunk(streamptr, rect, varID, xid, yid, zid, start, count, &xsize, &ysize);
+
+  if (streamptr->ncmode == 1)
+    {
+      cdf_enddef(fileID, streamptr->self);
+      streamptr->ncmode = 2;
+    }
+
+  int dtype = vlistInqVarDatatype(vlistID, varID);
+
+  if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
+
+  size_t nvals = (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID);
+
+  bool swapxy = false;
+  cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
+}
+
+static void
+cdfDefineStartAndCountSlice(stream_t *streamptr, int varID, int levelID, int dimorder[3], int xid, int yid, int zid,
+                            size_t start[5], size_t count[5], size_t *xsize, size_t *ysize)
+{
+  size_t ndims = 0;
+  *xsize = 0;
+  *ysize = 0;
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  long ntsteps = streamptr->ntsteps;
+  if (CDI_Debug) Message("ntsteps = %ld", ntsteps);
+
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+
+  if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT)
+    {
+      start[ndims] = (size_t) ntsteps - 1;
+      count[ndims] = 1;
+      ndims++;
+    }
+
+  for (int id = 0; id < 3; ++id)
+    {
+      if (dimorder[id] == 3 && zid != CDI_UNDEFID)
+        {
+          start[ndims] = (size_t) levelID;
+          count[ndims] = 1;
+          ndims++;
+        }
+      else if (dimorder[id] == 2 && yid != CDI_UNDEFID)
+        {
+          start[ndims] = 0;
+          cdf_inq_dimlen(fileID, yid, ysize);
+          count[ndims] = *ysize;
+          ndims++;
+        }
+      else if (dimorder[id] == 1 && xid != CDI_UNDEFID)
+        {
+          start[ndims] = 0;
+          cdf_inq_dimlen(fileID, xid, xsize);
+          count[ndims] = *xsize;
+          ndims++;
+        }
+    }
+
+  if (CDI_Debug)
+    for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d  start = %d  count = %d", idim, start[idim], count[idim]);
+}
+
+void
+cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals)
+{
+  if (streamptr->accessmode == 0) cdfEndDef(streamptr);
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int ncvarID = cdfDefVar(streamptr, varID);
+
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+
+  int xid, yid, zid;
+  cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid);
+
+  int dimorder[3];
+  vlistInqVarDimorder(vlistID, varID, dimorder);
+  bool swapxy = (dimorder[2] == 2 || dimorder[0] == 1) && xid != CDI_UNDEFID && yid != CDI_UNDEFID;
+
+  size_t xsize, ysize;
+  size_t start[5], count[5];
+  cdfDefineStartAndCountSlice(streamptr, varID, levelID, dimorder, xid, yid, zid, start, count, &xsize, &ysize);
+
+  int dtype = vlistInqVarDatatype(vlistID, varID);
+
+  if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1);
+
+  size_t nvals = (size_t) gridInqSize(gridID);
+
+  cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals);
+}
+
+void
+cdf_write_record(stream_t *streamptr, int memtype, const void *data, size_t numMissVals)
+{
+  int varID = streamptr->record->varID;
+  int levelID = streamptr->record->levelID;
+  cdf_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals);
+}
+
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#ifdef HAVE_LIBNETCDF
+
+#include <limits.h>
+#include <float.h>
+
+
+static void
+cdfReadGridTraj(stream_t *streamptr, int gridID)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+
+  int gridindex = vlistGridIndex(vlistID, gridID);
+  int ncLonId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_X];
+  int ncLatId = streamptr->ncgrid[gridindex].ncIDs[CDF_VARID_Y];
+
+  int tsID = streamptr->curTsID;
+  size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
+
+  double xlon, xlat;
+  cdf_get_var1_double(fileID, ncLonId, &ncStepIndex, &xlon);
+  cdf_get_var1_double(fileID, ncLatId, &ncStepIndex, &xlat);
+
+  gridDefXvals(gridID, &xlon);
+  gridDefYvals(gridID, &xlat);
+}
+
+static void
+cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENSIONS], size_t (*count)[MAX_DIMENSIONS])
+{
+  int vlistID = streamptr->vlistID;
+  int tsID = streamptr->curTsID;
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+  int gridindex = vlistGridIndex(vlistID, gridID);
+  size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
+
+  int xid = CDI_UNDEFID, yid = CDI_UNDEFID;
+  if (gridInqType(gridID) == GRID_TRAJECTORY)
+    {
+      cdfReadGridTraj(streamptr, gridID);
+    }
+  else
+    {
+      xid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_X];
+      yid = streamptr->ncgrid[gridindex].ncIDs[CDF_DIMID_Y];
+    }
+  int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+  int zid = streamptr->zaxisID[zaxisindex];
+
+  int ndims = 0;
+#define addDimension(startCoord, length) \
+  do                                     \
+    {                                    \
+      (*start)[ndims] = startCoord;      \
+      (*count)[ndims] = length;          \
+      ndims++;                           \
+    }                                    \
+  while (0)
+  if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1);
+  if (zid != CDI_UNDEFID) addDimension(0, (size_t) zaxisInqSize(zaxisID));
+  if (yid != CDI_UNDEFID) addDimension(0, (size_t) gridInqYsize(gridID));
+  if (xid != CDI_UNDEFID) addDimension(0, (size_t) gridInqXsize(gridID));
+#undef addDimension
+
+  assert(ndims <= (int) (sizeof(*start) / sizeof(**start)));
+  assert(ndims <= (int) (sizeof(*count) / sizeof(**count)));
+
+  if (CDI_Debug)
+    for (int idim = 0; idim < ndims; ++idim) Message("dim = %d  start = %d  count = %d", idim, start[idim], count[idim]);
+}
+
+// Scans the data array for missVals, optionally applying first a scale factor and then an offset.
+// Returns the number of missing + out-of-range values encountered.
+static size_t
+cdfDoInputDataTransformationDP(int vlistID, int varID, size_t valueCount, double *data)
+{
+  double missVal = vlistInqVarMissval(vlistID, varID);
+  int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID);
+  double validRange[2];
+  if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX;
+  double addoffset = 0.0, scalefactor = 1.0;
+  int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
+  int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
+
+  bool missValIsNaN = DBL_IS_NAN(missVal);
+  size_t missValCount = 0;
+
+  double validMin = validRange[0];
+  double validMax = validRange[1];
+  if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN;
+  if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX;
+
+  int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN));
+  assert(!haveRangeCheck || haveMissVal);
+
+  switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3))
+    {
+    case 15:  // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor + addoffset;
+        }
+      break;
+    case 13:  // haveRangeCheck & haveMissVal & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] + addoffset;
+        }
+      break;
+    case 11:  // haveRangeCheck & haveMissVal & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor;
+        }
+      break;
+    case 9:  // haveRangeCheck & haveMissVal
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? missVal : data[i];
+        }
+      break;
+    case 7:  // haveMissVal & haveScalefactor & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] = data[i] * scalefactor + addoffset;
+      break;
+    case 6:  // haveAddoffset & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i) data[i] = data[i] * scalefactor + addoffset;
+      break;
+    case 5:  // haveMissVal & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] += addoffset;
+      break;
+    case 4:  // haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i) data[i] += addoffset;
+      break;
+    case 3:  // haveMissVal & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] *= scalefactor;
+      break;
+    case 2:  // haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i) data[i] *= scalefactor;
+      break;
+    case 1:  // haveMissVal
+      if (missValIsNaN)
+        {
+          for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]);
+        }
+      else
+        {
+          for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal);
+        }
+      break;
+    }
+
+  return missValCount;
+}
+
+static size_t
+cdfDoInputDataTransformationSP(int vlistID, int varID, size_t valueCount, float *data)
+{
+  double missVal = vlistInqVarMissval(vlistID, varID);
+  int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID);
+  double validRange[2];
+  if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX;
+  double addoffset = 0.0, scalefactor = 1.0;
+  int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR);
+  int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR);
+
+  bool missValIsNaN = DBL_IS_NAN(missVal);
+  size_t missValCount = 0;
+
+  double validMin = validRange[0];
+  double validMax = validRange[1];
+  if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN;
+  if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX;
+
+  int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN));
+  assert(!haveRangeCheck || haveMissVal);
+
+  switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3))
+    {
+    case 15:  // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor + addoffset);
+        }
+      break;
+    case 13:  // haveRangeCheck & haveMissVal & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] + addoffset);
+        }
+      break;
+    case 11:  // haveRangeCheck & haveMissVal & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor);
+        }
+      break;
+    case 9:  // haveRangeCheck & haveMissVal
+      for (size_t i = 0; i < valueCount; ++i)
+        {
+          int outOfRange = (data[i] < validMin || data[i] > validMax);
+          int isMissVal = DBL_IS_EQUAL(data[i], missVal);
+          missValCount += (size_t) (outOfRange | isMissVal);
+          data[i] = outOfRange ? (float) missVal : data[i];
+        }
+      break;
+    case 7:  // haveMissVal & haveScalefactor & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] = (float) (data[i] * scalefactor + addoffset);
+      break;
+    case 6:  // haveAddoffset & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor + addoffset);
+      break;
+    case 5:  // haveMissVal & haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] = (float) (data[i] + addoffset);
+      break;
+    case 4:  // haveAddoffset
+      for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] + addoffset);
+      break;
+    case 3:  // haveMissVal & haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i)
+        if (DBL_IS_EQUAL(data[i], missVal))
+          missValCount++;
+        else
+          data[i] = (float) (data[i] * scalefactor);
+      break;
+    case 2:  // haveScalefactor
+      for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor);
+      break;
+    case 1:  // haveMissVal
+      if (missValIsNaN)
+        {
+          for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]);
+        }
+      else
+        {
+          for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal);
+        }
+      break;
+    }
+
+  return missValCount;
+}
+
+static size_t
+min_size(size_t a, size_t b)
+{
+  return a < b ? a : b;
+}
+
+static void
+transpose2dArrayDP(int gridId, double *data)
+{
+  size_t inWidth = (size_t) gridInqYsize(gridId);
+  size_t inHeight = (size_t) gridInqXsize(gridId);
+
+  size_t cacheBlockSize = 256;  // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks,
+                                // which should be a decent compromise on many architectures.
+  double **out = (double **) malloc(inWidth * sizeof(double *));
+  double **temp = (double **) malloc(inHeight * sizeof(double *));
+  temp[0] = (double *) malloc(inHeight * inWidth * sizeof(double));
+  memcpy(temp[0], data, inHeight * inWidth * sizeof(double));
+  for (size_t i = 0; i < inWidth; ++i) out[i] = data + (inHeight * i);
+  for (size_t i = 1; i < inHeight; ++i) temp[i] = temp[0] + (inWidth * i);
+
+  /*
+  for (size_t y = 0; y < inHeight; ++y)
+    for (size_t x = 0; x < inWidth; ++x)
+      out[x][y] = temp[y][x];
+  */
+
+  for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize)
+    for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize)
+      for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++)
+        for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++)
+          {
+            out[x][y] = temp[y][x];
+          }
+
+  free(out);
+  free(temp[0]);
+  free(temp);
+}
+
+static void
+transpose2dArraySP(int gridId, float *data)
+{
+  size_t inWidth = (size_t) gridInqYsize(gridId);
+  size_t inHeight = (size_t) gridInqXsize(gridId);
+
+  size_t cacheBlockSize = 256;  // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks,
+                                // which should be a decent compromise on many architectures.
+  float **out = (float **) malloc(inWidth * sizeof(float *));
+  float **temp = (float **) malloc(inHeight * sizeof(float *));
+  temp[0] = (float *) malloc(inHeight * inWidth * sizeof(float));
+  memcpy(temp[0], data, inHeight * inWidth * sizeof(float));
+  for (size_t i = 0; i < inWidth; i++) out[i] = data + (inHeight * i);
+  for (size_t i = 1; i < inHeight; i++) temp[i] = temp[0] + (inWidth * i);
+
+  /*
+  for (size_t y = 0; y < inHeight; ++y)
+    for (size_t x = 0; x < inWidth; ++x)
+      out[x][y] = temp[y][x];
+  */
+
+  for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize)
+    for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize)
+      for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++)
+        for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++)
+          {
+            out[x][y] = temp[y][x];
+          }
+
+  free(out);
+  free(temp[0]);
+  free(temp);
+}
+
+static void
+cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4])
+{
+  int vlistID = streamptr->vlistID;
+  int gridId = vlistInqVarGrid(vlistID, varId);
+  int gridindex = vlistGridIndex(vlistID, gridId);
+  const int *ncIDs = streamptr->ncgrid[gridindex].ncIDs;
+
+  switch (gridInqType(gridId))
+    {
+    case GRID_TRAJECTORY: cdfReadGridTraj(streamptr, gridId); break;
+    case GRID_UNSTRUCTURED:
+      (*outDimIds)[0] = ncIDs[CDF_DIMID_X];
+      (*outDimIds)[3] = ncIDs[CDF_DIMID_E];                                      // used only for cube_sphere grids
+      if ((*outDimIds)[3] != CDI_UNDEFID) (*outDimIds)[1] = ncIDs[CDF_DIMID_Y];  // used only for cube_sphere grids
+      break;
+    case GRID_GAUSSIAN_REDUCED: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; break;
+    default:
+      (*outDimIds)[0] = ncIDs[CDF_DIMID_X];
+      (*outDimIds)[1] = ncIDs[CDF_DIMID_Y];
+      break;
+    }
+
+  int zaxisID = vlistInqVarZaxis(vlistID, varId);
+  int zaxisindex = vlistZaxisIndex(vlistID, zaxisID);
+  (*outDimIds)[2] = streamptr->zaxisID[zaxisindex];
+}
+
+static size_t
+stream_inq_dimlen(stream_t *streamptr, int dimid)
+{
+  int ndims = streamptr->ncNumDims;
+  int *ncdimid = streamptr->ncDimID;
+  size_t *ncdimlen = streamptr->ncDimLen;
+  for (int i = 0; i < ndims; ++i)
+    {
+      if (dimid == ncdimid[i]) return ncdimlen[i];
+    }
+
+  size_t size = 0;
+  int fileId = streamptr->fileID;
+  cdf_inq_dimlen(fileId, dimid, &size);
+  return size;
+}
+
+static int
+stream_get_skip_dim(stream_t *streamptr, int ncvarid, int dimIds[3])
+{
+  if (dimIds[0] != CDI_UNDEFID || dimIds[1] != CDI_UNDEFID) return 0;
+
+  int fileId = streamptr->fileID;
+  int nvdims;
+  cdf_inq_varndims(fileId, ncvarid, &nvdims);
+  if (nvdims != 3) return 0;
+
+  int varDimIds[3] = { -1, -1, -1 };
+  cdf_inq_vardimid(fileId, ncvarid, varDimIds);
+
+  if (dimIds[2] == varDimIds[2])
+    {
+      if (stream_inq_dimlen(streamptr, varDimIds[1]) == 1) return 1;
+    }
+  else if (dimIds[2] == varDimIds[1])
+    {
+      if (stream_inq_dimlen(streamptr, varDimIds[2]) == 1) return 2;
+    }
+
+  return 0;
+}
+
+enum
+{
+  cdfSliceNDim = MAX_DIMENSIONS
+};
+
+static void
+cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelID, bool *outSwapXY, size_t start[cdfSliceNDim],
+                           size_t count[cdfSliceNDim])
+{
+  int fileId = streamptr->fileID;
+  int vlistID = streamptr->vlistID;
+  int ncvarid = streamptr->vars[varID].ncvarid;
+  size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex;
+
+  int gridId = vlistInqVarGrid(vlistID, varID);
+  int timetype = vlistInqVarTimetype(vlistID, varID);
+  SizeType gridsize = gridInqSize(gridId);
+
+  streamptr->numvals += gridsize;
+
+  int dimIds[4] = { -1, -1, -1, -1 };  // this array joins the old variables xid, yid, and zid
+  cdf_inq_dimIds(streamptr, varID, &dimIds);
+
+  int skipdim = stream_get_skip_dim(streamptr, ncvarid, dimIds);
+
+  int dimorder[4] = { 3, 4, 2, 1 };  // order of cube sphere grid
+  if (dimIds[3] == CDI_UNDEFID)
+    {
+      int tmpdimorder[3];
+      vlistInqVarDimorder(vlistID, varID, tmpdimorder);
+      for (int i = 0; i < 3; ++i) dimorder[i] = tmpdimorder[i];
+      dimorder[3] = 4;
+      *outSwapXY = ((dimorder[2] == 2 || dimorder[0] == 1) && (dimIds[0] != CDI_UNDEFID) && (dimIds[1] != CDI_UNDEFID));
+    }
+
+  int ndims = 0;
+
+#define addDimension(startIndex, extent) \
+  do                                     \
+    {                                    \
+      start[ndims] = startIndex;         \
+      count[ndims] = extent;             \
+      ndims++;                           \
+    }                                    \
+  while (0)
+
+  if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1);
+  if (skipdim == 1) addDimension(0, 1);
+
+  int gridindex = vlistGridIndex(vlistID, gridId);
+  const ncgrid_t *ncGrid = &streamptr->ncgrid[gridindex];
+  bool readPart = (ncGrid->gridID == gridId && ncGrid->start != -1 && ncGrid->count != -1);
+
+  for (int id = 0; id < 4; ++id)
+    {
+      int curDimId = dimIds[dimorder[id] - 1];
+      if (curDimId == CDI_UNDEFID) continue;
+      switch (dimorder[id])
+        {
+        case 1:
+        case 2:
+        case 4:
+          if (readPart && curDimId == dimIds[0])
+            addDimension((size_t) ncGrid->start, (size_t) ncGrid->count);
+          else
+            addDimension(0, stream_inq_dimlen(streamptr, curDimId));
+          break;
+        case 3: addDimension((size_t) levelID, 1); break;
+        default: Error("Internal errror: Malformed dimension order encountered. Please report this bug.");
+        }
+    }
+
+  if (skipdim == 2) addDimension(0, 1);
+
+  assert(ndims <= cdfSliceNDim);
+
+#undef addDimension
+
+  if (CDI_Debug)
+    for (int idim = 0; idim < ndims; ++idim) Message("dim = %d  start = %zu  count = %zu", idim, start[idim], count[idim]);
+
+  int nvdims;
+  cdf_inq_varndims(fileId, ncvarid, &nvdims);
+
+  if (nvdims != ndims)
+    {
+      char name[CDI_MAX_NAME];
+      vlistInqVarName(vlistID, varID, name);
+      Error("Internal error, variable %s has an unsupported array structure!", name);
+    }
+}
+
+static size_t
+getSizeVar3D(int vlistID, int varID)
+{
+  int gridID = vlistInqVarGrid(vlistID, varID);
+  int zaxisID = vlistInqVarZaxis(vlistID, varID);
+  return (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID);
+}
+
+static void
+cdfReadDataSliceSP2DP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+                      double *data)
+{
+  float *data_fp = (float *) Malloc(length * sizeof(*data_fp));
+  cdf_get_vara_float(fileID, ncvarid, start, count, data_fp);
+  for (size_t i = 0; i < length; ++i) data[i] = (double) data_fp[i];
+  Free(data_fp);
+}
+
+static void
+cdfReadDataSliceDP2SP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+                      float *data)
+{
+  double *data_dp = (double *) Malloc(length * sizeof(*data_dp));
+  cdf_get_vara_double(fileID, ncvarid, start, count, data_dp);
+  for (size_t i = 0; i < length; ++i) data[i] = (float) data_dp[i];
+  Free(data_dp);
+}
+
+static void
+cdfCheckDataFP64_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data)
+{
+  if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8)
+    {
+      nc_type xtype;
+      cdf_inq_vartype(fileID, ncvarid, &xtype);
+      if (xtype == NC_BYTE)
+        {
+          for (size_t i = 0; i < length; ++i)
+            if (data[i] < 0) data[i] += 256;
+        }
+    }
+}
+
+static void
+cdfCheckDataFP32_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data)
+{
+  if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8)
+    {
+      nc_type xtype;
+      cdf_inq_vartype(fileID, ncvarid, &xtype);
+      if (xtype == NC_BYTE)
+        {
+          for (size_t i = 0; i < length; ++i)
+            if (data[i] < 0) data[i] += 256;
+        }
+    }
+}
+
+static void
+cdfReadDataFP64(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+                double *data)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int ncvarid = streamptr->vars[varID].ncvarid;
+  int datatype = vlistInqVarDatatype(vlistID, varID);
+
+  if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64)
+    {
+      cdf_get_vara(fileID, ncvarid, start, count, data);
+      if (datatype == CDI_DATATYPE_CPX32)
+        {
+          for (long i = (long) length - 1; i >= 0; --i)
+            {
+              data[2 * i] = (double) (((float *) data)[2 * i]);
+              data[2 * i + 1] = (double) (((float *) data)[2 * i + 1]);
+            }
+        }
+    }
+  else
+    {
+      if (datatype == CDI_DATATYPE_FLT32)
+        {
+          cdfReadDataSliceSP2DP(fileID, ncvarid, length, start, count, data);
+        }
+      else
+        {
+          cdf_get_vara_double(fileID, ncvarid, start, count, data);
+
+          cdfCheckDataFP64_UINT8(fileID, ncvarid, vlistID, varID, length, data);
+        }
+    }
+}
+
+static void
+cdfReadDataFP32(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS],
+                float *data)
+{
+  int vlistID = streamptr->vlistID;
+  int fileID = streamptr->fileID;
+  int ncvarid = streamptr->vars[varID].ncvarid;
+  int datatype = vlistInqVarDatatype(vlistID, varID);
+
+  if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64)
+    {
+      if (datatype == CDI_DATATYPE_CPX64)
+        {
+          double *cdata = (double *) Malloc(2 * length * sizeof(double));
+          cdf_get_vara(fileID, ncvarid, start, count, cdata);
+          for (size_t i = 0; i < length; ++i)
+            {
+              data[2 * i] = (float) (cdata[2 * i]);
+              data[2 * i + 1] = (float) (cdata[2 * i + 1]);
+            }
+          Free(cdata);
+        }
+      else
+        {
+          cdf_get_vara(fileID, ncvarid, start, count, data);
+        }
+    }
+  else
+    {
+      if (datatype == CDI_DATATYPE_FLT64)
+        {
+          cdfReadDataSliceDP2SP(fileID, ncvarid, length, start, count, data);
+        }
+      else
+        {
+          cdf_get_vara_float(fileID, ncvarid, start, count, data);
+
+          cdfCheckDataFP32_UINT8(fileID, ncvarid, vlistID, varID, length, data);
+        }
+    }
+}
+
+static void
+cdfReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+
+  size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS];
+  cdfGetSlapDescription(streamptr, varID, &start, &count);
+
+  size_t length = getSizeVar3D(vlistID, varID);
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
+
+  *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data);
+}
+
+static void
+cdfReadVarSP(stream_t *streamptr, int varID, float *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+
+  size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS];
+  cdfGetSlapDescription(streamptr, varID, &start, &count);
+
+  size_t length = getSizeVar3D(vlistID, varID);
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
+
+  *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data);
+}
+
+void
+cdf_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    cdfReadVarDP(streamptr, varID, (double *) data, numMissVals);
+  else
+    cdfReadVarSP(streamptr, varID, (float *) data, numMissVals);
+}
+
+static void
+cdf_read_var_slice_DP(stream_t *streamptr, long tsID, int varID, int levelID, double *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID=%d  tsID=%ld varID=%d  levelID=%d", streamptr->self, tsID, varID, levelID);
+
+  bool swapxy = false;
+  size_t start[cdfSliceNDim], count[cdfSliceNDim];
+  cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count);
+
+  int vlistID = streamptr->vlistID;
+  int gridId = vlistInqVarGrid(vlistID, varID);
+  size_t length = (size_t) gridInqSize(gridId);
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
+
+  if (swapxy) transpose2dArrayDP(gridId, data);
+
+  *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data);
+}
+
+static void
+cdfReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals)
+{
+  cdf_read_var_slice_DP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals);
+}
+
+static void
+cdf_read_var_slice_SP(stream_t *streamptr, long tsID, int varID, int levelID, float *data, size_t *numMissVals)
+{
+  if (CDI_Debug) Message("streamID=%d  tsID=%ld varID=%d  levelID=%d", streamptr->self, tsID, varID, levelID);
+
+  bool swapxy = false;
+  size_t start[cdfSliceNDim], count[cdfSliceNDim];
+  cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count);
+
+  int vlistID = streamptr->vlistID;
+  int gridId = vlistInqVarGrid(vlistID, varID);
+  size_t length = (size_t) gridInqSize(gridId);
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
+
+  if (swapxy) transpose2dArraySP(gridId, data);
+
+  *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data);
+}
+
+static void
+cdfReadVarSliceSP(stream_t *streamptr, int varID, int levelID, float *data, size_t *numMissVals)
+{
+  cdf_read_var_slice_SP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals);
+}
+
+void
+cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals)
+{
+  if (memtype == MEMTYPE_DOUBLE)
+    cdfReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals);
+  else
+    cdfReadVarSliceSP(streamptr, varID, levelID, (float *) data, numMissVals);
+}
+
+typedef struct JobArgsCDF
+{
+  stream_t *streamptr;
+  int varID, levelID, memtype;
+  long recID, tsID;
+  void *data;
+  size_t gridsize, numMissVals;
+} JobArgsCDF;
+
+static int
+cdf_read_data_async(void *untypedArgs)
+{
+  JobArgsCDF *args = (JobArgsCDF *) untypedArgs;
+
+  if (args->memtype == MEMTYPE_DOUBLE)
+    cdf_read_var_slice_DP(args->streamptr, args->tsID, args->varID, args->levelID, (double *) args->data, &args->numMissVals);
+  else
+    cdf_read_var_slice_SP(args->streamptr, args->tsID, args->varID, args->levelID, (float *) args->data, &args->numMissVals);
+
+  return 0;
+}
+
+static size_t
+cdf_read_data(stream_t *streamptr, int recID, int memtype, void *data)
+{
+  int tsID = streamptr->curTsID;
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  int levelID = streamptr->tsteps[tsID].records[recID].levelID;
+
+  size_t numMissVals = 0;
+  if (memtype == MEMTYPE_DOUBLE)
+    cdf_read_var_slice_DP(streamptr, tsID, varID, levelID, (double *) data, &numMissVals);
+  else
+    cdf_read_var_slice_SP(streamptr, tsID, varID, levelID, (float *) data, &numMissVals);
+
+  return numMissVals;
+}
+
+typedef struct JobDescriptorCDF
+{
+  JobArgsCDF args;
+  AsyncJob *job;
+} JobDescriptorCDF;
+
+static JobArgsCDF
+job_args_init(stream_t *streamptr, long tsID, long recID, int memtype, void *data)
+{
+  int varID = streamptr->tsteps[tsID].records[recID].varID;
+  int levelID = streamptr->tsteps[tsID].records[recID].levelID;
+  size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(streamptr->vlistID, varID));
+
+  if (!data) data = Malloc(gridsize * ((memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double)));
+
+  return (JobArgsCDF){
+    .streamptr = streamptr,
+    .varID = varID,
+    .levelID = levelID,
+    .memtype = memtype,
+    .recID = recID,
+    .tsID = tsID,
+    .data = data,
+    .gridsize = gridsize,
+    .numMissVals = 0,
+  };
+}
+
+static void
+JobDescriptor_startJobCDF(AsyncManager *jobManager, JobDescriptorCDF *me, stream_t *streamptr, long tsID, long recID, int memtype)
+{
+  me->args = job_args_init(streamptr, tsID, recID, memtype, NULL);
+  me->job = AsyncWorker_requestWork(jobManager, cdf_read_data_async, &me->args);
+  if (!me->job) xabort("error while trying to send job to worker thread");
+}
+
+static void
+cdf_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorCDF *me, void *data, size_t *numMissVals)
+{
+  if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread");
+  memcpy(data, me->args.data, me->args.gridsize * ((me->args.memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double)));
+  *numMissVals = me->args.numMissVals;
+
+  Free(me->args.data);
+  me->args.recID = -1;  // mark as inactive
+  me->args.tsID = -1;   // mark as inactive
+}
+/*
+static long
+get_global_recId(stream_t *streamptr, int tsID, int recID)
+{
+  const tsteps_t *tsteps = streamptr->tsteps;
+  long globalRecId = recID;
+  if (tsID > 0) globalRecId += tsteps[0].nrecs;
+  if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1);
+  return globalRecId;
+}
+*/
+
+struct recTsId
+{
+  long recID, tsID;
+};
+
+static struct recTsId
+cdf_get_local_step_and_recId(stream_t *streamptr, long globalRecId)
+{
+  int localTsId = 0;
+  long numSteps = streamptr->ntsteps;
+  const tsteps_t *tsteps = streamptr->tsteps;
+  if (numSteps > 0 && globalRecId >= tsteps[0].nrecs)
+    {
+      localTsId++;
+      globalRecId -= tsteps[0].nrecs;
+    }
+  while (globalRecId >= tsteps[1].nrecs)
+    {
+      localTsId++;
+      globalRecId -= tsteps[1].nrecs;
+    }
+
+  return (struct recTsId){ .recID = globalRecId, .tsID = localTsId };
+}
+
+static void
+cdf_read_next_record_async(AsyncManager *jobManager, JobDescriptorCDF *jd, stream_t *streamptr, int memtype)
+{
+  struct recTsId ids = cdf_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId);
+  int xRecId = streamptr->tsteps[ids.tsID].recIDs[ids.recID];
+  JobDescriptor_startJobCDF(jobManager, jd, streamptr, ids.tsID, xRecId, memtype);
+  streamptr->nextGlobalRecId++;
+}
+
+static void
+cdf_read_next_record(stream_t *streamptr, int recID, int memtype, void *data, size_t *numMissVals)
+{
+  bool jobFound = false;
+
+  int workerCount = streamptr->numWorker;
+  if (workerCount > 0)
+    {
+      int tsID = streamptr->curTsID;
+
+      AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager;
+      JobDescriptorCDF *jobs = (JobDescriptorCDF *) streamptr->jobs;
+
+      // if this is the first call, init and start worker threads
+      if (!jobs)
+        {
+          jobs = (JobDescriptorCDF *) Malloc((size_t) workerCount * sizeof(*jobs));
+          streamptr->jobs = jobs;
+          for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1;
+          for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1;
+          if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads");
+          streamptr->jobManager = jobManager;
+
+          // Start as many new jobs as possible.
+          for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++)
+            if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0)
+              cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype);
+        }
+
+      // search for a job descriptor with the given tsID and recID, and use its results if it exists
+      for (int i = 0; !jobFound && i < workerCount; i++)
+        if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID)
+          {
+            jobFound = true;
+            cdf_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals);
+            if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs)
+              cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype);
+          }
+    }
+
+  // perform the work synchronously if we didn't start a job for it yet
+  if (!jobFound) *numMissVals = cdf_read_data(streamptr, recID, memtype, data);
+}
+
+void
+cdf_read_record(stream_t *streamptr, int memtype, void *data, size_t *numMissVals)
+{
+  int tsID = streamptr->curTsID;
+  int vrecID = streamptr->tsteps[tsID].curRecID;
+  int recID = streamptr->tsteps[tsID].recIDs[vrecID];
+
+  cdf_read_next_record(streamptr, recID, memtype, data, numMissVals);
+}
+
+//----------------------------------------------------------------------------
+// Parallel Version
+//----------------------------------------------------------------------------
+
+void
+cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, double *data,
+                      size_t *numMissVals)
+{
+  (void) (varType);
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levelID = %d", streamptr->self, varID, levelID);
+
+  int vlistID = streamptr->vlistID;
+
+  bool swapxy = false;
+  size_t start[cdfSliceNDim], count[cdfSliceNDim];
+  cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count);
+
+  int gridId = vlistInqVarGrid(vlistID, varID);
+  SizeType gridsize = gridInqSize(gridId);
+
+  int position = 0;
+  for (int i = 0; i < MAX_DIMENSIONS; ++i)
+    if (count[i] == (size_t) gridsize) position = i;
+
+  start[position] += (size_t) startpoint;
+  count[position] = length;
+
+  cdfReadDataFP64(streamptr, varID, length, start, count, data);
+
+  if (swapxy) transpose2dArrayDP(gridId, data);
+
+  *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data);
+}
+
+void
+cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, float *data,
+                      size_t *numMissVals)
+{
+  (void) (varType);
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d  levelID = %d", streamptr->self, varID, levelID);
+
+  int vlistID = streamptr->vlistID;
+
+  bool swapxy = false;
+  size_t start[cdfSliceNDim], count[cdfSliceNDim];
+  cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count);
+
+  int gridId = vlistInqVarGrid(vlistID, varID);
+  SizeType gridsize = gridInqSize(gridId);
+
+  int position = 0;
+  for (int i = 0; i < MAX_DIMENSIONS; ++i)
+    if (count[i] == (size_t) gridsize) position = i;
+
+  start[position] += (size_t) startpoint;
+  count[position] = length;
+
+  cdfReadDataFP32(streamptr, varID, length, start, count, data);
+
+  if (swapxy) transpose2dArraySP(gridId, data);
+
+  *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data);
+}
+
+static int
+cdiStreamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, size_t size, int memtype, void *data,
+                          size_t *numMissVals)
+{
+  int status = 0;
+
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamID, varID);
+
+  check_parg(data);
+  check_parg(numMissVals);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  int filetype = streamptr->filetype;
+
+  *numMissVals = 0;
+
+  // currently we only care for netcdf data
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB:
+      {
+        grb_read_var_slice(streamptr, varID, levelID, memtype, data, numMissVals);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+      {
+        if (memtype == MEMTYPE_FLOAT)
+          cdfReadVarSliceSPPart(streamptr, varID, levelID, varType, start, size, (float *) data, numMissVals);
+        else
+          cdfReadVarSliceDPPart(streamptr, varID, levelID, varType, start, size, (double *) data, numMissVals);
+        break;
+      }
+#endif
+    default:
+      {
+        Error("%s support not compiled in!", strfiletype(filetype));
+        status = 2;
+        break;
+      }
+    }
+
+  return status;
+}
+
+void
+cdfReadVarDPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, double *data, size_t *numMissVals)
+{
+  (void) (varType);
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  int ncvarid = streamptr->vars[varID].ncvarid;
+
+  size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS];
+  cdfGetSlapDescription(streamptr, varID, &start, &count);
+
+  int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID));
+  start[1 + ltime] += (size_t) startpoint;
+  count[1 + ltime] = length;
+
+  cdf_get_vara_double(streamptr->fileID, ncvarid, start, count, data);
+
+  *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data);
+}
+
+void
+cdfReadVarSPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, float *data, size_t *numMissVals)
+{
+  (void) (varType);
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamptr->self, varID);
+
+  int vlistID = streamptr->vlistID;
+  int ncvarid = streamptr->vars[varID].ncvarid;
+
+  size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS];
+  cdfGetSlapDescription(streamptr, varID, &start, &count);
+
+  int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID));
+  start[1 + ltime] = (size_t) startpoint;
+  count[1 + ltime] = length;
+
+  cdf_get_vara_float(streamptr->fileID, ncvarid, start, count, data);
+
+  *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data);
+}
+
+static void
+cdiStreamReadVarPart(int streamID, int varID, int varType, int start, size_t size, int memtype, void *data, size_t *numMissVals)
+{
+  (void) (varType);
+  if (CDI_Debug) Message("streamID = %d  varID = %d", streamID, varID);
+
+  check_parg(data);
+  check_parg(numMissVals);
+
+  stream_t *streamptr = stream_to_pointer(streamID);
+  int filetype = streamptr->filetype;
+
+  *numMissVals = 0;
+
+  // currently we only care for netcdf data
+  switch (cdiBaseFiletype(filetype))
+    {
+#ifdef HAVE_LIBGRIB
+    case CDI_FILETYPE_GRIB:
+      {
+        grb_read_var(streamptr, varID, memtype, data, numMissVals);
+        break;
+      }
+#endif
+#ifdef HAVE_LIBNETCDF
+    case CDI_FILETYPE_NETCDF:
+      {
+        if (memtype == MEMTYPE_FLOAT)
+          cdfReadVarSPPart(streamptr, varID, varType, start, size, (float *) data, numMissVals);
+        else
+          cdfReadVarDPPart(streamptr, varID, varType, start, size, (double *) data, numMissVals);
+
+        break;
+      }
+#endif
+    default:
+      {
+        Error("%s support not compiled in!", strfiletype(filetype));
+        break;
+      }
+    }
+}
+
+void
+streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data,
+                       SizeType *numMissVals, int memtype)
+{
+  size_t numMiss = 0;
+  if (cdiStreamReadVarSlicePart(streamID, varID, levelID, varType, start, (size_t) size, memtype, data, &numMiss))
+    {
+      Error("Unexpected error returned from cdiStreamReadVarSlicePart()!");
+    }
+  *numMissVals = (SizeType) numMiss;
+}
+
+void
+streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memtype)
+{
+  size_t numMiss = 0;
+  cdiStreamReadVarPart(streamID, varID, varType, start, (size_t) size, memtype, data, &numMiss);
+  *numMissVals = (SizeType) numMiss;
+}
+
+#endif /* HAVE_LIBNETCDF */
+/* Subroutines and data structures for storing "subtypes".             */
+/*                                                                     */
+/* A subtype is, for example, a list of TILES. This can be interpreted */
+/* as an additional axis like the vertical axis.                       */
+/*                                                                     */
+/* @author 02/2015 F. Prill, DWD                                       */
+/*                                                                     */
+/*  DATA LAYOUT:                                                       */
+/*                                                                     */
+/*  A subtype contains several "subtype entries", each of which        */
+/*  contains a linked list of subtype attributes.                      */
+/*                                                                     */
+/*  The number of subtype entries is not specified in advance, but the */
+/*  list of entries is itself dynamically growing. There is no         */
+/*  guaranteed ordering of the entries, therefore each entry must be   */
+/*  identifiable by its attributes.                                    */
+/*                                                                     */
+/*  [subtype_t]                                                        */
+/*      |                                                              */
+/*      |------- globals                  [subtype_entry_t]            */
+/*      |          |--- atts              [subtype_attr_t]             */
+/*      |                                                              */
+/*      |------- entries                                               */
+/*                 |- entry #0                                         */
+/*                 |  |--- atts              [subtype_attr_t]          */
+/*                 |- entry #1                                         */
+/*                 |  |--- atts              [subtype_attr_t]          */
+/*                 |- entry #2                                         */
+/*                 .  |--- atts              [subtype_attr_t]          */
+/*                 .                                                   */
+
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+/* Literal constants corresponding to the different subtypes of the
+   enumeration "subtype_kind". */
+static const char *subtypeName[] = { "tileset" };
+
+const char *const cdiSubtypeAttributeName[] = { "tileIndex",     "totalNumberOfTileAttributePairs", "tileClassification",
+                                                "numberOfTiles", "numberOfTileAttributes",          "tileAttribute" };
+
+/* prototypes: */
+static int subtypeCompareP(subtype_t *z1, subtype_t *z2);
+static void subtypeDestroyP(void *subtype_ptr);
+static void subtypePrintP(void *subtype_ptr, FILE *fp);
+static int subtypeGetPackSize(void *subtype_ptr, void *context);
+static void subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context);
+static int subtypeTxCode(void *subtype_ptr);
+
+static const resOps subtypeOps = { (int (*)(void *, void *)) subtypeCompareP,
+                                   (void (*)(void *)) subtypeDestroyP,
+                                   (void (*)(void *, FILE *)) subtypePrintP,
+                                   (int (*)(void *, void *)) subtypeGetPackSize,
+                                   subtypePack,
+                                   subtypeTxCode };
+
+enum
+{
+  differ = 1,
+};
+
+/* ------------------------------------------------------------------- */
+/* SUBROUTINES FOR ATTRIBUTE LISTS                                     */
+/* ------------------------------------------------------------------- */
+
+static int
+attribute_to_index(const char *key)
+{
+  if (key == NULL) Error("Internal error!");
+  for (int i = 0; i < nSubtypeAttributes; i++)
+    if (str_is_equal(key, cdiSubtypeAttributeName[i])) return i;
+  return -1;
+}
+
+/*
+  @Function  subtypeAttrNewList
+  @Title     Create new linked list of subtype attributes.
+  @EndFunction
+*/
+static struct subtype_attr_t *
+subtypeAttrNewList(struct subtype_entry_t *head, int key, int val)
+{
+  if (head == NULL) Error("Internal error!");
+  struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t));
+  if (NULL == ptr) Error("Node creation failed");
+  ptr->key = key;
+  ptr->val = val;
+  ptr->next = NULL;
+
+  head->atts = ptr;
+  return ptr;
+}
+
+/*
+  @Function  subtypeAttrInsert
+
+  @Title Add subtype attribute to linked list, s.t. the result is a
+         smallest-to-largest ordered list.
+  @EndFunction
+*/
+static struct subtype_attr_t *
+subtypeAttrInsert(struct subtype_entry_t *head, int key, int val)
+{
+  if (head == NULL) Error("Internal error!");
+  if (head->atts == NULL) return (subtypeAttrNewList(head, key, val));
+
+  /* create new attribute */
+  struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t));
+  if (NULL == ptr) Error("Node creation failed");
+
+  ptr->key = key;
+  ptr->val = val;
+  ptr->next = NULL;
+
+  /* find the right place for insertion: */
+  if (head->atts->key >= key)
+    {
+      /* insert at position 0 */
+      ptr->next = head->atts;
+      head->atts = ptr;
+    }
+  else
+    {
+      struct subtype_attr_t **predec = &head->atts;
+      while (((*predec)->next != NULL) && ((*predec)->next->key < key))
+        {
+          predec = &((*predec)->next);
+        }
+      ptr->next = (*predec)->next;
+      (*predec)->next = ptr;
+    }
+  return ptr;
+}
+
+/* Recursively free a linked list with attributes. */
+static void
+subtypeAttrDestroy(struct subtype_attr_t *head)
+{
+  if (head == NULL) return;
+  subtypeAttrDestroy(head->next);
+  Free(head);
+  head = NULL;
+}
+
+/* Find an attribute in linked list by its key or return NULL
+   otherwise. */
+static struct subtype_attr_t *
+subtypeAttrFind(struct subtype_attr_t *head, int key)
+{
+  if (head == NULL)
+    return NULL;
+  else if (head->key == key)
+    return head;
+  else
+    return subtypeAttrFind(head->next, key);
+}
+
+/* Recursively compares two subtype attribute lists under the implicit
+   assumptions that both lists are ordered by their keys and that keys
+   are unique. */
+static int
+subtypeAttsCompare(struct subtype_attr_t *a1, struct subtype_attr_t *a2)
+{
+  if ((a1 == NULL) && (a2 == NULL))
+    return 0;
+  else if ((a1 == NULL) && (a2 != NULL))
+    {
+      return differ;
+    }
+  else if ((a1 != NULL) && (a2 == NULL))
+    {
+      return differ;
+    }
+
+  if (a1->key != a2->key)
+    {
+      return differ;
+    }
+  if (a1->val != a2->val) return differ;
+
+  return subtypeAttsCompare(a1->next, a2->next);
+}
+
+/* (Recursively) duplicate linked list of attributes. */
+static void
+subtypeAttsDuplicate(struct subtype_attr_t *a1, struct subtype_entry_t *dst)
+{
+  if (a1 == NULL) return;
+  /* duplicate "a1->key", "a1->val" */
+  subtypeAttsDuplicate(a1->next, dst);
+  (void) subtypeAttrInsert(dst, a1->key, a1->val);
+}
+
+/* ------------------------------------------------------------------- */
+/* SUBROUTINES FOR LIST OF ENTRIES                                     */
+/* ------------------------------------------------------------------- */
+
+/*
+  @Function  subtypeEntryNewList
+  @Title     Create new linked list of subtype entries.
+  @EndFunction
+*/
+static struct subtype_entry_t *
+subtypeEntryNewList(subtype_t *head)
+{
+  struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t));
+  if (NULL == ptr) Error("Node creation failed");
+  ptr->atts = NULL;
+  ptr->next = NULL;
+  head->entries = ptr;
+  head->nentries = 0;
+  ptr->self = head->nentries++;
+  return ptr;
+}
+
+/*
+  @Function  subtypeEntryInsert
+
+  @Title Add subtype entry to the head of a linked list.
+  @EndFunction
+*/
+struct subtype_entry_t *
+subtypeEntryInsert(subtype_t *head)
+{
+  if (head == NULL) Error("Internal error!");
+  if (head->entries == NULL) return (subtypeEntryNewList(head));
+
+  /* create new entry */
+  struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t));
+  if (NULL == ptr) Error("Node creation failed");
+
+  ptr->atts = NULL;
+  ptr->self = head->nentries++;
+
+  /* find the right place for insertion: */
+  if (head->entries->self >= ptr->self)
+    {
+      /* insert at position 0 */
+      ptr->next = head->entries;
+      head->entries = ptr;
+    }
+  else
+    {
+      struct subtype_entry_t **predec = &head->entries;
+      while (((*predec)->next != NULL) && ((*predec)->next->self < ptr->self))
+        {
+          predec = &((*predec)->next);
+        }
+      ptr->next = (*predec)->next;
+      (*predec)->next = ptr;
+    }
+  return ptr;
+}
+
+/*
+  @Function  subtypeEntryAppend
+
+  @Title Append subtype entry to the end of a linked list.
+  @EndFunction
+*/
+static struct subtype_entry_t *
+subtypeEntryAppend(subtype_t *head)
+{
+  if (head == NULL) Error("Internal error!");
+  if (head->entries == NULL) return (subtypeEntryNewList(head));
+
+  /* create new entry */
+  struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t));
+  if (NULL == ptr) Error("Node creation failed");
+
+  ptr->atts = NULL;
+  ptr->next = NULL;
+  ptr->self = head->nentries++;
+
+  /* find last position of linked list */
+  struct subtype_entry_t *prec_ptr = head->entries;
+  while (prec_ptr->next != NULL) prec_ptr = prec_ptr->next;
+
+  prec_ptr->next = ptr;
+  return ptr;
+}
+
+/* Recursively free a list of subtype entries. */
+static void
+subtypeEntryDestroy(struct subtype_entry_t *entry)
+{
+  if (entry == NULL) return;
+  subtypeEntryDestroy(entry->next);
+  subtypeAttrDestroy(entry->atts);
+  Free(entry);
+  entry = NULL;
+}
+
+/* Compares two subtype entries. */
+static int
+subtypeEntryCompare(struct subtype_entry_t *e1, struct subtype_entry_t *e2)
+{
+  if (e1 == NULL) Error("Internal error!");
+  if (e2 == NULL) Error("Internal error!");
+  return (e1->self == e2->self) && subtypeAttsCompare(e1->atts, e2->atts);
+}
+
+/* (Recursively) duplicate list of entries. */
+static void
+subtypeEntryDuplicate(struct subtype_entry_t *a1, subtype_t *dst)
+{
+  if (a1 == NULL) return;
+  /* append entry to dst pointer */
+  struct subtype_entry_t *ptr = subtypeEntryAppend(dst);
+  /* duplicate attributes */
+  subtypeAttsDuplicate(a1->atts, ptr);
+  ptr->self = a1->self;
+  /* call next link in linked list */
+  subtypeEntryDuplicate(a1->next, dst);
+}
+
+/* ------------------------------------------------------------------- */
+/* SUBROUTINES FOR THE SUBTYPE ITSELF                                  */
+/* ------------------------------------------------------------------- */
+
+/* Print-out subtype data structure together with its attributes. */
+static void
+subtypePrintKernel(subtype_t *subtype_ptr, FILE *fp)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  fprintf(fp, "# %s (subtype ID %d)\n", subtypeName[subtype_ptr->subtype], subtype_ptr->self);
+  /* print global attributes of this subtype */
+  struct subtype_attr_t *ptr = subtype_ptr->globals.atts;
+  if (ptr != NULL) fprintf(fp, "#\n# global attributes:\n");
+  while (ptr != NULL)
+    {
+      fprintf(fp, "#   %-40s   (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val);
+      ptr = ptr->next;
+    }
+  /* print attributes for each subtype */
+  fprintf(fp, "# %d local entries:\n", subtype_ptr->nentries);
+  struct subtype_entry_t *entry = subtype_ptr->entries;
+  while (entry != NULL)
+    {
+      fprintf(fp, "# subtype entry %d\n", entry->self);
+      ptr = entry->atts;
+      if (ptr != NULL) fprintf(fp, "#   attributes:\n");
+      while (ptr != NULL)
+        {
+          fprintf(fp, "#     %-40s (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val);
+          ptr = ptr->next;
+        }
+      entry = entry->next;
+    }
+  fprintf(fp, "\n");
+}
+
+/* Compares two subtype data structures. Pointer version of this
+   method. */
+static int
+subtypeCompareP(subtype_t *s1, subtype_t *s2)
+{
+  xassert(s1 && s2);
+  if (s1->subtype != s2->subtype) return differ;
+  if (subtypeEntryCompare(&s1->globals, &s2->globals) != 0) return differ;
+
+  struct subtype_entry_t *entry1 = s1->entries;
+  struct subtype_entry_t *entry2 = s2->entries;
+  while ((entry1 != NULL) && (entry2 != NULL))
+    {
+      if (subtypeEntryCompare(entry1, entry2) != 0) return differ;
+      entry1 = entry1->next;
+      entry2 = entry2->next;
+    }
+  /* compare list lengths: */
+  if ((entry1 != NULL) || (entry2 != NULL)) return differ;
+  return 0;
+}
+
+/* Clean up data structure. */
+static void
+subtypeDestroyP(void *ptr)
+{
+  subtype_t *subtype_ptr = (subtype_t *) ptr;
+  /* destroy global attributes */
+  subtypeAttrDestroy(subtype_ptr->globals.atts);
+  /* destroy list of subtype entries */
+  subtypeEntryDestroy(subtype_ptr->entries);
+  subtype_ptr->entries = NULL;
+  Free(subtype_ptr);
+  subtype_ptr = NULL;
+}
+
+/* Non-static wrapper function for "subtypeDestroyP". */
+void
+subtypeDestroyPtr(void *ptr)
+{
+  subtypeDestroyP(ptr);
+}
+
+/* Non-static wrapper function for "subtypeCompareP". */
+int
+subtypeComparePtr(int s1_ID, subtype_t *s2)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(s1_ID, &subtypeOps);
+  if (subtype_ptr == NULL) Error("Internal error");
+  return subtypeCompareP(subtype_ptr, s2);
+}
+
+/* Print-out subtype data structure together with its attributes.
+   Pointer version of this method. */
+static void
+subtypePrintP(void *subtype_ptr, FILE *fp)
+{
+  subtypePrintKernel((subtype_t *) subtype_ptr, fp);
+}
+
+/* Print-out subtype data structure together with its attributes. */
+void
+subtypePrintPtr(subtype_t *subtype_ptr)
+{
+  subtypePrintKernel(subtype_ptr, stdout);
+}
+
+/* Fill subtype data structure with default values. */
+static void
+subtypeDefaultValue(subtype_t *subtype_ptr)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  subtype_ptr->self = CDI_UNDEFID;
+  subtype_ptr->nentries = 0;
+  subtype_ptr->entries = NULL;
+  subtype_ptr->globals.atts = NULL;
+  subtype_ptr->globals.next = NULL;
+  subtype_ptr->globals.self = -1;
+  subtype_ptr->active_subtype_index = 0;
+}
+
+void
+subtypeAllocate(subtype_t **subtype_ptr2, int subtype)
+{
+  /* allocate new subtype */
+  (*subtype_ptr2) = (subtype_t *) Malloc(sizeof(subtype_t));
+  subtype_t *subtype_ptr = *subtype_ptr2;
+  subtypeDefaultValue(subtype_ptr);
+  subtype_ptr->subtype = subtype;
+  subtype_ptr->self = CDI_UNDEFID;
+}
+
+/* Create a copy of an existing subtype data structure. */
+void
+subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst_ptr)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  subtypeAllocate(dst_ptr, subtype_ptr->subtype);
+  subtype_t *dst = (*dst_ptr);
+  /* create duplicate of subtype globals */
+  subtypeAttsDuplicate(subtype_ptr->globals.atts, &dst->globals);
+  dst->globals.self = subtype_ptr->globals.self;
+  /* create duplicate of subtype entries */
+  subtypeEntryDuplicate(subtype_ptr->entries, dst);
+}
+
+/* Register subtype object at resource handler. */
+int
+subtypePush(subtype_t *subtype_ptr)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  subtype_ptr->self = reshPut(subtype_ptr, &subtypeOps);
+  return subtype_ptr->self; /* subtypeID */
+}
+
+/* Sets an attribute for a subtype (for example a set of TILES). If
+   the attribute has already been defined, then its value is
+   overwritten. */
+void
+subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  /* find entry in linked list or append otherwise */
+  struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key);
+  if (att_ptr == NULL)
+    subtypeAttrInsert(&subtype_ptr->globals, key, val);
+  else
+    att_ptr->val = val;
+}
+
+/* Sets an attribute for a subtype (for example a set of TILES). If
+   the attribute has already been defined, then its value is
+   overwritten. */
+void
+subtypeDefGlobalData(int subtypeID, int key, int val)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  subtypeDefGlobalDataP(subtype_ptr, key, val);
+}
+
+/* Retrieves an attribute for a subtype (for example a set of TILES).
+   If the attribute has not been defined, then return -1. */
+int
+subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key)
+{
+  if (subtype_ptr == NULL) Error("Internal error!");
+  /* find entry in linked list */
+  struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key);
+  if (att_ptr == NULL)
+    return -1;
+  else
+    return att_ptr->val;
+}
+
+/* Retrieves an attribute for a subtype (for example a set of TILES) .
+   If the attribute has not been defined, then return -1. */
+int
+subtypeGetGlobalData(int subtypeID, int key)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  return subtypeGetGlobalDataP(subtype_ptr, key);
+}
+
+/* Sets an attribute for a single subtype entry (e.g. a single TILE).
+   If the attribute has already been defined, then its value is
+   overwritten. */
+void
+subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val)
+{
+  if (subtype_entry_ptr == NULL) Error("Internal error!");
+  /* find entry in linked list or append otherwise */
+  struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_entry_ptr->atts, key);
+  if (att_ptr == NULL)
+    subtypeAttrInsert(subtype_entry_ptr, key, val);
+  else
+    att_ptr->val = val;
+}
+
+/* ------------------------------------------------------------------- */
+/* IMPLEMENTATIONS FOR KEY-VALUE-PAIR QUERIES                          */
+/* ------------------------------------------------------------------- */
+
+/* Generate a "query object" out of a key-value pair. */
+subtype_query_t
+keyValuePair(const char *key, int value)
+{
+  subtype_query_t result;
+  result.nAND = 1;
+  result.key_value_pairs[0][0] = attribute_to_index(key);
+  result.key_value_pairs[1][0] = value;
+  if (CDI_Debug) Message("key  %s matches %d", key, result.key_value_pairs[0][0]);
+  if (CDI_Debug) Message("%d --?-- %d", result.key_value_pairs[0][0], result.key_value_pairs[1][0]);
+  return result;
+}
+
+/* Generate an AND-combined "query object" out of two previous query
+   objects. */
+subtype_query_t
+matchAND(subtype_query_t q1, subtype_query_t q2)
+{
+  if ((q1.nAND + q2.nAND) > MAX_KV_PAIRS_MATCH) Error("Internal error");
+  subtype_query_t result;
+  memset(&result, 0, sizeof(subtype_query_t));
+  result.nAND = q1.nAND;
+  for (int i = 0; i < q1.nAND; i++)
+    {
+      result.key_value_pairs[0][i] = q1.key_value_pairs[0][i];
+      result.key_value_pairs[1][i] = q1.key_value_pairs[1][i];
+    }
+  for (int i = 0; i < q2.nAND; i++)
+    {
+      result.key_value_pairs[0][result.nAND] = q2.key_value_pairs[0][i];
+      result.key_value_pairs[1][result.nAND] = q2.key_value_pairs[1][i];
+      result.nAND++;
+    }
+
+  if (CDI_Debug) Message("combined criterion:");
+  if (CDI_Debug)
+    for (int i = 0; i < result.nAND; i++) Message("%d --?-- %d", result.key_value_pairs[0][i], result.key_value_pairs[1][i]);
+
+  return result;
+}
+
+/* ------------------------------------------------------------------- */
+/* SPECIFIC IMPLEMENTATIONS FOR TILE SETS                              */
+/* ------------------------------------------------------------------- */
+
+/* Integrate tile set "s2" into the tile set "subtype1_ID":
+
+   Insert all entries set 2 to set 1 together with its attributes.
+*/
+void
+tilesetInsertP(subtype_t *s1, subtype_t *s2)
+{
+  if (s1 == NULL) Error("Internal error!");
+  if (s2 == NULL) Error("Internal error!");
+  struct subtype_entry_t *entry1 = s1->entries, *entry2 = s2->entries;
+  struct subtype_attr_t *att_ptr2;
+
+  /* test all entries of set 2 against set 1, to check if entry
+     already exists: */
+  if (subtypeAttsCompare(s1->globals.atts, s2->globals.atts) != differ)
+    {
+      while (entry1 != NULL)
+        {
+          int found = 1;
+          entry2 = s2->entries;
+          while (entry2 != NULL)
+            {
+              found &= (subtypeAttsCompare(entry1->atts, entry2->atts) != differ);
+              entry2 = entry2->next;
+            }
+          if (found)
+            {
+              return;
+            }
+          entry1 = entry1->next;
+        }
+
+      entry2 = s2->entries;
+      while (entry2 != NULL)
+        {
+          entry1 = subtypeEntryInsert(s1);
+
+          att_ptr2 = entry2->atts;
+          while (att_ptr2 != NULL)
+            {
+              (void) subtypeAttrInsert(entry1, att_ptr2->key, att_ptr2->val);
+              att_ptr2 = att_ptr2->next;
+            }
+          entry2 = entry2->next;
+        }
+    }
+  else
+    {
+      fprintf(stderr, "\n# SUBTYPE A:\n");
+      subtypePrintKernel(s1, stderr);
+      fprintf(stderr, "\n# SUBTYPE B:\n");
+      subtypePrintKernel(s2, stderr);
+      Error("Attempting to insert subtype entry into subtype with different global attributes!");
+    }
+}
+
+/* ------------------------------------------------------------------- */
+/* IMPLEMENTATIONS FOR ROUTINES VISIBLE THROUGH CDI.H                  */
+/* ------------------------------------------------------------------- */
+
+/*
+  @Function  subtypeCreate
+  @Title     Create a variable subtype
+
+  @Prototype int subtypeCreate(int subtype)
+  @Parameter
+  @Item  subtype  The type of the variable subtype, one of the set of predefined CDI variable subtypes.
+  The valid CDI variable subtypes are @func{SUBTYPE_TILES}
+
+  @Description
+  The function @func{subtypeCreate} creates a variable subtype.
+
+  @Result
+  @func{subtypeCreate} returns an identifier to the variable subtype.
+
+  @EndFunction
+*/
+int
+subtypeCreate(int subtype)
+{
+  if (CDI_Debug) Message("subtype: %d ", subtype);
+
+  /* allocate new subtype */
+  subtype_t *subtype_ptr;
+  subtypeAllocate(&subtype_ptr, subtype);
+  /* register object at resource handler */
+  return subtypePush(subtype_ptr);
+}
+
+/* Print-out subtype data structure together with its attributes. */
+void
+subtypePrint(int subtypeID)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  subtypePrintKernel(subtype_ptr, stdout);
+}
+
+/* Compares two subtype data structures. */
+int
+subtypeCompare(int subtypeID1, int subtypeID2)
+{
+  subtype_t *subtype_ptr1 = (subtype_t *) reshGetVal(subtypeID1, &subtypeOps);
+  subtype_t *subtype_ptr2 = (subtype_t *) reshGetVal(subtypeID2, &subtypeOps);
+  return subtypeCompareP(subtype_ptr1, subtype_ptr2);
+}
+
+/*  Get the size of a subtype (e.g. no. of tiles). */
+int
+subtypeInqSize(int subtypeID)
+{
+  if (subtypeID == CDI_UNDEFID)
+    {
+      return 0;
+    }
+  else
+    {
+      subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+      return subtype_ptr->nentries;
+    }
+}
+
+/* Get the currently active index of a subtype (e.g. current tile index). */
+int
+subtypeInqActiveIndex(int subtypeID)
+{
+  if (subtypeID == CDI_UNDEFID) return 0;
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  return subtype_ptr->active_subtype_index;
+}
+
+/* Set the currently active index of a subtype (e.g. current tile index). */
+void
+subtypeDefActiveIndex(int subtypeID, int index)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  subtype_ptr->active_subtype_index = index;
+}
+
+/* subtypeInqSubEntry: Returns subtype entry ID for a given
+   criterion. */
+int
+subtypeInqSubEntry(int subtypeID, subtype_query_t criterion)
+{
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  struct subtype_entry_t *entry = subtype_ptr->entries;
+  /* loop over all entries of this subtype */
+  while (entry != NULL)
+    {
+      {
+        int match = 1;
+        /* test if this entry matches ALL criteria. */
+        for (int j = 0; (j < criterion.nAND) && (match); j++)
+          {
+            if (CDI_Debug)
+              Message("check criterion %d :  %d --?-- %d", j, criterion.key_value_pairs[0][j], criterion.key_value_pairs[1][j]);
+            struct subtype_attr_t *att_ptr = subtypeAttrFind(entry->atts, criterion.key_value_pairs[0][j]);
+            if (att_ptr == NULL)
+              {
+                match = 0;
+                if (CDI_Debug) Message("did not find %d", criterion.key_value_pairs[0][j]);
+              }
+            else
+              {
+                if (CDI_Debug) Message("found %d", criterion.key_value_pairs[0][j]);
+                match &= (att_ptr->val == criterion.key_value_pairs[1][j]);
+              }
+          }
+        if (match) return entry->self;
+      }
+      entry = entry->next;
+    }
+  return CDI_UNDEFID;
+}
+
+int
+subtypeInqTile(int subtypeID, int tileindex, int attribute)
+{
+  return subtypeInqSubEntry(subtypeID, matchAND(keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], tileindex),
+                                                keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], attribute)));
+}
+
+int
+subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue)
+{
+  // Validate input params.
+  if (subtypeID == CDI_UNDEFID)
+    xabort("CDI_UNDEFID was passed to %s() as a subtypeID. Please check the origin of that ID.", __func__);
+  subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps);
+  if (!subtype_ptr) xabort("Internal error: subtypeID %d resolved to NULL.", subtypeID);
+
+  if ((unsigned) index >= (unsigned) subtype_ptr->nentries)
+    {
+      xabort("index argument of %s() is out of range. Expected 0 <= index < %d, but got index = %d.", __func__,
+             subtype_ptr->nentries, index);
+    }
+
+  if (!key) return CDI_EINVAL;
+  int iKey = attribute_to_index(key);
+  if (iKey < 0) return CDI_EINVAL;
+
+  // Find the entry.
+  struct subtype_entry_t *entry = subtype_ptr->entries;
+  for (; index--; entry = entry->next)
+    if (!entry) xabort("internal error: preliminary end of subtype entry list");
+
+  // Find the attribute.
+  for (struct subtype_attr_t *attribute = entry->atts; attribute; attribute = attribute->next)
+    {
+      if (attribute->key == iKey)
+        {
+          if (outValue) *outValue = attribute->val;
+          return CDI_NOERR;
+        }
+    }
+
+  // Failed to find the attribute if this point is reached.
+  return CDI_EINVAL;
+}
+
+/* Construct a new subtype for a tile set. If a corresponding subtype
+ * already exists, then we return this subtype ID instead.
+ *
+ * See comment on subtype.c::tilesetMatchingPtr for the specification
+ * of the term "corresponding" tile set.
+ */
+int
+vlistDefTileSubtype(int vlistID, subtype_t *tiles)
+{
+  int subtypeID = CDI_UNDEFID;
+
+  /* loop over subtypes and search for an identical tileset */
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int tileset_defined = 0;
+  for (int isub = 0; isub < vlistptr->nsubtypes; isub++)
+    {
+      /* get the ID of the "isub"th subtype */
+      subtypeID = vlistptr->subtypeIDs[isub];
+      if (subtypeComparePtr(subtypeID, tiles) == 0)
+        {
+          tileset_defined = 1;
+          break;
+        }
+    }
+
+  /* tile set seems to be new: register at resource handler. */
+  if (tileset_defined == 0)
+    {
+      subtype_t *tiles_duplicate = NULL;
+      subtypeDuplicate(tiles, &tiles_duplicate);
+      subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(tiles_duplicate);
+    }
+
+  return subtypeID;
+}
+
+int
+vlistInsertTrivialTileSubtype(int vlistID)
+{
+  /* first, generate a subtype */
+  subtype_t *subtype_ptr;
+  subtypeAllocate(&subtype_ptr, SUBTYPE_TILES);
+
+  /* create a tile set that contains only one tile/attribute pair. */
+  (void) subtypeEntryInsert(subtype_ptr);
+
+  /* register tile */
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(subtype_ptr);
+  return subtypeID;
+}
+
+/* ------------------------------------------------------------------- */
+/* NOT YET IMPLEMENTED                                                 */
+/* ------------------------------------------------------------------- */
+
+static int
+subtypeGetPackSize(void *subtype_ptr, void *context)
+{
+  (void) subtype_ptr;
+  (void) context;
+  Error("Not yet implemented for subtypes!");
+  return 0;
+}
+
+static void
+subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context)
+{
+  (void) subtype_ptr;
+  (void) buffer;
+  (void) size;
+  (void) pos;
+  (void) context;
+  Error("Not yet implemented for subtypes!");
+}
+
+static int
+subtypeTxCode(void *subtypePtr)
+{
+  (void) subtypePtr;
+  Error("Not yet implemented for subtypes!");
+  return 0;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <inttypes.h>
+#include <stdio.h>
+
+
+void
+swap4byte(void *ptr, size_t size)
+{
+  int32_t *ptrtmp = (int32_t *) ptr;
+
+  // clang-format off
+  for (size_t i = 0; i < size; ++i)
+    ptrtmp[i] = (((ptrtmp[i] >> 24) & 0x00ff) | ((ptrtmp[i] & 0x00ff) << 24) |
+                 ((ptrtmp[i] >>  8) & 0xff00) | ((ptrtmp[i] & 0xff00) <<  8));
+  // clang-format on
+}
+
+void
+swap8byte(void *ptr, size_t size)
+{
+  int64_t *ptrtmp = (int64_t *) ptr;
+
+  // clang-format off
+  for (size_t i = 0; i < size; ++i)
+    ptrtmp[i] = (((ptrtmp[i] >> 56) & 0x000000ff) | ((ptrtmp[i] & 0x000000ff) << 56) |
+                 ((ptrtmp[i] >> 40) & 0x0000ff00) | ((ptrtmp[i] & 0x0000ff00) << 40) |
+                 ((ptrtmp[i] >> 24) & 0x00ff0000) | ((ptrtmp[i] & 0x00ff0000) << 24) |
+                 ((ptrtmp[i] >>  8) & 0xff000000) | ((ptrtmp[i] & 0xff000000) <<  8));
+  // clang-format on
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef TABLEPAR_H
+#define TABLEPAR_H
+
+enum
+{
+  TABLE_DUP_NAME = 1 << 0,
+  TABLE_DUP_LONGNAME = 1 << 1,
+  TABLE_DUP_UNITS = 1 << 2,
+};
+
+typedef struct
+{
+  int id;                // Parameter number (GRIB)
+  int ltype;             // Level type (GRIB)
+  int dupflags;          // keep track of which attributes got strdup'ed
+  const char *name;      // Parameter name
+  const char *longname;  // Parameter long name
+  const char *units;     // Parameter units
+} param_type;
+
+void tableLink(int tableID, const param_type *pars, int npars);
+int tableDef(int modelID, int tablegribID, const char *tablename);
+
+int tableInqParCode(int tableID, char *name, int *code);
+
+#endif
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* Automatically generated, do not edit! */
+#ifndef TABLE_H
+#define TABLE_H
+
+// clang-format off
+
+static const param_type echam4[] = {
+  {   4, -1, 0, "precip",      "total precipitation",                      "m/s"      },
+  {  34, -1, 0, "low_cld",     "low cloud",                                 NULL      },
+  {  35, -1, 0, "mid_cld",     "mid cloud",                                 NULL      },
+  {  36, -1, 0, "hih_cld",     "high cloud",                                NULL      },
+  { 129, -1, 0, "geosp",       "surface geopotential (orography)",         "m^2/s^2"  },
+  { 130, -1, 0, "t",           "temperature",                              "K"        },
+  { 131, -1, 0, "u",           "u-velocity",                               "m/s"      },
+  { 132, -1, 0, "v",           "v-velocity",                               "m/s"      },
+  { 133, -1, 0, "sq",          "specific humidity",                        "kg/kg"    },
+  { 134, -1, 0, "aps",         "Surface pressure",                         "Pa"       },
+  { 135, -1, 0, "omega",       "vertical velocity",                        "Pa/s"     },
+  { 138, -1, 0, "svo",         "vorticity",                                "1/s"      },
+  { 139, -1, 0, "ts",          "surface temperature",                      "K"        },
+  { 140, -1, 0, "ws",          "soil wetness",                             "m"        },
+  { 141, -1, 0, "sn",          "snow depth",                               "m"        },
+  { 142, -1, 0, "aprl",        "large scale precipitation",                "m/s"      },
+  { 143, -1, 0, "aprc",        "convective  precipitation",                "m/s"      },
+  { 144, -1, 0, "aprs",        "snow fall",                                "m/s"      },
+  { 145, -1, 0, "vdis",        "boundary layer dissipation",               "W/m^2"    },
+  { 146, -1, 0, "ahfs",        "surface sensible heat flux",               "W/m^2"    },
+  { 147, -1, 0, "ahfl",        "surface latent heat flux",                 "W/m^2"    },
+  { 148, -1, 0, "stream",      "streamfunction",                           "m^2/s"    },
+  { 149, -1, 0, "velopot",     "velocity potential",                       "m^2/s"    },
+  { 151, -1, 0, "slp",         "mean sea level pressure",                  "Pa"       },
+  { 152, -1, 0, "lsp",         "log surface pressure",                      NULL      },
+  { 153, -1, 0, "sx",          "liquid water content",                     "kg/kg"    },
+  { 155, -1, 0, "sd",          "divergence",                               "1/s"      },
+  { 156, -1, 0, "geopoth",     "geopotential height",                      "m"        },
+  { 157, -1, 0, "rhumidity",   "relative humidity",                        "fraction" },
+  { 158, -1, 0, "var158",      "tendency of surface pressure",             "Pa/s"     },
+  { 159, -1, 0, "ustar3",      "ustar3",                                   "m^3/s^3"  },
+  { 160, -1, 0, "runoff",      "surface runoff",                           "m/s"      },
+  { 161, -1, 0, "alwc",        "liquid water content",                     "kg/kg"    },
+  { 162, -1, 0, "aclc",        "cloud cover",                              "fraction" },
+  { 163, -1, 0, "aclcv",       "total cloud cover",                        "fraction" },
+  { 164, -1, 0, "aclcov",      "total cloud cover",                        "fraction" },
+  { 165, -1, 0, "u10",         "10m u-velocity",                           "m/s"      },
+  { 166, -1, 0, "v10",         "10m v-velocity",                           "m/s"      },
+  { 167, -1, 0, "temp2",       "2m temperature",                           "K"        },
+  { 168, -1, 0, "dew2",        "2m dew point temperature",                 "K"        },
+  { 169, -1, 0, "tsurf",       "surface temperature",                      "K"        },
+  { 170, -1, 0, "td",          "deep soil temperature",                    "K"        },
+  { 171, -1, 0, "wind10",      "10m windspeed",                            "m/s"      },
+  { 172, -1, 0, "slm",         "land sea mask",                            "fraction" },
+  { 173, -1, 0, "az0",         "surface roughness length",                 "m"        },
+  { 174, -1, 0, "alb",         "surface background albedo",                "fraction" },
+  { 175, -1, 0, "albedo",      "surface albedo",                           "fraction" },
+  { 176, -1, 0, "srads",       "net surface solar radiation",              "W/m^2"    },
+  { 177, -1, 0, "trads",       "net surface thermal radiation",            "W/m^2"    },
+  { 178, -1, 0, "srad0",       "net top solar radiation",                  "W/m^2"    },
+  { 179, -1, 0, "trad0",       "top thermal radiation (OLR)",              "W/m^2"    },
+  { 180, -1, 0, "ustr",        "surface u-stress",                         "Pa"       },
+  { 181, -1, 0, "vstr",        "surface v-stress",                         "Pa"       },
+  { 182, -1, 0, "evap",        "surface evaporation",                      "m/s"      },
+  { 183, -1, 0, "tdcl",        "soil temperature",                         "K"        },
+  { 185, -1, 0, "srafs",       "net surf. solar radiation   (clear sky)",  "W/m^2"    },
+  { 186, -1, 0, "trafs",       "net surf. thermal radiation (clear sky)",  "W/m^2"    },
+  { 187, -1, 0, "sraf0",       "net top solar radiation     (clear sky)",  "W/m^2"    },
+  { 188, -1, 0, "traf0",       "net top thermal radiation   (clear sky)",  "W/m^2"    },
+  { 189, -1, 0, "sclfs",       "surface solar cloud forcing",              "W/m^2"    },
+  { 190, -1, 0, "tclfs",       "surface thermal cloud forcing",            "W/m^2"    },
+  { 191, -1, 0, "sclf0",       "top solar cloud forcing",                  "W/m^2"    },
+  { 192, -1, 0, "tclf0",       "top thermal cloud forcing",                "W/m^2"    },
+  { 193, -1, 0, "wl",          "skin reservoir content",                   "m"        },
+  { 194, -1, 0, "wlm1",        "skin reservoir content of plants",         "m"        },
+  { 195, -1, 0, "ustrgw",      "u-gravity wave stress",                    "Pa"       },
+  { 196, -1, 0, "vstrgw",      "v-gravity wave stress",                    "Pa"       },
+  { 197, -1, 0, "vdisgw",      "gravity wave dissipation",                 "W/m^2"    },
+  { 198, -1, 0, "vgrat",       "vegetation ratio",                         "fraction" },
+  { 199, -1, 0, "varor",       "orographic variance",                      "m^2"      },
+  { 200, -1, 0, "vlt",         "leaf area index",                           NULL      },
+  { 201, -1, 0, "t2max",       "maximum 2m-temperature",                   "K"        },
+  { 202, -1, 0, "t2min",       "minimum 2m-temperature",                   "K"        },
+  { 203, -1, 0, "srad0u",      "top solar radiation upward",               "W/m^2"    },
+  { 204, -1, 0, "sradsu",      "surface solar radiation upward",           "W/m^2"    },
+  { 205, -1, 0, "tradsu",      "surface thermal radiation upward",         "W/m^2"    },
+  { 206, -1, 0, "tsn",         "snow temperature",                         "K"        },
+  { 207, -1, 0, "td3",         "soil temperature 3",                       "K"        },
+  { 208, -1, 0, "td4",         "soil temperature 4",                       "K"        },
+  { 209, -1, 0, "td5",         "soil temperature 5",                       "K"        },
+  { 210, -1, 0, "seaice",      "sea ice cover",                            "fraction" },
+  { 211, -1, 0, "siced",       "sea ice depth",                            "m"        },
+  { 212, -1, 0, "forest",      "vegetation type",                          "fraction" },
+  { 213, -1, 0, "teff",        "(effective) sea-ice skin temperature",     "K"        },
+  { 214, -1, 0, "tsmax",       "maximum surface temperature",              "K"        },
+  { 215, -1, 0, "tsmin",       "minimum surface temperature",              "K"        },
+  { 216, -1, 0, "wimax",       "maximum 10m-wind speed",                   "m/s"      },
+  { 217, -1, 0, "topmax",      "maximum height of convective cloud tops",  "Pa"       },
+  { 218, -1, 0, "snmel",       "snow melt",                                "m/s"      },
+  { 219, -1, 0, "runtoc",      "surface runoff into ocean",                 NULL      },
+  { 220, -1, 0, "tslin",       "land: residual surface heat budget",       "W/m^2"    },
+  { 221, -1, 0, "dsnac",       "snow depth change",                        "m/s"      },
+  { 222, -1, 0, "alwcac",      "liquid water content",                     "kg/kg"    },
+  { 223, -1, 0, "aclcac",      "cloud cover",                              "fraction" },
+  { 224, -1, 0, "tke",         "turbulent kinetic energy",                  NULL      },
+  { 225, -1, 0, "tkem1",       "turbulent kinetic energy (t-1)",            NULL      },
+  { 226, -1, 0, "fao",         "FAO data set (soil data flags)",            NULL      },
+  { 227, -1, 0, "rgcgn",       "heat capacity of soil",                     NULL      },
+  { 228, -1, 0, "sodif",       "soil diffusivity",                          NULL      },
+  { 229, -1, 0, "wsmx",        "field capacity of soil",                   "m"        },
+  { 230, -1, 0, "qvi",         "vertically integrated specific humidity",  "kg/m^2"   },
+  { 231, -1, 0, "alwcvi",      "vertically integrated liquid water cont.", "kg/m^2"   },
+  { 232, -1, 0, "glac",        "glacier mask",                             "fraction" },
+  { 233, -1, 0, "runlnd",      "surface runoff not running into ocean",     NULL      },
+  { 259, -1, 0, "windspeed",   "windspeed (sqrt(u^2+v^2))",                 NULL      },
+  { 260, -1, 0, "precip",      "total precipitation",                      "m/s"      },
+  { 261, -1, 0, "net_top",     "total top radiation",                       NULL      },
+  { 262, -1, 0, "net_bot",     "total surface radiation",                   NULL      },
+  { 263, -1, 0, "net_heat",    "net surface heat flux",                     NULL      },
+  { 264, -1, 0, "net_water",   "total surface water",                       NULL      },
+  { 268, -1, 0, "sw_atm",       NULL,                                       NULL      },
+  { 269, -1, 0, "lw_atm",       NULL,                                       NULL      },
+  { 270, -1, 0, "net_atm",      NULL,                                       NULL      },
+  { 271, -1, 0, "surf_runoff", "surface runoff",                            NULL      },
+  { 275, -1, 0, "fresh_water",  NULL,                                       NULL      },
+};
+
+static const param_type echam5[] = {
+  {   4, -1, 0, "precip",     "total precipitation",                       "kg/m^2s" },
+  {  79, -1, 0, "swnirac",    "net surface NIR flux acc.",                 "W/m^2"   },
+  {  80, -1, 0, "swdifnirac", "fraction of diffuse NIR acc.",              "W/m^2"   },
+  {  81, -1, 0, "swvisac",    "net surface visible flux acc.",             "W/m^2"   },
+  {  82, -1, 0, "swdifvisac", "fraction of diffuse visible acc.",          "W/m^2"   },
+  {  83, -1, 0, "ocu",        "ocean eastw. velocity (coupled mode)",      "m/s"     },
+  {  84, -1, 0, "ocv",        "ocean northw. velocity (coupled mode)",     "m/s"     },
+  {  85, -1, 0, "tradl",      "net LW radiation 200mb",                    "W/m^2"   },
+  {  86, -1, 0, "sradl",      "net SW radiation 200mb",                    "W/m^2"   },
+  {  87, -1, 0, "trafl",      "net LW radiation 200mb (clear sky)",        "W/m^2"   },
+  {  88, -1, 0, "srafl",      "net SW radiation 200mb (clear sky)",        "W/m^2"   },
+  {  89, -1, 0, "amlcorac",   "mixed layer flux correction",               "W/m^2"   },
+  {  90, -1, 0, "amlheatac",  "mixed layer heat content",                  "J/m^2"   },
+  {  91, -1, 0, "trfliac",    "net LW radiation over ice",                 "W/m^2"   },
+  {  92, -1, 0, "trflwac",    "net LW radiation over water",               "W/m^2"   },
+  {  93, -1, 0, "trfllac",    "net LW radiation over land",                "W/m^2"   },
+  {  94, -1, 0, "sofliac",    "net SW radiation over ice",                 "W/m^2"   },
+  {  95, -1, 0, "soflwac",    "net SW radiation over water",               "W/m^2"   },
+  {  96, -1, 0, "sofllac",    "net SW radiation over land",                "W/m^2"   },
+  {  97, -1, 0, "friac",      "ice cover (fraction of grid box)",           NULL     },
+  { 102, -1, 0, "tsi",        "surface temperature of ice",                "K"       },
+  { 103, -1, 0, "tsw",        "surface temperature of water",              "K"       },
+  { 104, -1, 0, "ustri",      "zonal      wind stress over ice",           "Pa"      },
+  { 105, -1, 0, "vstri",      "meridional wind stress over ice",           "Pa"      },
+  { 106, -1, 0, "ustrw",      "zonal      wind stress over water",         "Pa"      },
+  { 107, -1, 0, "vstrw",      "meridional wind stress over water",         "Pa"      },
+  { 108, -1, 0, "ustrl",      "zonal      wind stress over land",          "Pa"      },
+  { 109, -1, 0, "vstrl",      "meridional wind stress over land",          "Pa"      },
+  { 110, -1, 0, "ahfliac",    "latent heat flux over ice",                 "W/m^2"   },
+  { 111, -1, 0, "ahflwac",    "latent heat flux over water",               "W/m^2"   },
+  { 112, -1, 0, "ahfllac",    "latent heat flux over land",                "W/m^2"   },
+  { 113, -1, 0, "evapiac",    "evaporation over ice",                      "kg/m^2s" },
+  { 114, -1, 0, "evapwac",    "evaporation over water",                    "kg/m^2s" },
+  { 115, -1, 0, "evaplac",    "evaporation over land",                     "kg/m^2s" },
+  { 116, -1, 0, "az0i",       "roughness length over ice",                 "m"       },
+  { 117, -1, 0, "az0w",       "roughness length over water",               "m"       },
+  { 118, -1, 0, "az0l",       "roughness length over land",                "m"       },
+  { 119, -1, 0, "ahfsiac",    "sensible heat flux over ice",               "W/m^2"   },
+  { 120, -1, 0, "ahfswac",    "sensible heat flux over water",             "W/m^2"   },
+  { 121, -1, 0, "ahfslac",    "sensible heat flux over land",              "W/m^2"   },
+  { 122, -1, 0, "alsoi",      "albedo of ice",                              NULL     },
+  { 123, -1, 0, "alsow",      "albedo of water",                            NULL     },
+  { 124, -1, 0, "alsol",      "albedo of land",                             NULL     },
+  { 125, -1, 0, "ahfice",     "conductive heat flux through ice",          "W/m^2"   },
+  { 126, -1, 0, "qres",       "residual heat flux for melting sea ice",    "W/m^2"   },
+  { 127, -1, 0, "alake",      "lake fraction",                              NULL     },
+  { 128, -1, 0, "rintop",     "low level inversion",                        NULL     },
+  { 129, -1, 0, "geosp",      "surface geopotential (orography)",          "m^2/s^2" },
+  { 130, -1, 0, "t",          "temperature",                               "K"       },
+  { 131, -1, 0, "u",          "u-velocity",                                "m/s"     },
+  { 132, -1, 0, "v",          "v-velocity",                                "m/s"     },
+  { 133, -1, 0, "q",          "specific humidity",                         "kg/kg"   },
+  { 134, -1, 0, "aps",        "surface pressure",                          "Pa"      },
+  { 135, -1, 0, "omega",      "vertical velocity",                         "Pa/s"    },
+  { 136, -1, 0, "acdnc",      "cloud droplet number concentration",        "1/m^3"   },
+  { 137, -1, 0, "apmeb",      "(P-E) error",                               "kg/m^2s" },
+  { 138, -1, 0, "svo",        "vorticity",                                 "1/s"     },
+  { 139, -1, 0, "tslm1",      "surface temperature of land",               "K"       },
+  { 140, -1, 0, "ws",         "soil wetness",                              "m"       },
+  { 141, -1, 0, "sn",         "water equivalent snow depth",               "m"       },
+  { 142, -1, 0, "aprl",       "large scale precipitation",                 "kg/m^2s" },
+  { 143, -1, 0, "aprc",       "convective  precipitation",                 "kg/m^2s" },
+  { 144, -1, 0, "aprs",       "snow fall",                                 "kg/m^2s" },
+  { 145, -1, 0, "vdis",       "boundary layer dissipation",                "W/m^2"   },
+  { 146, -1, 0, "ahfs",       "sensible heat flux",                        "W/m^2"   },
+  { 147, -1, 0, "ahfl",       "latent heat flux",                          "W/m^2"   },
+  { 148, -1, 0, "stream",     "streamfunction",                            "m^2/s"   },
+  { 149, -1, 0, "velopot",    "velocity potential",                        "m^2/s"   },
+  { 150, -1, 0, "xivi",       "vertically integrated cloud ice",           "kg/m^2"  },
+  { 151, -1, 0, "slp",        "mean sea level pressure",                   "Pa"      },
+  { 152, -1, 0, "lsp",        "log surface pressure",                       NULL     },
+  { 153, -1, 0, "xl",         "cloud water",                               "kg/kg"   },
+  { 154, -1, 0, "xi",         "cloud ice",                                 "kg/kg"   },
+  { 155, -1, 0, "sd",         "divergence",                                "1/s"     },
+  { 156, -1, 0, "geopoth",    "geopotential height",                       "m"       },
+  { 157, -1, 0, "rhumidity",  "relative humidity",                          NULL     },
+  { 159, -1, 0, "wind10w",    "10m windspeed over water",                  "m/s"     },
+  { 160, -1, 0, "runoff",     "surface runoff and drainage",               "kg/m^2s" },
+  { 161, -1, 0, "drain",      "drainage",                                  "kg/m^2s" },
+  { 162, -1, 0, "aclc",       "cloud cover",                                NULL     },
+  { 164, -1, 0, "aclcov",     "total cloud cover",                          NULL     },
+  { 165, -1, 0, "u10",        "10m u-velocity",                            "m/s"     },
+  { 166, -1, 0, "v10",        "10m v-velocity",                            "m/s"     },
+  { 167, -1, 0, "temp2",      "2m temperature",                            "K"       },
+  { 168, -1, 0, "dew2",       "2m dew point temperature",                  "K"       },
+  { 169, -1, 0, "tsurf",      "surface temperature",                       "K"       },
+  { 170, -1, 0, "xvar",       "variance of total water amount",            "kg/kg"   },
+  { 171, -1, 0, "wind10",     "10m windspeed",                             "m/s"     },
+  { 172, -1, 0, "slm",        "land sea mask (1. = land, 0. = sea/lakes)",  NULL     },
+  { 173, -1, 0, "az0",        "roughness length",                          "m"       },
+  { 174, -1, 0, "alb",        "surface background albedo",                  NULL     },
+  { 175, -1, 0, "albedo",     "surface albedo",                             NULL     },
+  { 176, -1, 0, "srads",      "net surface SW radiation",                  "W/m^2"   },
+  { 177, -1, 0, "trads",      "net surface LW radiation",                  "W/m^2"   },
+  { 178, -1, 0, "srad0",      "net top SW radiation",                      "W/m^2"   },
+  { 179, -1, 0, "trad0",      "net top LW radiation (-OLR)",               "W/m^2"   },
+  { 180, -1, 0, "ustr",       "u-stress",                                  "Pa"      },
+  { 181, -1, 0, "vstr",       "v-stress",                                  "Pa"      },
+  { 182, -1, 0, "evap",       "evaporation",                               "kg/m^2s" },
+  { 183, -1, 0, "xskew",      "skewness of total water amount qv+qi+ql",    NULL     },
+  { 184, -1, 0, "srad0d",     "top incoming SW radiation",                 "W/m^2"   },
+  { 185, -1, 0, "srafs",      "net surface SW radiation (clear sky)",      "W/m^2"   },
+  { 186, -1, 0, "trafs",      "net surface LW radiation (clear sky)",      "W/m^2"   },
+  { 187, -1, 0, "sraf0",      "net top SW radiation   (clear sky)",        "W/m^2"   },
+  { 188, -1, 0, "traf0",      "net top LW radiation   (clear sky)",        "W/m^2"   },
+  { 189, -1, 0, "sclfs",      "net surface SW cloud forcing (176-185)",    "W/m^2"   },
+  { 190, -1, 0, "tclfs",      "net surface LW cloud forcing (177-186)",    "W/m^2"   },
+  { 191, -1, 0, "sclf0",      "net SW top cloud forcing (178-187)",        "W/m^2"   },
+  { 192, -1, 0, "tclf0",      "net LW top cloud forcing (179-188)",        "W/m^2"   },
+  { 193, -1, 0, "wl",         "skin reservoir content",                    "m"       },
+  { 194, -1, 0, "slf",        "fractional land cover",                      NULL     },
+  { 195, -1, 0, "ustrgw",     "u-gravity wave stress",                     "Pa"      },
+  { 196, -1, 0, "vstrgw",     "v-gravity wave stress",                     "Pa"      },
+  { 197, -1, 0, "vdisgw",     "gravity wave dissipation",                  "W/m^2"   },
+  { 198, -1, 0, "vgrat",      "vegetation ratio",                           NULL     },
+  { 199, -1, 0, "orostd",     "orographic standard deviation",             "m"       },
+  { 200, -1, 0, "vlt",        "leaf area index",                            NULL     },
+  { 201, -1, 0, "t2max",      "maximum 2m-temperature",                    "K"       },
+  { 202, -1, 0, "t2min",      "minimum 2m-temperature",                    "K"       },
+  { 203, -1, 0, "srad0u",     "top SW radiation upward",                   "W/m^2"   },
+  { 204, -1, 0, "sradsu",     "surface SW radiation upward",               "W/m^2"   },
+  { 205, -1, 0, "tradsu",     "surface LW radiation upward",               "W/m^2"   },
+  { 206, -1, 0, "grndflux",   "surface ground heat flux",                   NULL     },
+  { 207, -1, 0, "tsoil",      "deep soil temperatures (5 layers)",         "K"       },
+  { 208, -1, 0, "ahfcon",     "conductive heat flux through ice",          "W/m^2"   },
+  { 209, -1, 0, "ahfres",     "res. heat flux for melting ice",            "W/m^2"   },
+  { 210, -1, 0, "seaice",     "ice cover (fraction of ice+water)",          NULL     },
+  { 211, -1, 0, "siced",      "ice thickness",                             "m"       },
+  { 212, -1, 0, "forest",     "forest fraction",                            NULL     },
+  { 213, -1, 0, "gld",        "glacier thickness",                         "m"       },
+  { 214, -1, 0, "sni",        "water equivalent of snow on ice",           "m"       },
+  { 215, -1, 0, "rogl",       "glacier runoff",                            "kg/m^2s" },
+  { 216, -1, 0, "wimax",      "maximum 10m-wind speed",                    "m/s"     },
+  { 217, -1, 0, "topmax",     "maximum height of convective cloud tops",   "Pa"      },
+  { 218, -1, 0, "snmel",      "snow melt",                                 "kg/m^2s" },
+  { 219, -1, 0, "runtoc",     "surface runoff into ocean",                 "kg/m^2s" },
+  { 220, -1, 0, "runlnd",     "surface runoff not running into ocean",     "kg/m^2s" },
+  { 221, -1, 0, "apmegl",     "P-E over land ice",                         "kg/m^2s" },
+  { 222, -1, 0, "snacl",      "snow accumulation over land",               "kg/m^2s" },
+  { 223, -1, 0, "aclcac",     "cloud cover",                                NULL     },
+  { 224, -1, 0, "tke",        "turbulent kinetic energy",                  "m^2/s^2" },
+  { 225, -1, 0, "tkem1",      "turbulent kinetic energy (t-1)",            "m^2/s^2" },
+  { 226, -1, 0, "fao",        "FAO data set (soil data flags) 0...5",       NULL     },
+  { 227, -1, 0, "rgcgn",      "heat capacity of soil",                      NULL     },
+  { 228, -1, 0, "sodif",      "soil diffusivity",                          "m^2/s"   },
+  { 229, -1, 0, "wsmx",       "field capacity of soil",                    "m"       },
+  { 230, -1, 0, "qvi",        "vertically integrated water vapor",         "kg/m^2"  },
+  { 231, -1, 0, "xlvi",       "vertically integrated cloud water",         "kg/m^2"  },
+  { 232, -1, 0, "glac",       "fraction of land covered by glaciers",       NULL     },
+  { 233, -1, 0, "snc",        "snow depth at the canopy",                  "m"       },
+  { 234, -1, 0, "rtype",      "type of convection",                        "0...3"   },
+  { 235, -1, 0, "abso4",      "anthropogenic sulfur burden",               "kg/m^2"  },
+  { 236, -1, 0, "ao3",        "ipcc ozone",                                "kg/m^2"  },
+  { 237, -1, 0, "tropo",      "WMO defined tropopause height",             "Pa"      },
+  { 259, -1, 0, "windspeed",  "windspeed (sqrt(u^2+v^2))",                 "m/s"     },
+  { 260, -1, 0, "precip",     "total precipitation  (142+143)",            "kg/m^2s" },
+  { 261, -1, 0, "net_top",    "total top radiation  (178+179)",            "W/m^2"   },
+  { 262, -1, 0, "net_bot",    "total surface radiation (176+177)",         "W/m^2"   },
+  { 272, -1, 0, "mastrfu",    "mass stream function",                      "kg/s"    },
+};
+
+static const param_type echam6[] = {
+  {   4, -1, 0, "precip",         "total precipitation",                       "kg m-2 s-1" },
+  {  34, -1, 0, "low_cld",        "low cloud",                                  NULL        },
+  {  35, -1, 0, "mid_cld",        "mid cloud",                                  NULL        },
+  {  36, -1, 0, "hih_cld",        "high cloud",                                 NULL        },
+  {  68, -1, 0, "fage",           "aging factor of snow on ice",                NULL        },
+  {  69, -1, 0, "snifrac",        "fraction of ice covered with snow",          NULL        },
+  {  70, -1, 0, "barefrac",       "bare ice fraction",                          NULL        },
+  {  71, -1, 0, "alsom",          "albedo of melt ponds",                       NULL        },
+  {  72, -1, 0, "alsobs",         "albedo of bare ice and snow",                NULL        },
+  {  73, -1, 0, "sicepdw",        "melt pond depth on sea-ice",                "m"          },
+  {  74, -1, 0, "sicepdi",        "ice thickness on melt pond",                "m"          },
+  {  75, -1, 0, "tsicepdi",       "ice temperature on frozen melt pond",       "K"          },
+  {  76, -1, 0, "sicepres",       "residual heat flux",                        "W m-2"      },
+  {  77, -1, 0, "ameltdepth",     "total melt pond depth",                     "m"          },
+  {  78, -1, 0, "ameltfrac",      "fractional area of melt ponds on sea-ice",   NULL        },
+  {  79, -1, 0, "albedo_vis_dir", "surface albedo visible range direct",        NULL        },
+  {  80, -1, 0, "albedo_nir_dir", "surface albedo NIR range direct",            NULL        },
+  {  81, -1, 0, "albedo_vis_dif", "surface albedo visible range diffuse",       NULL        },
+  {  82, -1, 0, "albedo_nir_dif", "surface albedo NIR range diffuse",           NULL        },
+  {  83, -1, 0, "ocu",            "ocean eastw. velocity (coupled mode)",      "m/s"        },
+  {  84, -1, 0, "ocv",            "ocean northw. velocity (coupled mode)",     "m/s"        },
+  {  85, -1, 0, "tradl",          "thermal radiation 200mb",                   "W m-2"      },
+  {  86, -1, 0, "sradl",          "solar radiation 200mb",                     "W m-2"      },
+  {  87, -1, 0, "trafl",          "thermal radiation 200mb (clear sky)",       "W m-2"      },
+  {  88, -1, 0, "srafl",          "solar radiation 200mb (clear sky)",         "W m-2"      },
+  {  89, -1, 0, "amlcorac",       "mixed layer flux correction",               "W m-2"      },
+  {  90, -1, 0, "amlheatac",      "mixed layer heat content",                  "J m-2"      },
+  {  91, -1, 0, "trfliac",        "LW flux over ice",                          "W m-2"      },
+  {  92, -1, 0, "trflwac",        "LW flux over water",                        "W m-2"      },
+  {  93, -1, 0, "trfllac",        "LW flux over land",                         "W m-2"      },
+  {  94, -1, 0, "sofliac",        "SW flux over ice",                          "W m-2"      },
+  {  95, -1, 0, "soflwac",        "SW flux over water",                        "W m-2"      },
+  {  96, -1, 0, "sofllac",        "SW flux over land",                         "W m-2"      },
+  {  97, -1, 0, "friac",          "ice cover (fraction of grid box)",           NULL        },
+  { 102, -1, 0, "tsi",            "surface temperature of ice",                "K"          },
+  { 103, -1, 0, "tsw",            "surface temperature of water",              "K"          },
+  { 104, -1, 0, "ustri",          "zonal      wind stress over ice",           "Pa"         },
+  { 105, -1, 0, "vstri",          "meridional wind stress over ice",           "Pa"         },
+  { 106, -1, 0, "ustrw",          "zonal      wind stress over water",         "Pa"         },
+  { 107, -1, 0, "vstrw",          "meridional wind stress over water",         "Pa"         },
+  { 108, -1, 0, "ustrl",          "zonal      wind stress over land",          "Pa"         },
+  { 109, -1, 0, "vstrl",          "meridional wind stress over land",          "Pa"         },
+  { 110, -1, 0, "ahfliac",        "latent heat flux over ice",                 "W m-2"      },
+  { 111, -1, 0, "ahflwac",        "latent heat flux over water",               "W m-2"      },
+  { 112, -1, 0, "ahfllac",        "latent heat flux over land",                "W m-2"      },
+  { 113, -1, 0, "evapiac",        "evaporation over ice",                      "kg m-2 s-1" },
+  { 114, -1, 0, "evapwac",        "evaporation over water",                    "kg m-2 s-1" },
+  { 115, -1, 0, "evaplac",        "evaporation over land",                     "kg m-2 s-1" },
+  { 116, -1, 0, "az0i",           "roughness length over ice",                 "m"          },
+  { 117, -1, 0, "az0w",           "roughness length over water",               "m"          },
+  { 118, -1, 0, "az0l",           "roughness length over land",                "m"          },
+  { 119, -1, 0, "ahfsiac",        "sensible heat flux over ice",               "W m-2"      },
+  { 120, -1, 0, "ahfswac",        "sensible heat flux over water",             "W m-2"      },
+  { 121, -1, 0, "ahfslac",        "sensible heat flux over land",              "W m-2"      },
+  { 122, -1, 0, "alsoi",          "albedo of ice",                              NULL        },
+  { 123, -1, 0, "alsow",          "albedo of water",                            NULL        },
+  { 124, -1, 0, "alsol",          "albedo of land",                             NULL        },
+  { 125, -1, 0, "ahfice",         "conductive heat flux",                      "W m-2"      },
+  { 126, -1, 0, "qres",           "residual heat flux for melting sea ice",    "W m-2"      },
+  { 127, -1, 0, "alake",          "lake fraction of grid box",                 "fraction"   },
+  { 128, -1, 0, "rintop",         "low level inversion",                        NULL        },
+  { 129, -1, 0, "geosp",          "surface geopotential (orography)",          "m^2/s^2"    },
+  { 130, -1, 0, "t",              "temperature",                               "K"          },
+  { 131, -1, 0, "u",              "u-velocity",                                "m/s"        },
+  { 132, -1, 0, "v",              "v-velocity",                                "m/s"        },
+  { 133, -1, 0, "q",              "specific humidity",                         "kg/kg"      },
+  { 134, -1, 0, "aps",            "surface pressure",                          "Pa"         },
+  { 135, -1, 0, "omega",          "vertical velocity",                         "Pa/s"       },
+  { 136, -1, 0, "acdnc",          "cloud droplet number concentration",        "1 m-3"      },
+  { 137, -1, 0, "apmeb",          "vert. integr. tendencies of water",         "kg m-2 s-1" },
+  { 138, -1, 0, "svo",            "vorticity",                                 "1/s"        },
+  { 139, -1, 0, "tslm1",          "surface temperature of land",               "K"          },
+  { 140, -1, 0, "ws",             "soil wetness",                              "m"          },
+  { 141, -1, 0, "sn",             "snow depth",                                "m"          },
+  { 142, -1, 0, "aprl",           "large scale precipitation",                 "kg m-2 s-1" },
+  { 143, -1, 0, "aprc",           "convective  precipitation",                 "kg m-2 s-1" },
+  { 144, -1, 0, "aprs",           "snow fall",                                 "kg m-2 s-1" },
+  { 145, -1, 0, "vdis",           "boundary layer dissipation",                "W m-2"      },
+  { 146, -1, 0, "ahfs",           "sensible heat flux",                        "W m-2"      },
+  { 147, -1, 0, "ahfl",           "latent heat flux",                          "W m-2"      },
+  { 148, -1, 0, "stream",         "streamfunction",                            "m^2/s"      },
+  { 149, -1, 0, "velopot",        "velocity potential",                        "m^2/s"      },
+  { 150, -1, 0, "xivi",           "vertically integrated cloud ice",           "kg m-2"     },
+  { 151, -1, 0, "slp",            "mean sea level pressure",                   "Pa"         },
+  { 152, -1, 0, "lsp",            "log surface pressure",                       NULL        },
+  { 153, -1, 0, "xl",             "cloud water",                               "kg/kg"      },
+  { 154, -1, 0, "xi",             "cloud ice",                                 "kg/kg"      },
+  { 155, -1, 0, "sd",             "divergence",                                "1/s"        },
+  { 156, -1, 0, "geopoth",        "geopotential height",                       "m"          },
+  { 157, -1, 0, "rhumidity",      "relative humidity",                         "fraction"   },
+  { 158, -1, 0, "var158",         "tendency of surface pressure",              "Pa/s"       },
+  { 159, -1, 0, "wind10w",        "10m windspeed over water",                  "m/s"        },
+  { 160, -1, 0, "runoff",         "surface runoff and drainage",               "kg m-2 s-1" },
+  { 161, -1, 0, "drain",          "drainage",                                  "kg m-2 s-1" },
+  { 162, -1, 0, "aclc",           "cloud cover",                                NULL        },
+  { 163, -1, 0, "aclcv",          "total cloud cover",                          NULL        },
+  { 164, -1, 0, "aclcov",         "total cloud cover (mean)",                   NULL        },
+  { 165, -1, 0, "u10",            "10m u-velocity",                            "m/s"        },
+  { 166, -1, 0, "v10",            "10m v-velocity",                            "m/s"        },
+  { 167, -1, 0, "temp2",          "2m temperature",                            "K"          },
+  { 168, -1, 0, "dew2",           "2m dew point temperature",                  "K"          },
+  { 169, -1, 0, "tsurf",          "surface temperature",                       "K"          },
+  { 170, -1, 0, "xvar",           "variance of total water amount qv+qi+ql",   "kg/kg"      },
+  { 171, -1, 0, "wind10",         "10m windspeed",                             "m/s"        },
+  { 172, -1, 0, "slm",            "land sea mask (1. = land, 0. = sea/lakes)",  NULL        },
+  { 173, -1, 0, "az0",            "roughness length",                          "m"          },
+  { 174, -1, 0, "alb",            "surface background albedo",                  NULL        },
+  { 175, -1, 0, "albedo",         "surface albedo",                             NULL        },
+  { 176, -1, 0, "srads",          "net surface solar radiation",               "W m-2"      },
+  { 177, -1, 0, "trads",          "net surface thermal radiation",             "W m-2"      },
+  { 178, -1, 0, "srad0",          "net top solar radiation",                   "W m-2"      },
+  { 179, -1, 0, "trad0",          "top thermal radiation (OLR)",               "W m-2"      },
+  { 180, -1, 0, "ustr",           "u-stress",                                  "Pa"         },
+  { 181, -1, 0, "vstr",           "v-stress",                                  "Pa"         },
+  { 182, -1, 0, "evap",           "evaporation",                               "kg m-2 s-1" },
+  { 183, -1, 0, "xskew",          "skewness of total water amount qv+qi+ql",    NULL        },
+  { 184, -1, 0, "srad0d",         "top incoming solar radiation",              "W m-2"      },
+  { 185, -1, 0, "srafs",          "net surf. solar radiation   (clear sky)",   "W m-2"      },
+  { 186, -1, 0, "trafs",          "net surf. thermal radiation (clear sky)",   "W m-2"      },
+  { 187, -1, 0, "sraf0",          "net top solar radiation     (clear sky)",   "W m-2"      },
+  { 188, -1, 0, "traf0",          "net top thermal radiation   (clear sky)",   "W m-2"      },
+  { 189, -1, 0, "sclfs",          "surface solar cloud forcing",               "W m-2"      },
+  { 190, -1, 0, "tclfs",          "surface thermal cloud forcing",             "W m-2"      },
+  { 191, -1, 0, "sclf0",          "SW top cloud forcing (178-187)",            "W m-2"      },
+  { 192, -1, 0, "tclf0",          "LW top cloud forcing (179-188)",            "W m-2"      },
+  { 193, -1, 0, "wl",             "skin reservoir content",                    "m"          },
+  { 194, -1, 0, "slf",            "sea land fraction",                          NULL        },
+  { 195, -1, 0, "ustrgw",         "u-gravity wave stress",                     "Pa"         },
+  { 196, -1, 0, "vstrgw",         "v-gravity wave stress",                     "Pa"         },
+  { 197, -1, 0, "vdisgw",         "gravity wave dissipation",                  "W m-2"      },
+  { 198, -1, 0, "vgrat",          "vegetation ratio",                           NULL        },
+  { 199, -1, 0, "orostd",         "orographic standard deviation",             "m"          },
+  { 200, -1, 0, "vlt",            "leaf area index",                            NULL        },
+  { 201, -1, 0, "t2max",          "maximum 2m-temperature",                    "K"          },
+  { 202, -1, 0, "t2min",          "minimum 2m-temperature",                    "K"          },
+  { 203, -1, 0, "srad0u",         "top solar radiation upward",                "W m-2"      },
+  { 204, -1, 0, "sradsu",         "surface solar radiation upward",            "W m-2"      },
+  { 205, -1, 0, "tradsu",         "surface thermal radiation upward",          "W m-2"      },
+  { 206, -1, 0, "grndflux",       "surface ground heat flux",                   NULL        },
+  { 207, -1, 0, "tsoil",          "deep soil temperatures (5 layers)",         "K"          },
+  { 208, -1, 0, "ahfcon",         "conductive heat flux through ice",          "W m-2"      },
+  { 209, -1, 0, "ahfres",         "melting of ice",                            "W m-2"      },
+  { 210, -1, 0, "seaice",         "ice cover (fraction of 1-SLM)",              NULL        },
+  { 211, -1, 0, "siced",          "ice depth",                                 "m"          },
+  { 212, -1, 0, "forest",         "forest fraction",                            NULL        },
+  { 213, -1, 0, "gld",            "glacier depth",                             "m"          },
+  { 214, -1, 0, "sni",            "water equivalent of snow on ice",           "m"          },
+  { 215, -1, 0, "rogl",           "glacier runoff",                            "kg m-2 s-1" },
+  { 216, -1, 0, "wimax",          "maximum 10m-wind speed",                    "m/s"        },
+  { 217, -1, 0, "topmax",         "maximum height of convective cloud tops",   "Pa"         },
+  { 218, -1, 0, "snmel",          "snow melt",                                 "kg m-2 s-1" },
+  { 219, -1, 0, "runtoc",         "surface runoff into ocean",                 "kg m-2 s-1" },
+  { 220, -1, 0, "runlnd",         "surface runoff not running into ocean",     "kg m-2 s-1" },
+  { 221, -1, 0, "apmegl",         "P-E over land ice",                         "kg m-2 s-1" },
+  { 222, -1, 0, "snacl",          "snow accumulation over land",               "kg m-2 s-1" },
+  { 223, -1, 0, "aclcac",         "cloud cover",                                NULL        },
+  { 224, -1, 0, "tke",            "turbulent kinetic energy",                  "m^2/s^2"    },
+  { 225, -1, 0, "tkem1",          "turbulent kinetic energy (t-1)",            "m^2/s^2"    },
+  { 226, -1, 0, "fao",            "FAO data set (soil data flags)",            "0...5"      },
+  { 227, -1, 0, "rgcgn",          "heat capacity of soil",                      NULL        },
+  { 228, -1, 0, "sodif",          "diffusivity of soil and land ice",          "m^2/s"      },
+  { 229, -1, 0, "wsmx",           "field capacity of soil",                    "m"          },
+  { 230, -1, 0, "qvi",            "vertically integrated water vapor",         "kg m-2"     },
+  { 231, -1, 0, "xlvi",           "vertically integrated cloud water",         "kg m-2"     },
+  { 232, -1, 0, "glac",           "fraction of land covered by glaciers",       NULL        },
+  { 233, -1, 0, "snc",            "snow depth at the canopy",                  "m"          },
+  { 234, -1, 0, "rtype",          "type of convection",                        "0...3"      },
+  { 235, -1, 0, "abso4",          "antropogenic sulfur burden",                "kg m-2"     },
+  { 236, -1, 0, "ao3",            "ipcc ozone",                                "kg m-2"     },
+  { 237, -1, 0, "tropo",          "WMO defined tropopause height",             "Pa"         },
+  { 259, -1, 0, "windspeed",      "windspeed (sqrt(u^2+v^2))",                 "m/s"        },
+  { 260, -1, 0, "precip",         "total precipitation  (142+143)",            "kg m-2 s-1" },
+  { 261, -1, 0, "net_top",        "total top radiation  (178+179)",            "W m-2"      },
+  { 262, -1, 0, "net_bot",        "total surface radiation (176+177)",         "W m-2"      },
+  { 272, -1, 0, "mastfru",        "mass stream function",                      "kg/s"       },
+};
+
+static const param_type mpiom1[] = {
+  {   2, -1, 0, "THO",      "temperature",                     "C"        },
+  {   5, -1, 0, "SAO",      "salinity",                        "psu"      },
+  {   3, -1, 0, "UKO",      "zon. velocity",                   "m/s"      },
+  {   4, -1, 0, "VKE",      "mer. velocity",                   "m/s"      },
+  { 303, -1, 0, "UKOMFL",   "zon. velocity (divergence free)", "m/s"      },
+  { 304, -1, 0, "VKEMFL",   "mer. velocity (divergence free)", "m/s"      },
+  {   7, -1, 0, "WO",       "ver. velocity",                   "m/s"      },
+  {   8, -1, 0, "RHO",      "insitu density",                  "kg/m**3"  },
+  {   6, -1, 0, "PO",       "pressure",                        "Pa"       },
+  {  67, -1, 0, "EMINPO",   "freshwaterflux by restoring",     "m/s"      },
+  {  70, -1, 0, "FLUM",     "total heatflux",                  "W/m**2"   },
+  {  79, -1, 0, "PEM",      "total freshwaterflux",            "m/s"      },
+  {  13, -1, 0, "SICTHO",   "ice thickness",                   "m"        },
+  {  15, -1, 0, "SICOMO",   "ice compactness",                 "frac."    },
+  {  35, -1, 0, "SICUO",    "zon. ice velocity",               "m/s"      },
+  {  36, -1, 0, "SICVE",    "mer. ice velocity",               "m/s"      },
+  {  92, -1, 0, "TAFO",     "surface air temperature",         "C"        },
+  { 164, -1, 0, "FCLOU",    "cloud cover",                      NULL      },
+  {  52, -1, 0, "TXO",      "surface u-stress",                "Pa/1025." },
+  {  53, -1, 0, "TYE",      "surface v-stress",                "Pa/1025." },
+  { 260, -1, 0, "FPREC",    "prescr. precipitation",           "m/s"      },
+  {  80, -1, 0, "FSWR",     "downward shortwave rad.",         "W/m**2"   },
+  {  81, -1, 0, "FTDEW",    "dewpoint temperature",            "K"        },
+  { 171, -1, 0, "FU10",     "10m windspeed",                   "m/s"      },
+  { 141, -1, 0, "SICSNO",   "snow thickness",                  "m"        },
+  { 176, -1, 0, "QSWO",     "heat flux shortwave",             "W/m**2"   },
+  { 177, -1, 0, "QLWO",     "heat flux longwave",              "W/m**2"   },
+  { 147, -1, 0, "QLAO",     "heat flux latent",                "W/m**2"   },
+  { 146, -1, 0, "QSEO",     "heat flux sensible",              "W/m**2"   },
+  {  65, -1, 0, "PRECO",    "net freshwater flux + runoff",    "m/s"      },
+  {   1, -1, 0, "ZO",       "sealevel",                        "m"        },
+  {  82, -1, 0, "Z1O",      "sealevel change",                 "m"        },
+  {  69, -1, 0, "KCONDEP",  "depth of convection",             "level"    },
+  {  27, -1, 0, "PSIUWE",   "hor. bar. streamfunction",        "Sv"       },
+  {  83, -1, 0, "AMLD",     "mixed layer depth",               "m"        },
+  { 172, -1, 0, "WETO",     "landseamask (pressure points)",    NULL      },
+  { 507, -1, 0, "AMSUE",    "landseamask (vector points v)",    NULL      },
+  { 508, -1, 0, "AMSUO",    "landseamask (vector points u)",    NULL      },
+  {  84, -1, 0, "DEPTO",    "depth at pressure points",        "m"        },
+  { 484, -1, 0, "DEUTO",    "depth at vector points (u)",      "m"        },
+  { 584, -1, 0, "DEUTE",    "depth at vector points (v)",      "m"        },
+  { 184, -1, 0, "DDUO",     "level thickness (vector u )",     "m"        },
+  { 284, -1, 0, "DDUE",     "level thickness (vector v )",     "m"        },
+  { 384, -1, 0, "DDPO",     "level thickness (pressure )",     "m"        },
+  {  85, -1, 0, "DLXP",     "grid distance x",                 "m"        },
+  {  86, -1, 0, "DLYP",     "grid distance y",                 "m"        },
+  { 185, -1, 0, "DLXU",     "grid distance x  (vector u)",     "m"        },
+  { 186, -1, 0, "DLYU",     "grid distance y  (vector u)",     "m"        },
+  { 285, -1, 0, "DLXV",     "grid distance x  (vector v)",     "m"        },
+  { 286, -1, 0, "DLYV",     "grid distance y  (vector v)",     "m"        },
+  {  54, -1, 0, "GILA",     "latitude in radiants",            "rad"      },
+  {  55, -1, 0, "GIPH",     "longitude in radiants",           "rad"      },
+  { 354, -1, 0, "ALAT",     "latitude in degrees (pressure)",  "deg"      },
+  { 355, -1, 0, "ALON",     "longitude in degrees (pressure)", "deg"      },
+  { 154, -1, 0, "ALATU",    "latitude in degrees (vector u)",  "deg"      },
+  { 155, -1, 0, "ALONU",    "longitude in degrees (vector u)", "deg"      },
+  { 254, -1, 0, "ALATV",    "latitude in degrees (vector v)",  "deg"      },
+  { 255, -1, 0, "ALONV",    "longitude in degrees (vector v)", "deg"      },
+  { 110, -1, 0, "AVO",      "vertical impuls diffusion",       "m**2/s"   },
+  { 111, -1, 0, "DVO",      "vertical T,S diffusion",          "m**2/s"   },
+  { 142, -1, 0, "SICTRU",   "seaice transport x",              "m**2/s"   },
+  { 143, -1, 0, "SICTRV",   "seaice transport y",              "m**2/s"   },
+  { 612, -1, 0, "WTMIX",    "wind mixing",                     "m**2/s"   },
+  { 183, -1, 0, "zmld",     "mixed layer depth (SJ)",          "m"        },
+  { 207, -1, 0, "WGO",      "GM vertical velocity",            "m/s"      },
+  { 305, -1, 0, "rivrun",   "RiverRunoff",                     "m/s"      },
+  { 158, -1, 0, "TMCDO",    "mon. mean depth of convection",   "level"    },
+  { 247, -1, 0, "DQSWO",    "heatflux sw over water",          "W/m**2"   },
+  { 248, -1, 0, "DQLWO",    "heatflux lw over water",          "W/m**2"   },
+  { 249, -1, 0, "DQSEO",    "heatflux se over water",          "W/m**2"   },
+  { 250, -1, 0, "DQLAO",    "heatflux la over water",          "W/m**2"   },
+  { 251, -1, 0, "DQTHO",    "heatflux net over water",         "W/m**2"   },
+  { 252, -1, 0, "DQSWI",    "heatflux sw over seaice",         "W/m**2"   },
+  { 253, -1, 0, "DQLWI",    "heatflux lw over seaice",         "W/m**2"   },
+  { 254, -1, 0, "DQSEI",    "heatflux se over seaice",         "W/m**2"   },
+  { 255, -1, 0, "DQLAI",    "heatflux la over seaice",         "W/m**2"   },
+  { 256, -1, 0, "DQTHI",    "heatflux net over seaice",        "W/m**2"   },
+  { 257, -1, 0, "DTICEO",   "Equi. temp over seaice",          "K"        },
+  { 270, -1, 0, "AOFLNHWO", "oasis net heat flux water",       "W/m**2"   },
+  { 271, -1, 0, "AOFLSHWO", "oasis downward short wave",       "W/m**2"   },
+  { 272, -1, 0, "AOFLRHIO", "oasis residual heat flux ice",    "W/m**2"   },
+  { 273, -1, 0, "AOFLCHIO", "oasis conduct. heat flux ice",    "W/m**2"   },
+  { 274, -1, 0, "AOFLFRWO", "oasis fluid fresh water flux",    "m/s"      },
+  { 275, -1, 0, "AOFLFRIO", "oasis solid fresh water flux",    "m/s"      },
+  { 276, -1, 0, "AOFLTXWO", "oasis wind stress water x",       "Pa/102"   },
+  { 277, -1, 0, "AOFLTYWO", "oasis wind stress water y",       "Pa/102"   },
+  { 278, -1, 0, "AOFLTXIO", "oasis wind stress ice x",         "Pa/102"   },
+  { 279, -1, 0, "AOFLTYIO", "oasis wind stress ice x",         "Pa/102"   },
+  { 280, -1, 0, "AOFLWSVO", "oasis wind speed",                "m/s"      },
+};
+
+static const param_type ecmwf[] = {
+  {   1, -1, 0, "STRF",     "Stream function",                                            "m**2 s**-1"            },
+  {   2, -1, 0, "VPOT",     "Velocity potential",                                         "m**2 s**-1"            },
+  {   3, -1, 0, "PT",       "Potential temperature",                                      "K"                     },
+  {   4, -1, 0, "EQPT",     "Equivalent potential temperature",                           "K"                     },
+  {   5, -1, 0, "SEPT",     "Saturated equivalent potential temperature",                 "K"                     },
+  {  11, -1, 0, "UDVW",     "U component of divergent wind",                              "m s**-1"               },
+  {  12, -1, 0, "VDVW",     "V component of divergent wind",                              "m s**-1"               },
+  {  13, -1, 0, "URTW",     "U component of rotational wind",                             "m s**-1"               },
+  {  14, -1, 0, "VRTW",     "V component of rotational wind",                             "m s**-1"               },
+  {  21, -1, 0, "UCTP",     "Unbalanced component of temperature",                        "K"                     },
+  {  22, -1, 0, "UCLN",     "Unbalanced component of logarithm of surface pressure",       NULL                   },
+  {  23, -1, 0, "UCDV",     "Unbalanced component of divergence",                         "s**-1"                 },
+  {  26, -1, 0, "CL",       "Lake cover",                                                  NULL                   },
+  {  27, -1, 0, "CVL",      "Low vegetation cover",                                        NULL                   },
+  {  28, -1, 0, "CVH",      "High vegetation cover",                                       NULL                   },
+  {  29, -1, 0, "TVL",      "Type of low vegetation",                                      NULL                   },
+  {  30, -1, 0, "TVH",      "Type of high vegetation",                                     NULL                   },
+  {  31, -1, 0, "CI",       "Sea-ice cover",                                               NULL                   },
+  {  32, -1, 0, "ASN",      "Snow albedo",                                                 NULL                   },
+  {  33, -1, 0, "RSN",      "Snow density kg",                                            "m**-3"                 },
+  {  34, -1, 0, "SSTK",     "Sea surface temperature",                                    "K"                     },
+  {  35, -1, 0, "ISTL1",    "Ice surface temperature layer 1",                            "K"                     },
+  {  36, -1, 0, "ISTL2",    "Ice surface temperature layer 2",                            "K"                     },
+  {  37, -1, 0, "ISTL3",    "Ice surface temperature layer 3",                            "K"                     },
+  {  38, -1, 0, "ISTL4",    "Ice surface temperature layer 4",                            "K"                     },
+  {  39, -1, 0, "SWVL1",    "Volumetric soil water layer 1",                              "m**3 m**-3"            },
+  {  40, -1, 0, "SWVL2",    "Volumetric soil water layer 2",                              "m**3 m**-3"            },
+  {  41, -1, 0, "SWVL3",    "Volumetric soil water layer 3",                              "m**3 m**-3"            },
+  {  42, -1, 0, "SWVL4",    "Volumetric soil water layer 4",                              "m**3 m**-3"            },
+  {  43, -1, 0, "SLT",      "Soil type",                                                   NULL                   },
+  {  44, -1, 0, "ES",       "Snow evaporation m of water",                                 NULL                   },
+  {  45, -1, 0, "SMLT",     "Snowmelt m of water",                                         NULL                   },
+  {  46, -1, 0, "SDUR",     "Solar duration",                                             "s"                     },
+  {  47, -1, 0, "DSRP",     "Direct solar radiation",                                     "w m**-2"               },
+  {  48, -1, 0, "MAGSS",    "Magnitude of surface stress",                                "N m**-2 s"             },
+  {  49, -1, 0, "WG10",     "Wind gust at 10 metres",                                     "m s**-1"               },
+  {  50, -1, 0, "LSPF",     "Large-scale precipitation fraction",                         "s"                     },
+  {  51, -1, 0, "MX2T24",   "Maximum 2 metre temperature",                                "K"                     },
+  {  52, -1, 0, "MN2T24",   "Minimum 2 metre temperature",                                "K"                     },
+  {  53, -1, 0, "MONT",     "Montgomery potential",                                       "m**2 s**-2"            },
+  {  54, -1, 0, "PRES",     "Pressure",                                                   "Pa"                    },
+  {  55, -1, 0, "MEAN2T24", "Mean 2 metre temperature past 24 hours",                     "K"                     },
+  {  56, -1, 0, "MEAN2D24", "Mean 2 metre dewpoint temperature past 24 hours",            "K"                     },
+  {  60, -1, 0, "PV",       "Potential vorticity",                                        "K m**2 kg**-1 s**-1"   },
+  { 127, -1, 0, "AT",       "Atmospheric tide",                                            NULL                   },
+  { 128, -1, 0, "BV",       "Budget values",                                               NULL                   },
+  { 129, -1, 0, "Z",        "Geopotential",                                               "m**2 s**-2"            },
+  { 130, -1, 0, "T",        "Temperature",                                                "K"                     },
+  { 131, -1, 0, "U",        "U velocity",                                                 "m s**-1"               },
+  { 132, -1, 0, "V",        "V velocity",                                                 "m s**-1"               },
+  { 133, -1, 0, "Q",        "Specific humidity",                                          "kg kg**-1"             },
+  { 134, -1, 0, "SP",       "Surface pressure",                                           "Pa"                    },
+  { 135, -1, 0, "W",        "Vertical velocity",                                          "Pa s**-1"              },
+  { 136, -1, 0, "TCW",      "Total column water",                                         "kg m**-2"              },
+  { 137, -1, 0, "TCWV",     "Total column water vapour",                                  "kg m**-2"              },
+  { 138, -1, 0, "VO",       "Vorticity (relative)",                                       "s**-1"                 },
+  { 139, -1, 0, "STL1",     "Soil temperature level 1",                                   "K"                     },
+  { 140, -1, 0, "SWL1",     "Soil wetness level 1 m of water",                             NULL                   },
+  { 141, -1, 0, "SD",       "Snow depth         1 m of water equivalent",                  NULL                   },
+  { 142, -1, 0, "LSP",      "Stratiform precipitation (Large scale precipitation)",       "m"                     },
+  { 143, -1, 0, "CP",       "Convective precipitation",                                   "m"                     },
+  { 144, -1, 0, "SF",       "Snowfall (convective + stratiform)",                         "m"                     },
+  { 145, -1, 0, "BLD",      "Boundary layer dissipation",                                 "W m**-2 s"             },
+  { 146, -1, 0, "SSHF",     "Surface sensible heat flux",                                 "W m**-2 s"             },
+  { 147, -1, 0, "SLHF",     "Surface latent heat flux",                                   "W m**-2 s"             },
+  { 148, -1, 0, "CHNK",     "Charnock",                                                    NULL                   },
+  { 149, -1, 0, "SNR",      "Surface net radiation",                                      "W m**-2 s"             },
+  { 150, -1, 0, "TNR",      "Top net radiation",                                           NULL                   },
+  { 151, -1, 0, "MSL",      "Mean sea-level pressure",                                    "Pa"                    },
+  { 152, -1, 0, "LNSP",     "Logarithm of surface pressure",                               NULL                   },
+  { 153, -1, 0, "SWHR",     "Short-wave heating rate",                                    "K"                     },
+  { 154, -1, 0, "LWHR",     "Long-wave heating rate",                                     "K"                     },
+  { 155, -1, 0, "D",        "Divergence",                                                 "s**-1"                 },
+  { 156, -1, 0, "GH",       "Height m Geopotential height",                                NULL                   },
+  { 157, -1, 0, "R",        "Relative humidity",                                          "%"                     },
+  { 158, -1, 0, "TSP",      "Tendency of surface pressure",                               "Pa s**-1"              },
+  { 159, -1, 0, "BLH",      "Boundary layer height",                                      "m"                     },
+  { 160, -1, 0, "SDOR",     "Standard deviation of orography",                             NULL                   },
+  { 161, -1, 0, "ISOR",     "Anisotropy of sub-gridscale orography",                       NULL                   },
+  { 162, -1, 0, "ANOR",     "Angle of sub-gridscale orography",                           "rad"                   },
+  { 163, -1, 0, "SLOR",     "Slope of sub-gridscale orography",                            NULL                   },
+  { 164, -1, 0, "TCC",      "Total cloud cover",                                           NULL                   },
+  { 165, -1, 0, "U10M",     "10 metre U wind component",                                  "m s**-1"               },
+  { 166, -1, 0, "V10M",     "10 metre V wind component",                                  "m s**-1"               },
+  { 167, -1, 0, "T2M",      "2 metre temperature",                                        "K"                     },
+  { 168, -1, 0, "D2M",      "2 metre dewpoint temperature",                               "K"                     },
+  { 169, -1, 0, "SSRD",     "Surface solar radiation downwards",                          "W m**-2 s"             },
+  { 170, -1, 0, "STL2",     "Soil temperature level 2",                                   "K"                     },
+  { 171, -1, 0, "SWL2",     "Soil wetness level 2",                                       "m of water"            },
+  { 172, -1, 0, "LSM",      "Land/sea mask",                                               NULL                   },
+  { 173, -1, 0, "SR",       "Surface roughness",                                          "m"                     },
+  { 174, -1, 0, "AL",       "Albedo",                                                      NULL                   },
+  { 175, -1, 0, "STRD",     "Surface thermal radiation downwards",                        "W m**-2 s"             },
+  { 176, -1, 0, "SSR",      "Surface solar radiation",                                    "W m**-2 s"             },
+  { 177, -1, 0, "STR",      "Surface thermal radiation",                                  "W m**-2 s"             },
+  { 178, -1, 0, "TSR",      "Top solar radiation",                                        "W m**-2 s"             },
+  { 179, -1, 0, "TTR",      "Top thermal radiation",                                      "W m**-2 s"             },
+  { 180, -1, 0, "EWSS",     "East/West surface stress",                                   "N m**-2 s"             },
+  { 181, -1, 0, "NSSS",     "North/South surface stress",                                 "N m**-2 s"             },
+  { 182, -1, 0, "E",        "Evaporation",                                                "m of water"            },
+  { 183, -1, 0, "STL3",     "Soil temperature level 3",                                   "K"                     },
+  { 184, -1, 0, "SWL3",     "Soil wetness level 3",                                       "m of water"            },
+  { 185, -1, 0, "CCC",      "Convective cloud cover",                                      NULL                   },
+  { 186, -1, 0, "LCC",      "Low cloud cover",                                             NULL                   },
+  { 187, -1, 0, "MCC",      "Medium cloud cover",                                          NULL                   },
+  { 188, -1, 0, "HCC",      "High cloud cover",                                            NULL                   },
+  { 189, -1, 0, "SUND",     "Sunshine duration",                                          "s"                     },
+  { 190, -1, 0, "EWOV",     "EW component of subgrid orographic variance",                "m**2"                  },
+  { 191, -1, 0, "NSOV",     "NS component of subgrid orographic variance",                "m**2"                  },
+  { 192, -1, 0, "NWOV",     "NWSE component of subgrid orographic variance",              "m**2"                  },
+  { 193, -1, 0, "NEOV",     "NESW component of subgrid orographic variance",              "m**2"                  },
+  { 194, -1, 0, "BTMP",     "Brightness temperature",                                     "K"                     },
+  { 195, -1, 0, "LGWS",     "Lat. component of gravity wave stress",                      "N m**-2 s"             },
+  { 196, -1, 0, "MGWS",     "Meridional component of gravity wave stress",                "N m**-2 s"             },
+  { 197, -1, 0, "GWD",      "Gravity wave dissipation",                                   "W m**-2 s"             },
+  { 198, -1, 0, "SRC",      "Skin reservoir content",                                     "m of water"            },
+  { 199, -1, 0, "VEG",      "Vegetation fraction",                                         NULL                   },
+  { 200, -1, 0, "VSO",      "Variance of sub-gridscale orography",                        "m**2"                  },
+  { 201, -1, 0, "MX2T",     "Maximum 2 metre temperature since previous post-processing", "K"                     },
+  { 202, -1, 0, "MN2T",     "Minimum 2 metre temperature since previous post-processing", "K"                     },
+  { 203, -1, 0, "O3",       "Ozone mass mixing ratio",                                    "kg kg**-1"             },
+  { 204, -1, 0, "PAW",      "Precipiation analysis weights",                               NULL                   },
+  { 205, -1, 0, "RO",       "Runoff",                                                     "m"                     },
+  { 206, -1, 0, "TCO3",     "Total column ozone",                                         "kg m**-2"              },
+  { 207, -1, 0, "WS10",     "10 meter windspeed",                                         "m s**-1"               },
+  { 208, -1, 0, "TSRC",     "Top net solar radiation, clear sky",                         "W m**-2"               },
+  { 209, -1, 0, "TTRC",     "Top net thermal radiation, clear sky",                       "W m**-2"               },
+  { 210, -1, 0, "SSRC",     "Surface net solar radiation, clear sky",                     "W m**-2"               },
+  { 211, -1, 0, "STRC",     "Surface net thermal radiation, clear sky",                   "W m**-2"               },
+  { 212, -1, 0, "SI",       "Solar insolation",                                           "W m**-2"               },
+  { 214, -1, 0, "DHR",      "Diabatic heating by radiation",                              "K"                     },
+  { 215, -1, 0, "DHVD",     "Diabatic heating by vertical diffusion",                     "K"                     },
+  { 216, -1, 0, "DHCC",     "Diabatic heating by cumulus convection",                     "K"                     },
+  { 217, -1, 0, "DHLC",     "Diabatic heating large-scale condensation",                  "K"                     },
+  { 218, -1, 0, "VDZW",     "Vertical diffusion of zonal wind",                           "m s**-1"               },
+  { 219, -1, 0, "VDMW",     "Vertical diffusion of meridional wind",                      "m s**-1"               },
+  { 220, -1, 0, "EWGD",     "EW gravity wave drag tendency",                              "m s**-1"               },
+  { 221, -1, 0, "NSGD",     "NS gravity wave drag tendency",                              "m s**-1"               },
+  { 222, -1, 0, "CTZW",     "Convective tendency of zonal wind",                          "m s**-1"               },
+  { 223, -1, 0, "CTMW",     "Convective tendency of meridional wind",                     "m s**-1"               },
+  { 224, -1, 0, "VDH",      "Vertical diffusion of humidity",                             "kg kg**-1"             },
+  { 225, -1, 0, "HTCC",     "Humidity tendency by cumulus convection",                    "kg kg**-1"             },
+  { 226, -1, 0, "HTLC",     "Humidity tendency large-scale condensation",                 "kg kg**-1"             },
+  { 227, -1, 0, "CRNH",     "Change from removing negative humidity",                     "kg kg**-1"             },
+  { 228, -1, 0, "TP",       "Total precipitation",                                        "m"                     },
+  { 229, -1, 0, "IEWS",     "Instantaneous X surface stress",                             "N m**-2"               },
+  { 230, -1, 0, "INSS",     "Instantaneous Y surface stress",                             "N m**-2"               },
+  { 231, -1, 0, "ISHF",     "Instantaneous surface heat flux",                            "W m**-2"               },
+  { 232, -1, 0, "IE",       "Instantaneous moisture flux",                                "kg m**-2 s"            },
+  { 233, -1, 0, "ASQ",      "Apparent surface humidity",                                  "kg kg**-1"             },
+  { 234, -1, 0, "LSRH",     "Logarithm of surface roughness length for heat",              NULL                   },
+  { 235, -1, 0, "SKT",      "Skin temperature",                                           "K"                     },
+  { 236, -1, 0, "STL4",     "Soil temperature level 4",                                   "K"                     },
+  { 237, -1, 0, "SWL4",     "Soil wetness level 4",                                       "m"                     },
+  { 238, -1, 0, "TSN",      "Temperature of snow layer",                                  "K"                     },
+  { 239, -1, 0, "CSF",      "Convective snowfall",                                        "m of water equivalent" },
+  { 240, -1, 0, "LSF",      "Large-scale snowfall",                                       "m of water equivalent" },
+  { 241, -1, 0, "ACF",      "Accumulated cloud fraction tendency",                         NULL                   },
+  { 242, -1, 0, "ALW",      "Accumulated liquid water tendency",                           NULL                   },
+  { 243, -1, 0, "FAL",      "Forecast albedo",                                             NULL                   },
+  { 244, -1, 0, "FSR",      "Forecast surface roughness",                                 "m"                     },
+  { 245, -1, 0, "FLSR",     "Forecast log of surface roughness for heat",                  NULL                   },
+  { 246, -1, 0, "CLWC",     "Cloud liquid water content",                                 "kg kg**-1"             },
+  { 247, -1, 0, "CIWC",     "Cloud ice water content",                                    "kg kg**-1"             },
+  { 248, -1, 0, "CC",       "Cloud cover",                                                 NULL                   },
+  { 249, -1, 0, "AIW",      "Accumulated ice water tendency",                              NULL                   },
+  { 250, -1, 0, "ICE",      "Ice age",                                                     NULL                   },
+  { 251, -1, 0, "ATTE",     "Adiabatic tendency of temperature",                          "K"                     },
+  { 252, -1, 0, "ATHE",     "Adiabatic tendency of humidity",                             "kg kg**-1"             },
+  { 253, -1, 0, "ATZE",     "Adiabatic tendency of zonal wind",                           "m s**-1"               },
+  { 254, -1, 0, "ATMW",     "Adiabatic tendency of meridional wind",                      "m s**-1"               },
+};
+
+static const param_type remo[] = {
+  {  14, -1, 0, "FTKVM",     "turbulent transfer coefficient of momentum in the atmosphere",   NULL           },
+  {  15, -1, 0, "FTKVH",     "turbulent transfer coefficient of heat in the atmosphere",       NULL           },
+  {  38, -1, 0, "U10ER",     "10m u-velocity",                                                "m/s"           },
+  {  39, -1, 0, "V10ER",     "10m v-velocity",                                                "m/s"           },
+  {  40, -1, 0, "CAPE",      "convetive available potential energy",                           NULL           },
+  {  41, -1, 0, "GHPBL",     "height of the planetary boudary layer",                         "gpm"           },
+  {  42, -1, 0, "BETA",      "BETA",                                                           NULL           },
+  {  43, -1, 0, "WMINLOK",   "WMINLOK",                                                        NULL           },
+  {  44, -1, 0, "WMAXLOK",   "WMAXLOK",                                                        NULL           },
+  {  45, -1, 0, "VBM10M",    "maximum of the expected gust velocity near the surface",        "m/s"           },
+  {  46, -1, 0, "BFLHS",     "surface sensible heat flux",                                    "W/m**2"        },
+  {  47, -1, 0, "BFLQDS",    "surface latent heat flux",                                      "W/m**2"        },
+  {  48, -1, 0, "TMCM",      "turbulent transfer coefficient of momentum at the surface",      NULL           },
+  {  49, -1, 0, "TRSOL",     "TRSOL",                                                          NULL           },
+  {  50, -1, 0, "TMCH",      "turbulent transfer coefficient of heat at the surface",          NULL           },
+  {  51, -1, 0, "EMTEF",     "EMTEF",                                                          NULL           },
+  {  52, -1, 0, "TRSOF",     "TRSOF",                                                          NULL           },
+  {  53, -1, 0, "DRAIN",     "drainage",                                                      "mm"            },
+  {  54, -1, 0, "TSL",       "surface temperature (land)",                                    "K"             },
+  {  55, -1, 0, "TSW",       "surface temperature (water)",                                   "K"             },
+  {  56, -1, 0, "TSI",       "surface temperature (ice)",                                     "K"             },
+  {  57, -1, 0, "USTRL",     "surface u-stress (land)",                                       "Pa"            },
+  {  58, -1, 0, "USTRW",     "surface u-stress (water)",                                      "Pa"            },
+  {  59, -1, 0, "USTRI",     "surface u-stress (ice)",                                        "Pa"            },
+  {  60, -1, 0, "VSTRL",     "surface v-stress (land)",                                       "Pa"            },
+  {  61, -1, 0, "VSTRW",     "surface v-stress (water)",                                      "Pa"            },
+  {  62, -1, 0, "VSTRI",     "surface v-stress (ice)",                                        "Pa"            },
+  {  63, -1, 0, "EVAPL",     "surface evaporation (land)",                                    "mm"            },
+  {  64, -1, 0, "EVAPW",     "surface evaporation (water)",                                   "mm"            },
+  {  65, -1, 0, "EVAPI",     "surface evaporation (ice)",                                     "mm"            },
+  {  66, -1, 0, "AHFLL",     "surface latent heat flux (land)",                               "W/m**2"        },
+  {  67, -1, 0, "AHFLW",     "surface latent heat flux (water)",                              "W/m**2"        },
+  {  68, -1, 0, "AHFLI",     "surface latent heat flux (ice)",                                "W/m**2"        },
+  {  69, -1, 0, "AHFSL",     "surface sensible heat flux (land)",                             "W/m**2"        },
+  {  70, -1, 0, "AHFSW",     "surface sensible heat flux (water)",                            "W/m**2"        },
+  {  71, -1, 0, "AHFSI",     "surface sensible heat flux (ice)",                              "W/m**2"        },
+  {  72, -1, 0, "AZ0L",      "surface roughness length (land)",                               "m"             },
+  {  73, -1, 0, "AZ0W",      "surface roughness length (water)",                              "m"             },
+  {  74, -1, 0, "AZ0I",      "surface roughness length (ice)",                                "m"             },
+  {  75, -1, 0, "ALSOL",     "surface albedo (land)",                                         "fract."        },
+  {  76, -1, 0, "ALSOW",     "surface albedo (water)",                                        "fract."        },
+  {  77, -1, 0, "ALSOI",     "surface albedo (ice)",                                          "fract."        },
+  {  81, -1, 0, "TMCHL",     "turbulent transfer coefficient of heat at the surface (land)",   NULL           },
+  {  82, -1, 0, "TMCHW",     "turbulent transfer coefficient of heat at the surface (water)",  NULL           },
+  {  83, -1, 0, "TMCHI",     "turbulent transfer coefficient of heat at the surface (ice)",    NULL           },
+  {  84, -1, 0, "QDBL",      "specific humidity surface (land)",                              "kg/kg"         },
+  {  85, -1, 0, "QDBW",      "specific humidity surface (water)",                             "kg/kg"         },
+  {  86, -1, 0, "QDBI",      "specific humidity surface (ice)",                               "kg/kg"         },
+  {  87, -1, 0, "BFLHSL",    "surface sensible heat flux (land)",                             "W/m**2"        },
+  {  88, -1, 0, "BFLHSW",    "surface sensible heat flux (water)",                            "W/m**2"        },
+  {  89, -1, 0, "BFLHSI",    "surface sensible heat flux (ice)",                              "W/m**2"        },
+  {  90, -1, 0, "BFLQDSL",   "surface latent heat flux (land)",                               "W/m**2"        },
+  {  91, -1, 0, "BFLQDSW",   "surface latent heat flux (water)",                              "W/m**2"        },
+  {  92, -1, 0, "BFLQDSI",   "surface latent heat flux (ice)",                                "W/m**2"        },
+  {  93, -1, 0, "AHFICE",    "sea-ice: conductive heat",                                      "W/m"           },
+  {  94, -1, 0, "QRES",      "residual heat flux for melting sea ice",                        "W/m**2"        },
+  {  95, -1, 0, "SRFL",      "SRFL",                                                           NULL           },
+  {  96, -1, 0, "QDBOXS",    "horizontal transport of water vapour",                          "kg/m**2"       },
+  {  97, -1, 0, "QWBOXS",    "horizontal transport of cloud water",                           "kg/m**2"       },
+  {  98, -1, 0, "EKBOXS",    "horizontal transport of kinetic energy",                        "(3600*J)/m**2" },
+  {  99, -1, 0, "FHBOXS",    "horizontal transport of sensible heat",                         "(3600*J)/m**2" },
+  { 100, -1, 0, "FIBOXS",    "horizontal transport of potential energy",                      "(3600*J)/m**2" },
+  { 101, -1, 0, "TLAMBDA",   "heat conductivity of dry soil",                                 "W/(K*m)"       },
+  { 103, -1, 0, "DLAMBDA",   "parameter for increasing the heat conductivity of the soil",     NULL           },
+  { 104, -1, 0, "PORVOL",    "pore volume",                                                    NULL           },
+  { 105, -1, 0, "FCAP",      "field capacity of soil",                                         NULL           },
+  { 106, -1, 0, "WI3",       "fraction of frozen soil",                                        NULL           },
+  { 107, -1, 0, "WI4",       "fraction of frozen soil",                                        NULL           },
+  { 108, -1, 0, "WI5",       "fraction of frozen soil",                                        NULL           },
+  { 109, -1, 0, "WI",        "fraction of frozen soil",                                        NULL           },
+  { 110, -1, 0, "WICL",      "fraction of frozen soil",                                        NULL           },
+  { 112, -1, 0, "QDB",       "specific humidity surface",                                     "kg/kg"         },
+  { 129, -1, 0, "FIB",       "surface geopotential (orography)",                              "m"             },
+  { 130, -1, 0, "T",         "temperature",                                                   "K"             },
+  { 131, -1, 0, "U",         "u-velocity",                                                    "m/s"           },
+  { 132, -1, 0, "V",         "v-velocity",                                                    "m/s"           },
+  { 133, -1, 0, "QD",        "specific humidity",                                             "kg/kg"         },
+  { 134, -1, 0, "PS",        "Surface pressure",                                              "Pa"            },
+  { 135, -1, 0, "VERVEL",    "Vertical velocity",                                             "Pa/s"          },
+  { 138, -1, 0, "SVO",       "vorticity",                                                     "1/s"           },
+  { 139, -1, 0, "TS",        "surface temperature",                                           "K"             },
+  { 140, -1, 0, "WS",        "soil wetness",                                                  "m"             },
+  { 141, -1, 0, "SN",        "snow depth",                                                    "m"             },
+  { 142, -1, 0, "APRL",      "large scale precipitation",                                     "mm"            },
+  { 143, -1, 0, "APRC",      "convective  precipitation",                                     "mm"            },
+  { 144, -1, 0, "APRS",      "snow fall",                                                     "mm"            },
+  { 145, -1, 0, "VDIS",      "boundary layer dissipation",                                    "W/m**2"        },
+  { 146, -1, 0, "AHFS",      "surface sensible heat flux",                                    "W/m**2"        },
+  { 147, -1, 0, "AHFL",      "surface latent heat flux",                                      "W/m**2"        },
+  { 148, -1, 0, "STREAM",    "streamfunction",                                                "m**2/s"        },
+  { 149, -1, 0, "VELOPOT",   "velocity potential",                                            "m**2/s"        },
+  { 151, -1, 0, "PSRED",     "mean sea level pressure",                                       "Pa"            },
+  { 152, -1, 0, "LSP",       "log surface pressure",                                           NULL           },
+  { 153, -1, 0, "QW",        "liquid water content",                                          "kg/kg"         },
+  { 155, -1, 0, "SD",        "divergence",                                                    "1/s"           },
+  { 156, -1, 0, "FI",        "geopotential height",                                           "gpm"           },
+  { 159, -1, 0, "USTAR3",    "ustar**3",                                                      "m**3/s**3"     },
+  { 160, -1, 0, "RUNOFF",    "surface runoff",                                                "mm"            },
+  { 162, -1, 0, "ACLC",      "cloud cover",                                                   "fract."        },
+  { 163, -1, 0, "ACLCV",     "total cloud cover",                                             "fract."        },
+  { 164, -1, 0, "ACLCOV",    "total cloud cover",                                             "fract."        },
+  { 165, -1, 0, "U10",       "10m u-velocity",                                                "m/s"           },
+  { 166, -1, 0, "V10",       "10m v-velocity",                                                "m/s"           },
+  { 167, -1, 0, "TEMP2",     "2m temperature",                                                "K"             },
+  { 168, -1, 0, "DEW2",      "2m dew point temperature",                                      "K"             },
+  { 169, -1, 0, "TSURF",     "surface temperature (land)",                                    "K"             },
+  { 170, -1, 0, "TD",        "deep soil temperature",                                         "K"             },
+  { 171, -1, 0, "WIND10",    "10m windspeed",                                                 "m/s"           },
+  { 172, -1, 0, "BLA",       "land sea mask",                                                 "fract."        },
+  { 173, -1, 0, "AZ0",       "surface roughness length",                                      "m"             },
+  { 174, -1, 0, "ALB",       "surface background albedo",                                     "fract."        },
+  { 175, -1, 0, "ALBEDO",    "surface albedo",                                                "fract."        },
+  { 176, -1, 0, "SRADS",     "net surface solar radiation",                                   "W/m**2"        },
+  { 177, -1, 0, "TRADS",     "net surface thermal radiation",                                 "W/m**2"        },
+  { 178, -1, 0, "SRAD0",     "net top solar radiation",                                       "W/m**2"        },
+  { 179, -1, 0, "TRAD0",     "top thermal radiation (OLR)",                                   "W/m**2"        },
+  { 180, -1, 0, "USTR",      "surface u-stress",                                              "Pa"            },
+  { 181, -1, 0, "VSTR",      "surface v-stress",                                              "Pa"            },
+  { 182, -1, 0, "EVAP",      "surface evaporation",                                           "mm"            },
+  { 183, -1, 0, "TDCL",      "soil temperature",                                              "K"             },
+  { 185, -1, 0, "SRAFS",     "net surf. solar radiation   (clear sky)",                       "W/m**2"        },
+  { 186, -1, 0, "TRAFS",     "net surf. thermal radiation (clear sky)",                       "W/m**2"        },
+  { 187, -1, 0, "SRAF0",     "net top solar radiation     (clear sky)",                       "W/m**2"        },
+  { 188, -1, 0, "TRAF0",     "net top thermal radiation   (clear sky)",                       "W/m**2"        },
+  { 189, -1, 0, "SCLFS",     "surface solar cloud forcing",                                   "W/m**2"        },
+  { 190, -1, 0, "TCLFS",     "surface thermal cloud forcing",                                 "W/m**2"        },
+  { 191, -1, 0, "SCLF0",     "top solar cloud forcing",                                       "W/m**2"        },
+  { 192, -1, 0, "TCLF0",     "top thermal cloud forcing",                                     "W/m**2"        },
+  { 194, -1, 0, "WL",        "skin reservoir content",                                        "m"             },
+  { 195, -1, 0, "USTRGW",    "u-gravity wave stress",                                         "Pa"            },
+  { 196, -1, 0, "VSTRGW",    "v-gravity wave stress",                                         "Pa"            },
+  { 197, -1, 0, "VDISGW",    "gravity wave dissipation",                                      "W/m**2"        },
+  { 198, -1, 0, "VGRAT",     "vegetation ratio",                                               NULL           },
+  { 199, -1, 0, "VAROR",     "orographic variance (for surface runoff)",                       NULL           },
+  { 200, -1, 0, "VLT",       "leaf area index",                                                NULL           },
+  { 201, -1, 0, "T2MAX",     "maximum 2m-temperature",                                        "K"             },
+  { 202, -1, 0, "T2MIN",     "minimum 2m-temperature",                                        "K"             },
+  { 203, -1, 0, "SRAD0U",    "top solar radiation upward",                                    "W/m**2"        },
+  { 204, -1, 0, "SRADSU",    "surface solar radiation upward",                                "W/m**2"        },
+  { 205, -1, 0, "TRADSU",    "surface thermal radiation upward",                              "W/m**2"        },
+  { 206, -1, 0, "TSN",       "snow temperature",                                              "K"             },
+  { 207, -1, 0, "TD3",       "soil temperature",                                              "K"             },
+  { 208, -1, 0, "TD4",       "soil temperature",                                              "K"             },
+  { 209, -1, 0, "TD5",       "soil temperature",                                              "K"             },
+  { 210, -1, 0, "SEAICE",    "sea ice cover",                                                 "fract."        },
+  { 211, -1, 0, "SICED",     "sea ice depth",                                                 "m"             },
+  { 212, -1, 0, "FOREST",    "vegetation type",                                                NULL           },
+  { 213, -1, 0, "TEFF",      "(effective) sea-ice skin temperature",                          "K"             },
+  { 214, -1, 0, "TSMAX",     "maximum surface temperature",                                   "K"             },
+  { 215, -1, 0, "TSMIN",     "minimum surface temperature",                                   "K"             },
+  { 216, -1, 0, "WIMAX",     "maximum 10m-wind speed",                                        "m/s"           },
+  { 217, -1, 0, "TOPMAX",    "maximum height of convective cloud tops",                       "Pa"            },
+  { 218, -1, 0, "SNMEL",     "snow melt",                                                     "mm"            },
+  { 220, -1, 0, "TSLIN",     "land: residual surface heat budget",                            "W/m**2"        },
+  { 221, -1, 0, "DSNAC",     "snow depth change",                                             "mm"            },
+  { 222, -1, 0, "EMTER",     "EMTER",                                                          NULL           },
+  { 223, -1, 0, "ACLCAC",    "cloud cover",                                                   "fract."        },
+  { 224, -1, 0, "TKE",       "turbulent kinetic energy",                                       NULL           },
+  { 226, -1, 0, "FAO",       "FAO data set (soil data flags)",                                 NULL           },
+  { 227, -1, 0, "RGCGN",     "heat capacity of soil",                                          NULL           },
+  { 229, -1, 0, "WSMX",      "field capacity of soil",                                         NULL           },
+  { 230, -1, 0, "QVI",       "vertically integrated specific humidity",                       "kg/m**2"       },
+  { 231, -1, 0, "ALWCVI",    "vertically integrated liquid water cont.",                      "kg/m**2"       },
+  { 232, -1, 0, "GLAC",      "glacier mask",                                                   NULL           },
+  { 253, -1, 0, "PHI",       "latitude in real coordinates",                                  "degrees_north" },
+  { 254, -1, 0, "RLA",       "longitude in real coordinates",                                 "degrees_east"  },
+  { 259, -1, 0, "WINDSPEED", "windspeed (sqrt(u**2+v**2))",                                    NULL           },
+  { 260, -1, 0, "PRECIP",    "total precipitation",                                            NULL           },
+};
+
+static const param_type cosmo002[] = {
+  {   1, -1, 0, "P",         "pressure",                                          "Pa"         },
+  {   2, -1, 0, "PMSL",      "mean sea level pressure",                           "Pa"         },
+  {   3, -1, 0, "DPSDT",     "surface pressure change",                           "Pa s-1"     },
+  {   6, -1, 0, "FI",        "geopotential",                                      "m2 s-2"     },
+  {   8, -1, 0, "HH",        "height",                                            "m"          },
+  {  10, -1, 0, "TO3",       "vertical integrated ozone content",                 "Dobson"     },
+  {  11, -1, 0, "T",         "temperature",                                       "K"          },
+  {  15, -1, 0, "TMAX",      "2m maximum temperature",                            "K"          },
+  {  16, -1, 0, "TMIN",      "2m minimum temperature",                            "K"          },
+  {  17, -1, 0, "TD",        "2m dew point temperature",                          "K"          },
+  {  31, -1, 0, "DD",        "undefined",                                         "undefined"  },
+  {  32, -1, 0, "FF",        "undefined",                                         "undefined"  },
+  {  33, -1, 0, "U",         "U-component of wind",                               "m s-1"      },
+  {  34, -1, 0, "V",         "V-component of wind",                               "m s-1"      },
+  {  39, -1, 0, "OMEGA",     "omega",                                             "Pa s-1"     },
+  {  40, -1, 0, "W",         "vertical wind velocity",                            "m s-1"      },
+  {  51, -1, 0, "QV",        "specific humidity",                                 "kg kg-1"    },
+  {  52, -1, 0, "RELHUM",    "relative humidity",                                 "%"          },
+  {  54, -1, 0, "TQV",       "precipitable water",                                "kg m-2"     },
+  {  57, -1, 0, "AEVAP",     "surface evaporation",                               "kg m-2"     },
+  {  58, -1, 0, "TQI",       "vertical integrated cloud ice",                     "kg m-2"     },
+  {  59, -1, 0, "TOT_PR",    "total precipitation rate",                          "kg m-2 s-1" },
+  {  61, -1, 0, "TOT_PREC",  "total precipitation amount",                        "kg m-2"     },
+  {  65, -1, 0, "W_SNOW",    "surface snow amount",                               "m"          },
+  {  66, -1, 0, "H_SNOW",    "thickness of snow",                                 "m"          },
+  {  71, -1, 0, "CLCT",      "total cloud cover",                                 "1"          },
+  {  72, -1, 0, "CLC_CON",   "convective cloud area fraction",                    "1"          },
+  {  73, -1, 0, "CLCL",      "low cloud cover",                                   "1"          },
+  {  74, -1, 0, "CLCM",      "medium cloud cover",                                "1"          },
+  {  75, -1, 0, "CLCH",      "high cloud cover",                                  "1"          },
+  {  76, -1, 0, "TQC",       "vertical integrated cloud water",                   "kg m-2"     },
+  {  78, -1, 0, "SNOW_CON",  "convective snowfall",                               "kg m-2"     },
+  {  79, -1, 0, "SNOW_GSP",  "large scale snowfall",                              "kg m-2"     },
+  {  81, -1, 0, "FR_LAND",   "land-sea fraction",                                 "1"          },
+  {  83, -1, 0, "Z0",        "surface roughness length",                          "m"          },
+  {  84, -1, 0, "ALB_RAD",   "surface albedo",                                    "1"          },
+  {  85, -1, 0, "TSOIL",     "soil surface temperature",                          "K"          },
+  {  86, -1, 0, "WSOIL",     "water content of 1. soil layer",                    "m"          },
+  {  87, -1, 0, "PLCOV",     "vegetation area fraction",                          "1"          },
+  {  90, -1, 0, "RUNOFF",    "subsurface runoff",                                 "kg m-2"     },
+  {  91, -1, 0, "FR_ICE",    "sea ice area fraction",                             "1"          },
+  {  92, -1, 0, "H_ICE",     "sea ice thickness",                                 "m"          },
+  { 111, -1, 0, "ASOB",      "averaged surface net downward shortwave radiation", "W m-2"      },
+  { 112, -1, 0, "ATHB",      "averaged surface net downward longwave radiation",  "W m-2"      },
+  { 113, -1, 0, "ASOB",      "averaged TOA net downward shortwave radiation",     "W m-2"      },
+  { 114, -1, 0, "ATHB",      "averaged TOA outgoing longwave radiation",          "W m-2"      },
+  { 115, -1, 0, "ASWDIR",    "direct downward sw radiation at the surface",       "W m-2"      },
+  { 116, -1, 0, "ASWDIFD",   "diffuse downward sw radiation at the surface",      "W m-2"      },
+  { 117, -1, 0, "ASWDIFU",   "diffuse upwnward sw radiation at the surface",      "W m-2"      },
+  { 118, -1, 0, "ALWD",      "downward lw radiation at the surface",              "W m-2"      },
+  { 119, -1, 0, "ALWU",      "upward lw radiation at the surface",                "W m-2"      },
+  { 121, -1, 0, "ALHFL",     "averaged surface latent heat flux",                 "W m-2"      },
+  { 122, -1, 0, "ASHFL",     "averaged surface sensible heat flux",               "W m-2"      },
+  { 124, -1, 0, "AUMFL",     "averaged eastward stress",                          "Pa"         },
+  { 125, -1, 0, "AVMFL",     "averaged northward stress",                         "Pa"         },
+  { 128, -1, 0, "SUNSH",     "undefined",                                         "undefined"  },
+  { 129, -1, 0, "SUNSH2",    "undefined",                                         "undefined"  },
+  { 130, -1, 0, "SUN_SUM",   "undefined",                                         "undefined"  },
+  { 131, -1, 0, "SUN_SUM2",  "undefined",                                         "undefined"  },
+  { 133, -1, 0, "FCOR",      "undefined",                                         "undefined"  },
+  { 134, -1, 0, "SKYVIEW",   "sky-view factor",                                   "1"          },
+  { 137, -1, 0, "SWDIR_COR", "topo correction of direct solar radiarion",         "1"          },
+};
+
+static const param_type cosmo201[] = {
+  {   5, -1, 0, "APAB",      "&",                                                         "W m-2"      },
+  {  13, -1, 0, "SOHR_RAD",  "&",                                                         "K s-1"      },
+  {  14, -1, 0, "THHR_RAD",  "&",                                                         "K s-1"      },
+  {  20, -1, 0, "DURSUN",    "duration of sunshine",                                      "s"          },
+  {  29, -1, 0, "CLC",       "cloud area fraction",                                       "1"          },
+  {  30, -1, 0, "CLC_SGS",   "grid scale cloud area fraction",                            "1"          },
+  {  31, -1, 0, "QC",        "specific cloud liquid water content",                       "kg kg-1"    },
+  {  33, -1, 0, "QI",        "specific cloud ice content",                                "kg kg-1"    },
+  {  35, -1, 0, "QR",        "specific rain content",                                     "kg kg-1"    },
+  {  36, -1, 0, "QS",        "specific snow content",                                     "kg kg-1"    },
+  {  37, -1, 0, "TQR",       "total rain water content vertically integrated",            "kg m-2"     },
+  {  38, -1, 0, "TQS",       "total snow content vertically integrated",                  "kg m-2"     },
+  {  39, -1, 0, "QG",        "specific graupel content",                                  "kg kg-1"    },
+  {  40, -1, 0, "TQG",       "total graupel content vertically integrated",               "kg m-2"     },
+  {  41, -1, 0, "TWATER",    "cloud condensed water content",                             "kg m-2"     },
+  {  42, -1, 0, "TDIV_HUM",  "atmosphere water divergence",                               "kg m-2"     },
+  {  43, -1, 0, "QC_RAD",    "sub scale specific cloud liquid water content",             "kg kg-1"    },
+  {  44, -1, 0, "QI_RAD",    "sub scale specific cloud ice content",                      "kg kg-1"    },
+  {  61, -1, 0, "CLW_CON",   "convective cloud liquid water",                             "1"          },
+  {  68, -1, 0, "HBAS_CON",  "height of convective cloud base",                           "m"          },
+  {  69, -1, 0, "HTOP_CON",  "height of convective cloud top",                            "m"          },
+  {  70, -1, 0, "HBAS_CONI", "height of convective cloud base",                           "m"          },
+  {  71, -1, 0, "HTOP_CONI", "height of convective cloud top",                            "m"          },
+  {  72, -1, 0, "BAS_CON",   "index of convective cloud base",                            "1"          },
+  {  73, -1, 0, "TOP_CON",   "index of convective cloud top",                             "1"          },
+  {  74, -1, 0, "DT_CON",    "convective tendency of temperature",                        "K s-1"      },
+  {  75, -1, 0, "DQV_CON",   "convective tendency of specific humidity",                  "s-1"        },
+  {  78, -1, 0, "DU_CON",    "convective tendency of u-wind component",                   "m s-2"      },
+  {  79, -1, 0, "DV_CON",    "convective tendency of v-wind component",                   "m s-2"      },
+  {  82, -1, 0, "HTOP_DC",   "height of dry convection top",                              "m"          },
+  {  84, -1, 0, "HZEROCL",   "height of freezing level",                                  "m"          },
+  {  85, -1, 0, "SNOWLMT",   "height of the snow fall limit in m above sea level",        "m"          },
+  {  86, -1, 0, "HCBAS",     "height of cloud base",                                      "m"          },
+  {  87, -1, 0, "HCTOP",     "height of cloud top",                                       "m"          },
+  {  91, -1, 0, "C_T_LK",    "&",                                                         "1"          },
+  {  92, -1, 0, "GAMSO_LK",  "&",                                                         "m-1"        },
+  {  93, -1, 0, "DP_BS_LK",  "&",                                                         "m"          },
+  {  94, -1, 0, "H_B1_LK",   "&",                                                         "m"          },
+  {  95, -1, 0, "H_ML_LK",   "&",                                                         "m"          },
+  {  96, -1, 0, "DEPTH_LK",  "lake depth",                                                "m"          },
+  {  97, -1, 0, "FETCH_LK",  "wind fetch over lake",                                      "m"          },
+  {  99, -1, 0, "QRS",       "precipitation water (water loading)",                       "1"          },
+  { 100, -1, 0, "PRR_GSP",   "mass flux density of large scale rainfall",                 "kg m-2 s-1" },
+  { 101, -1, 0, "PRS_GSP",   "mass flux density of large scale snowfall",                 "kg m-2 s-1" },
+  { 102, -1, 0, "RAIN_GSP",  "large scale rainfall",                                      "kg m-2"     },
+  { 111, -1, 0, "PRR_CON",   "mass flux density of convective rainfall",                  "kg m-2 s-1" },
+  { 112, -1, 0, "PRS_CON",   "mass flux density of convective snowfall",                  "kg m-2 s-1" },
+  { 113, -1, 0, "RAIN_CON",  "convective rainfall",                                       "kg m-2"     },
+  { 129, -1, 0, "FRESHSNW",  "freshness of snow",                                         "undefined"  },
+  { 131, -1, 0, "PRG_GSP",   "mass flux density of large scale graupel",                  "kg m-2 s-1" },
+  { 132, -1, 0, "GRAU_GSP",  "large scale graupel",                                       "kg m-2"     },
+  { 133, -1, 0, "RHO_SNOW",  "density of snow",                                           "kg m-3"     },
+  { 139, -1, 0, "PP",        "deviation from reference pressure",                         "Pa"         },
+  { 140, -1, 0, "RCLD",      "standard deviation of saturation deficit",                  "undefined"  },
+  { 143, -1, 0, "CAPE_MU",   "cape of most unstable parcel",                              "J kg-1"     },
+  { 144, -1, 0, "CIN_MU",    "convective inhibition of most unstable parcel",             "J kg-1"     },
+  { 145, -1, 0, "CAPE_ML",   "cape of mean surface layer parcel",                         "J kg-1"     },
+  { 146, -1, 0, "CIN_ML",    "convective inhibition of mean surface layer parcel",        "J kg-1"     },
+  { 147, -1, 0, "TKE_CON",   "convective turbulent kinetic energy",                       "undefined"  },
+  { 148, -1, 0, "TKETENS",   "tendency of turbulent kinetic energy",                      "undefined"  },
+  { 152, -1, 0, "TKE",       "turbulent kinetic energy",                                  "m2 s-2"     },
+  { 153, -1, 0, "TKVM",      "diffusion coefficient of momentum",                         "m2 s-1"     },
+  { 154, -1, 0, "TKVH",      "diffusion coefficient of heat",                             "m2 s-1"     },
+  { 170, -1, 0, "TCM",       "drag coefficient of momentum",                              "1"          },
+  { 171, -1, 0, "TCH",       "drag coefficient of heat",                                  "1"          },
+  { 187, -1, 0, "VMAX",      "maximum turbulent wind gust in 10m",                        "m s-1"      },
+  { 190, -1, 0, "TSOIL",     "&",                                                         "K"          },
+  { 191, -1, 0, "TSOIL",     "&",                                                         "K"          },
+  { 192, -1, 0, "TSOIL",     "&",                                                         "K"          },
+  { 193, -1, 0, "TSOIL",     "mixed layer temperature",                                   "K"          },
+  { 194, -1, 0, "TSOIL",     "mean temperature of water column",                          "K"          },
+  { 197, -1, 0, "TSOIL",     "soil temperature",                                          "K"          },
+  { 198, -1, 0, "W_SO",      "soil water content",                                        "m"          },
+  { 199, -1, 0, "W_SO_ICE",  "soil frozen water content",                                 "m"          },
+  { 200, -1, 0, "W_I",       "canopy water amount",                                       "m"          },
+  { 203, -1, 0, "TSOIL",     "snow surface temperature",                                  "K"          },
+  { 215, -1, 0, "TSOIL",     "temperature of ice upper surface",                          "K"          },
+  { 230, -1, 0, "dBZ",       "unattenuated radar reflectivity in Rayleigh approximation", "1"          },
+  { 240, -1, 0, "MFLX_CON",  "convective mass flux density",                              "kg m-2 s-1" },
+  { 241, -1, 0, "CAPE_CON",  "&",                                                         "J kg-1"     },
+  { 243, -1, 0, "QCVG_CON",  "&",                                                         "s-1"        },
+};
+
+static const param_type cosmo202[] = {
+  {  46, -1, 0, "SSO_STDH",  "standard deviation of subgrid scale height",                "m"         },
+  {  47, -1, 0, "SSO_GAMMA", "anisotropy of topography",                                  "-"         },
+  {  48, -1, 0, "SSO_THETA", "angle between principal axis of orography and global east", "-"         },
+  {  49, -1, 0, "SSO_SIGMA", "mean slope of subgrid scale orography",                     "-"         },
+  {  55, -1, 0, "FR_LAKE",   "fraction of inland lake water",                             "1"         },
+  {  57, -1, 0, "SOILTYP",   "soil type",                                                 "1"         },
+  {  61, -1, 0, "LAI",       "leaf area index",                                           "1"         },
+  {  62, -1, 0, "ROOTDP",    "root depth",                                                "m"         },
+  {  64, -1, 0, "HMO3",      "air pressure at ozone maximum",                             "Pa"        },
+  {  65, -1, 0, "VIO3",      "vertical integrated ozone amount",                          "Pa"        },
+  {  67, -1, 0, "PLCOV_MX",  "vegetation area fraction maximum",                          "1"         },
+  {  68, -1, 0, "PLCOV_MN",  "vegetation area fraction minimum",                          "1"         },
+  {  69, -1, 0, "LAI_MX",    "leaf area index maximum",                                   "1"         },
+  {  70, -1, 0, "LAI_MN",    "leaf area index minimum",                                   "1"         },
+  {  75, -1, 0, "FOR_E",     "ground fraction covered by evergreen forest",               "-"         },
+  {  76, -1, 0, "FOR_D",     "ground fraction covered by deciduous forest",               "-"         },
+  { 104, -1, 0, "DQVDT",     "tendency of water vapor",                                   "s-1"       },
+  { 105, -1, 0, "QVSFLX",    "surface flux of water vapour",                              "s-1m-2"    },
+  { 113, -1, 0, "FC",        "coriolis parameter",                                        "s-1"       },
+  { 114, -1, 0, "RLAT",      "latitude",                                                  "radian"    },
+  { 115, -1, 0, "RLON",      "longitude",                                                 "radian"    },
+  { 121, -1, 0, "ZTD",       "integrated total atmospheric refractivity",                 "undefined" },
+  { 122, -1, 0, "ZWD",       "integrated wet atmospheric refractivity",                   "undefined" },
+  { 123, -1, 0, "ZHD",       "integrated dry atmospheric refractivity",                   "undefined" },
+  { 180, -1, 0, "O3",        "ozone mass mixing ratio",                                   "kg kg-1"   },
+  { 200, -1, 0, "I131a",     "undefined",                                                 "undefined" },
+  { 201, -1, 0, "I131a_DD",  "undefined",                                                 "undefined" },
+  { 202, -1, 0, "I131a_WD",  "undefined",                                                 "undefined" },
+  { 203, -1, 0, "Cs137",     "undefined",                                                 "undefined" },
+  { 204, -1, 0, "Cs137_DD",  "undefined",                                                 "undefined" },
+  { 205, -1, 0, "Cs137_WD",  "undefined",                                                 "undefined" },
+  { 206, -1, 0, "Te132",     "undefined",                                                 "undefined" },
+  { 207, -1, 0, "Te132_DD",  "undefined",                                                 "undefined" },
+  { 208, -1, 0, "Te132_WD",  "undefined",                                                 "undefined" },
+  { 209, -1, 0, "Zr95",      "undefined",                                                 "undefined" },
+  { 210, -1, 0, "Zr95_DD",   "undefined",                                                 "undefined" },
+  { 211, -1, 0, "Zr95_WD",   "undefined",                                                 "undefined" },
+  { 212, -1, 0, "Kr85",      "undefined",                                                 "undefined" },
+  { 213, -1, 0, "Kr85_DD",   "undefined",                                                 "undefined" },
+  { 214, -1, 0, "Kr85_WD",   "undefined",                                                 "undefined" },
+  { 215, -1, 0, "TRACER",    "undefined",                                                 "undefined" },
+  { 216, -1, 0, "TRACER_DD", "undefined",                                                 "undefined" },
+  { 217, -1, 0, "TRACER_WD", "undefined",                                                 "undefined" },
+  { 218, -1, 0, "Xe133",     "undefined",                                                 "undefined" },
+  { 219, -1, 0, "Xe133_DD",  "undefined",                                                 "undefined" },
+  { 220, -1, 0, "Xe133_WD",  "undefined",                                                 "undefined" },
+  { 221, -1, 0, "I131g",     "undefined",                                                 "undefined" },
+  { 222, -1, 0, "I131g_DD",  "undefined",                                                 "undefined" },
+  { 223, -1, 0, "I131g_WD",  "undefined",                                                 "undefined" },
+  { 224, -1, 0, "I131o",     "undefined",                                                 "undefined" },
+  { 225, -1, 0, "I131o_DD",  "undefined",                                                 "undefined" },
+  { 226, -1, 0, "I131o_WD",  "undefined",                                                 "undefined" },
+  { 227, -1, 0, "Ba140",     "undefined",                                                 "undefined" },
+  { 228, -1, 0, "Ba140_DD",  "undefined",                                                 "undefined" },
+  { 229, -1, 0, "Ba140_WD",  "undefined",                                                 "undefined" },
+  { 230, -1, 0, "Sr90",      "undefined",                                                 "undefined" },
+  { 231, -1, 0, "Sr90_DD",   "undefined",                                                 "undefined" },
+  { 232, -1, 0, "Sr90_WD",   "undefined",                                                 "undefined" },
+  { 233, -1, 0, "Ru103",     "undefined",                                                 "undefined" },
+  { 234, -1, 0, "Ru103_DD",  "undefined",                                                 "undefined" },
+  { 235, -1, 0, "Ru103_WD",  "undefined",                                                 "undefined" },
+};
+
+static const param_type cosmo203[] = {
+  { 135, -1, 0, "LCL_ML",   "undefined",                  "undefined" },
+  { 136, -1, 0, "LFC_ML",   "undefined",                  "undefined" },
+  { 137, -1, 0, "CAPE_3KM", "undefined",                  "undefined" },
+  { 138, -1, 0, "SWISS00",  "swiss00 index",              "1"         },
+  { 139, -1, 0, "SWISS12",  "swiss12 index",              "1"         },
+  { 147, -1, 0, "SLI",      "surface lifted index",       "K"         },
+  { 149, -1, 0, "SI",       "showalter index",            "K"         },
+  { 155, -1, 0, "BRN",      "undefined",                  "undefined" },
+  { 156, -1, 0, "HPBL",     "undefined",                  "undefined" },
+  { 203, -1, 0, "CLDEPTH",  "normalized cloud depth",     "1"         },
+  { 204, -1, 0, "CLCT_MOD", "modified_total_cloud_cover", "1"         },
+};
+
+static const param_type cosmo205[] = {
+  {   1, -1, 0, "SYNME5", "synthetic satellite images Meteosat5", "-" },
+  {   2, -1, 0, "SYNME6", "synthetic satellite images Meteosat6", "-" },
+  {   3, -1, 0, "SYNME7", "synthetic satellite images Meteosat7", "-" },
+  {   4, -1, 0, "SYNMSG", "synthetic satellite images MSG",       "-" },
+};
+
+static const param_type cosmo250[] = {
+  {   1, -1, 0, "QNH",       "sea level air pressure",                                         "hPa"                                },
+  {  11, -1, 0, "TSOIL",     "2m temperature",                                                 "K"                                  },
+  {  12, -1, 0, "TSOIL",     "2m temperature",                                                 "K"                                  },
+  {  13, -1, 0, "D_T_2M_K",  "kalman correction to 2m temperature",                            "K"                                  },
+  {  14, -1, 0, "TSOIL",     "2m temperature",                                                 "K"                                  },
+  {  15, -1, 0, "TSOIL",     "2m temperature",                                                 "K"                                  },
+  {  16, -1, 0, "RH_ICE",    "relative humidity over ice",                                     "%"                                  },
+  {  17, -1, 0, "TD",        "dew point temperature",                                          "K"                                  },
+  {  18, -1, 0, "D_TD",      "dew point depression",                                           "K"                                  },
+  {  19, -1, 0, "THETAE",    "equivalent potential temperature",                               "K"                                  },
+  {  20, -1, 0, "TD_2M_K",   "2m dew point temperature",                                       "K"                                  },
+  {  21, -1, 0, "D_TD_2M_K", "kalman correction to 2m dew point temperature",                  "K"                                  },
+  {  22, -1, 0, "TD_2M_OLD", "2m dew point temperature",                                       "K"                                  },
+  {  23, -1, 0, "TD_2M_BUZ", "2m dew point temperature",                                       "K"                                  },
+  {  24, -1, 0, "HI",        "heat index",                                                     "Fahrenheit"                         },
+  {  25, -1, 0, "DURSUN_M",  "maximum duration of sunshine",                                   "s"                                  },
+  {  26, -1, 0, "DURSUN_R",  "relative duration of sunshine",                                  "%"                                  },
+  {  52, -1, 0, "RH_2M_K",   "2m relative humidity",                                           "%"                                  },
+  {  53, -1, 0, "D_RH_2M_K", "kalman correction to 2m relative humidity",                      "%"                                  },
+  {  58, -1, 0, "CLI_RATIO", "cloud ice ratio (Qi/Qc+Qi)",                                     "%"                                  },
+  {  61, -1, 0, "TOT_SNOW",  "total precipitation in snow",                                    "kg/m**2"                            },
+  {  62, -1, 0, "TOT_RAIN",  "total precipitation in rain",                                    "kg/m**2"                            },
+  {  63, -1, 0, "TOT_CON",   "total convective precipitation",                                 "kg/m**2"                            },
+  {  64, -1, 0, "TOT_GSP",   "total large scale precipitation",                                "kg/m**2"                            },
+  {  65, -1, 0, "SNOW_%",    "percentage of precipitation in snow",                            "%"                                  },
+  {  66, -1, 0, "CONV_%",    "percentage of convective precipitation",                         "%"                                  },
+  {  67, -1, 0, "VORTP_ABS", "absolute",                                                       "VORTP_ABS 67 -1 absolute vorticity" },
+  {  68, -1, 0, "VORTP_REL", "relative",                                                       "VORTP_REL 68 -1 relative vorticity" },
+  {  70, -1, 0, "PDIFF_CON", "pressure difference between cloud base and cloud top",           "Pa"                                 },
+  {  71, -1, 0, "TTOP_CON",  "temperature at cloud top",                                       "K"                                  },
+  {  80, -1, 0, "GEM",       "emissivity of the ground",                                       "%"                                  },
+  {  82, -1, 0, "Z0LOC",     "local surface roughness length",                                 "m"                                  },
+  { 110, -1, 0, "LUM",       "luminosity",                                                     "klux"                               },
+  { 111, -1, 0, "GLOB",      "global shortwave radiation at surface",                          "W/m**2"                             },
+  { 112, -1, 0, "LW_IN_TG",  "incoming longwave radiation at surface",                         "W/m**2"                             },
+  { 113, -1, 0, "LW_IN_TS",  "incoming longwave radiation at surface",                         "W/m**2"                             },
+  { 114, -1, 0, "LW_IN_T2M", "incoming longwave radiation at surface",                         "W/m**2"                             },
+  { 115, -1, 0, "SWISS_WE",  "Swiss",                                                          "SWISS_WE 115 1 Swiss coordinates"   },
+  { 116, -1, 0, "SWISS_SN",  "Swiss",                                                          "SWISS_SN 116 1 Swiss coordinates"   },
+  { 150, -1, 0, "KOINDEX",   "KO index",                                                       "K"                                  },
+  { 151, -1, 0, "TTINDEX",   "total-totals index",                                             "K"                                  },
+  { 152, -1, 0, "DCI",       "deep convection index",                                          "K"                                  },
+  { 153, -1, 0, "SWEAT",     "severe weather thread index",                                    "undefined"                          },
+  { 154, -1, 0, "ADEDO2",    "adedokun 2 index",                                               "K"                                  },
+  { 160, -1, 0, "C_TSTORM",  "thunderstorm index using AdaBoost classifier",                   "undefined"                          },
+  { 161, -1, 0, "CN_TSTORM", "thunderstorm probabilty using AdaBoost classifier",              "%"                                  },
+  { 200, -1, 0, "WSHEARL",   "wind shear between surface and 3 km asl",                        "1/s"                                },
+  { 201, -1, 0, "WSHEARM",   "wind shear between surface and 6 km asl",                        "1/s"                                },
+  { 202, -1, 0, "WSHEARU",   "wind shear between 3 km (or surface) and 6 km asl",              "1/s"                                },
+  { 211, -1, 0, "VWIN",      "maximum OLD turbulent wind gust in 10m",                         "m s-1"                              },
+  { 212, -1, 0, "VW10M_20",  "maximum 10m wind speed",                                         "m s-1"                              },
+  { 213, -1, 0, "VW10M_25",  "duration of VWIN_10M above 25 knots",                            "s"                                  },
+  { 214, -1, 0, "VW10M_30",  "duration of VWIN_10M above 30 knots",                            "s"                                  },
+  { 215, -1, 0, "VW10M_35",  "duration of VWIN_10M above 35 knots",                            "s"                                  },
+  { 216, -1, 0, "VW10M_40",  "duration of VWIN_10M above 40 knots",                            "s"                                  },
+  { 217, -1, 0, "VW10M_45",  "duration of VWIN_10M above 45 knots",                            "s"                                  },
+  { 218, -1, 0, "VW10M_50",  "duration of VWIN_10M above 50 knots",                            "s"                                  },
+  { 219, -1, 0, "VOLD",      "maximum turbulent wind gust in 10m",                             "m s-1"                              },
+  { 220, -1, 0, "VJPS",      "maximum turbulent wind gust in 10m",                             "m s-1"                              },
+  { 221, -1, 0, "VBRA",      "maximum Brasseur turbulent wind gust in 10m",                    "m s-1"                              },
+  { 222, -1, 0, "VB10M_20",  "duration of VBRA_10M above 20 knots",                            "s"                                  },
+  { 223, -1, 0, "VB10M_25",  "duration of VBRA_10M above 25 knots",                            "s"                                  },
+  { 224, -1, 0, "VB10M_30",  "duration of VBRA_10M above 30 knots",                            "s"                                  },
+  { 225, -1, 0, "VB10M_35",  "duration of VBRA_10M above 35 knots",                            "s"                                  },
+  { 226, -1, 0, "VB10M_40",  "duration of VBRA_10M above 40 knots",                            "s"                                  },
+  { 227, -1, 0, "VB10M_45",  "duration of VBRA_10M above 45 knots",                            "s"                                  },
+  { 228, -1, 0, "VB10M_50",  "duration of VBRA_10M above 50 knots",                            "s"                                  },
+  { 231, -1, 0, "VCON",      "maximum convective wind gust in 10m",                            "m s-1"                              },
+  { 232, -1, 0, "VC10M_20",  "duration of VCON_10M above 20 knots",                            "s"                                  },
+  { 233, -1, 0, "VC10M_25",  "duration of VCON_10M above 25 knots",                            "s"                                  },
+  { 234, -1, 0, "VC10M_30",  "duration of VCON_10M above 30 knots",                            "s"                                  },
+  { 235, -1, 0, "VC10M_35",  "duration of VCON_10M above 35 knots",                            "s"                                  },
+  { 236, -1, 0, "VC10M_40",  "duration of VCON_10M above 40 knots",                            "s"                                  },
+  { 237, -1, 0, "VC10M_45",  "duration of VCON_10M above 45 knots",                            "s"                                  },
+  { 238, -1, 0, "VC10M_50",  "duration of VCON_10M above 50 knots",                            "s"                                  },
+  { 241, -1, 0, "FMAX",      "maximum wind speed at k=ke",                                     "m s-1"                              },
+  { 242, -1, 0, "USTARMAX",  "maximal u*=SQRT(Drag_coef)*fmax_10m",                            "m s-1"                              },
+  { 243, -1, 0, "GLOB_DIF",  "global diffuse shortwave radiation at the surface",              "W/m**2"                             },
+  { 244, -1, 0, "GLOB_DIR",  "global direct (beam) shortwave radiation at the surface",        "W/m**2"                             },
+  { 245, -1, 0, "GLOB_vE",   "global shortwave radiation on a vertical surface facing east",   "W/m**2"                             },
+  { 246, -1, 0, "GLOB_vS",   "global shortwave radiation on a vertical surface facing south",  "W/m**2"                             },
+  { 247, -1, 0, "GLOB_vW",   "global shortwave radiation on a vertical surface facing west",   "W/m**2"                             },
+  { 248, -1, 0, "GLOB_vN",   "global shortwave radiation on a vertical surface facing north",  "W/m**2"                             },
+  { 249, -1, 0, "LW_TG_vS",  "incoming longwave radiation on a vertical surface facing south", "W/m**2"                             },
+  { 250, -1, 0, "ENTH",      "enthalpy",                                                       "kJ/kg"                              },
+  { 251, -1, 0, "ENTH",      "enthalpy",                                                       "kJ/kg"                              },
+  { 252, -1, 0, "MIXRAT",    "mixing ratio",                                                   "g/kg"                               },
+  { 253, -1, 0, "MIXRAT",    "mixing ratio",                                                   "g/kg"                               },
+  { 254, -1, 0, "TW",        "wet bulb temperature",                                           "degC"                               },
+  { 255, -1, 0, "TW",        "wet bulb temperature",                                           "degC"                               },
+};
+
+
+static
+void tableDefault(void)
+{
+
+  // define table : echam4
+  {
+    int instID = institutInq(98, 255, "MPIMET", NULL);
+    if (instID == -1) instID = institutDef(98, 255, "MPIMET", NULL);
+
+    int modelID = modelInq(instID, 0, "ECHAM4");
+    if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM4");
+
+    int tableID = tableDef(modelID, 128, "echam4");
+
+    tableLink(tableID, echam4, sizeof(echam4) / sizeof(param_type));
+  }
+
+  // define table : echam5
+  {
+    int instID = institutInq(98, 232, "MPIMET", NULL);
+    if (instID == -1) instID = institutDef(98, 232, "MPIMET", NULL);
+
+    int modelID = modelInq(instID, 0, "ECHAM5");
+    if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM5");
+
+    int tableID = tableDef(modelID, 128, "echam5");
+
+    tableLink(tableID, echam5, sizeof(echam5) / sizeof(param_type));
+  }
+
+  // define table : echam6
+  {
+    int instID = institutInq(0, 0, "MPIMET", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL);
+
+    int modelID = modelInq(instID, 0, "ECHAM6");
+    if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM6");
+
+    int tableID = tableDef(modelID, 128, "echam6");
+
+    tableLink(tableID, echam6, sizeof(echam6) / sizeof(param_type));
+  }
+
+  // define table : mpiom1
+  {
+    int instID = institutInq(0, 0, "MPIMET", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL);
+
+    int modelID = modelInq(instID, 0, "MPIOM1");
+    if (modelID == -1) modelID = modelDef(instID, 0, "MPIOM1");
+
+    int tableID = tableDef(modelID, 128, "mpiom1");
+
+    tableLink(tableID, mpiom1, sizeof(mpiom1) / sizeof(param_type));
+  }
+
+  // define table : ecmwf
+  {
+    int instID = institutInq(0, 0, "ECMWF", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "ECMWF", NULL);
+
+    int modelID = modelInq(instID, 0, "");
+    if (modelID == -1) modelID = modelDef(instID, 0, "");
+
+    int tableID = tableDef(modelID, 128, "ecmwf");
+
+    tableLink(tableID, ecmwf, sizeof(ecmwf) / sizeof(param_type));
+  }
+
+  // define table : remo
+  {
+    int instID = institutInq(0, 0, "MPIMET", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL);
+
+    int modelID = modelInq(instID, 0, "REMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "REMO");
+
+    int tableID = tableDef(modelID, 128, "remo");
+
+    tableLink(tableID, remo, sizeof(remo) / sizeof(param_type));
+  }
+
+  // define table : cosmo002
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 002, "cosmo002");
+
+    tableLink(tableID, cosmo002, sizeof(cosmo002) / sizeof(param_type));
+  }
+
+  // define table : cosmo201
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 201, "cosmo201");
+
+    tableLink(tableID, cosmo201, sizeof(cosmo201) / sizeof(param_type));
+  }
+
+  // define table : cosmo202
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 202, "cosmo202");
+
+    tableLink(tableID, cosmo202, sizeof(cosmo202) / sizeof(param_type));
+  }
+
+  // define table : cosmo203
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 203, "cosmo203");
+
+    tableLink(tableID, cosmo203, sizeof(cosmo203) / sizeof(param_type));
+  }
+
+  // define table : cosmo205
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 205, "cosmo205");
+
+    tableLink(tableID, cosmo205, sizeof(cosmo205) / sizeof(param_type));
+  }
+
+  // define table : cosmo250
+  {
+    int instID = institutInq(0, 0, "MCH", NULL);
+    if (instID == -1) instID = institutDef(0, 0, "MCH", NULL);
+
+    int modelID = modelInq(instID, 0, "COSMO");
+    if (modelID == -1) modelID = modelDef(instID, 0, "COSMO");
+
+    int tableID = tableDef(modelID, 250, "cosmo250");
+
+    tableLink(tableID, cosmo250, sizeof(cosmo250) / sizeof(param_type));
+  }
+}
+
+// clang-format on
+
+#endif /* TABLE_H */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+
+
+#define MAX_TABLE 256
+#define MAX_PARS 1024
+
+typedef struct
+{
+  bool used;
+  int npars;
+  int modelID;
+  int number;
+  char *name;
+  param_type *pars;
+} paramtab_type;
+
+static paramtab_type parTable[MAX_TABLE];
+static int parTableSize = MAX_TABLE;
+static int parTableNum = 0;
+static int ParTableInit = 0;
+
+static char *tablePath = NULL;
+
+static void tableDefModelID(int tableID, int modelID);
+static void tableDefNum(int tableID, int tablenum);
+
+static void
+tableDefEntry(int tableID, int id, int ltype, const char *name, const char *longname, const char *units)
+{
+  if (tableID >= 0 && tableID < MAX_TABLE && parTable[tableID].used)
+    {
+    }
+  else
+    Error("Invalid table ID %d", tableID);
+
+  int item = parTable[tableID].npars++;
+  parTable[tableID].pars[item].id = id;
+  parTable[tableID].pars[item].ltype = ltype;
+  parTable[tableID].pars[item].dupflags = 0;
+  parTable[tableID].pars[item].name = NULL;
+  parTable[tableID].pars[item].longname = NULL;
+  parTable[tableID].pars[item].units = NULL;
+
+  if (name && name[0])
+    {
+      parTable[tableID].pars[item].name = strdup(name);
+      parTable[tableID].pars[item].dupflags |= TABLE_DUP_NAME;
+    }
+  if (longname && longname[0])
+    {
+      parTable[tableID].pars[item].longname = strdup(longname);
+      parTable[tableID].pars[item].dupflags |= TABLE_DUP_LONGNAME;
+    }
+  if (units && units[0])
+    {
+      parTable[tableID].pars[item].units = strdup(units);
+      parTable[tableID].pars[item].dupflags |= TABLE_DUP_UNITS;
+    }
+}
+
+void
+tableLink(int tableID, const param_type *pars, int npars)
+{
+  for (int item = 0; item < npars; item++)
+    {
+      parTable[tableID].pars[item].id = pars[item].id;
+      parTable[tableID].pars[item].ltype = pars[item].ltype;
+      parTable[tableID].pars[item].dupflags = 0;
+      parTable[tableID].pars[item].name = pars[item].name;
+      parTable[tableID].pars[item].longname = pars[item].longname;
+      parTable[tableID].pars[item].units = pars[item].units;
+    }
+
+  parTable[tableID].npars = npars;
+}
+
+static void
+parTableInitEntry(int tableID)
+{
+  parTable[tableID].used = false;
+  parTable[tableID].pars = NULL;
+  parTable[tableID].npars = 0;
+  parTable[tableID].modelID = CDI_UNDEFID;
+  parTable[tableID].number = CDI_UNDEFID;
+  parTable[tableID].name = NULL;
+}
+
+static void
+tableGetPath(void)
+{
+  char *path = getenv("TABLEPATH");
+  if (path) tablePath = strdup(path);
+  // printf("tablePath = %s\n", tablePath);
+}
+
+static void
+parTableFinalize(void)
+{
+  for (int tableID = 0; tableID < MAX_TABLE; ++tableID)
+    if (parTable[tableID].used)
+      {
+        int npars = parTable[tableID].npars;
+        for (int item = 0; item < npars; ++item)
+          {
+            param_type *param = &parTable[tableID].pars[item];
+            if (param->dupflags & TABLE_DUP_NAME) free((void *) param->name);
+            if (param->dupflags & TABLE_DUP_LONGNAME) free((void *) param->longname);
+            if (param->dupflags & TABLE_DUP_UNITS) free((void *) param->units);
+          }
+        free(parTable[tableID].pars);
+        free(parTable[tableID].name);
+      }
+}
+
+static void
+parTableInit(void)
+{
+  ParTableInit = 1;
+
+  atexit(parTableFinalize);
+  if (cdiPartabIntern) tableDefault();
+
+  tableGetPath();
+}
+
+static int
+tableNewEntry(void)
+{
+  int tableID = 0;
+
+  static int init = 0;
+  if (!init)
+    {
+      for (tableID = 0; tableID < parTableSize; tableID++) parTableInitEntry(tableID);
+      init = 1;
+    }
+
+  // Look for a free slot in parTable.
+  for (tableID = 0; tableID < parTableSize; tableID++)
+    {
+      if (!parTable[tableID].used) break;
+    }
+
+  if (tableID == parTableSize) Error("no more entries!");
+
+  parTable[tableID].used = true;
+  parTableNum++;
+
+  return tableID;
+}
+
+static int
+decodeForm1(char *pline, char *name, char *longname, char *units)
+{
+  char *pstart, *pend;
+
+  // FIXME: parse success isn't verified
+  /* long level =  */ strtol(pline, &pline, 10);
+  while (isspace((int) *pline)) pline++;
+
+  pstart = pline;
+  while (!(isspace((int) *pline) || *pline == 0)) pline++;
+  size_t len = (size_t) (pline - pstart);
+  if (len > 0)
+    {
+      memcpy(name, pstart, len);
+      name[len] = 0;
+    }
+  else
+    return 0;
+
+  if (pline[0] == 0) return 0;
+
+  // Format 1 : code name add mult longname [units]
+  // FIXME: successful parse isn't verified
+  /* double add  =  */ strtod(pline, &pline);
+  // FIXME: successful parse isn't verified
+  /* double mult =  */ strtod(pline, &pline);
+
+  while (isspace((int) *pline)) pline++;
+
+  len = strlen(pline);
+  if (len > 0)
+    {
+      pstart = pline;
+      pend = strrchr(pline, '[');
+      if (pend == pstart)
+        len = 0;
+      else
+        {
+          if (pend)
+            pend--;
+          else
+            pend = pstart + len;
+          while (isspace((int) *pend)) pend--;
+          len = (size_t) (pend - pstart + 1);
+        }
+      if (len > 0)
+        {
+          memcpy(longname, pstart, len);
+          longname[len] = 0;
+        }
+      pstart = strrchr(pline, '[');
+      if (pstart)
+        {
+          pstart++;
+          while (isspace((int) *pstart)) pstart++;
+          pend = strchr(pstart, ']');
+          if (!pend) return 0;
+          pend--;
+          while (isspace((int) *pend)) pend--;
+          len = (size_t) (pend - pstart + 1);
+          if (len > 0)
+            {
+              memcpy(units, pstart, len);
+              units[len] = 0;
+            }
+        }
+    }
+
+  return 0;
+}
+
+static int
+decodeForm2(char *pline, char *name, char *longname, char *units)
+{
+  // Format 2 : code | name | longname | units
+  char *pend;
+
+  pline = strchr(pline, '|');
+  pline++;
+
+  while (isspace((int) *pline)) pline++;
+  if (*pline != '|')
+    {
+      pend = strchr(pline, '|');
+      if (!pend)
+        {
+          pend = pline;
+          while (!isspace((int) *pend)) pend++;
+          size_t len = (size_t) (pend - pline);
+          if (len > 0)
+            {
+              memcpy(name, pline, len);
+              name[len] = 0;
+            }
+          return 0;
+        }
+      else
+        {
+          pend--;
+          while (isspace((int) *pend)) pend--;
+          size_t len = (size_t) (pend - pline + 1);
+          if (len > 0)
+            {
+              memcpy(name, pline, len);
+              name[len] = 0;
+            }
+        }
+    }
+  else
+    name[0] = '\0';
+
+  pline = strchr(pline, '|');
+  pline++;
+  while (isspace((int) *pline)) pline++;
+  pend = strchr(pline, '|');
+  if (!pend) pend = strchr(pline, 0);
+  pend--;
+  while (isspace((int) *pend)) pend--;
+  {
+    size_t len = (size_t) (pend - pline + 1);
+    if (len > 0)
+      {
+        memcpy(longname, pline, len);
+        longname[len] = 0;
+      }
+  }
+
+  pline = strchr(pline, '|');
+  if (pline)
+    {
+      pline++;
+      while (isspace((int) *pline)) pline++;
+      pend = strchr(pline, '|');
+      if (!pend) pend = strchr(pline, 0);
+      pend--;
+      while (isspace((int) *pend)) pend--;
+      ptrdiff_t len = pend - pline + 1;
+      if (len < 0) len = 0;
+      memcpy(units, pline, (size_t) len);
+      units[len] = 0;
+    }
+
+  return 0;
+}
+
+int
+tableRead(const char *tablefile)
+{
+  char line[1024], *pline;
+  char name[256], longname[256], units[256];
+  int tableID = CDI_UNDEFID;
+
+  FILE *tablefp = fopen(tablefile, "r");
+  if (tablefp == NULL) return tableID;
+
+  const char *tablename = strrchr(tablefile, '/');
+  if (tablename == 0)
+    tablename = tablefile;
+  else
+    tablename++;
+
+  tableID = tableDef(-1, 0, tablename);
+
+  while (fgets(line, 1023, tablefp))
+    {
+      size_t len = strlen(line);
+      if (line[len - 1] == '\n') line[len - 1] = '\0';
+      name[0] = 0;
+      longname[0] = 0;
+      units[0] = 0;
+      if (line[0] == '#') continue;
+      pline = line;
+
+      len = strlen(pline);
+      if (len < 4) continue;
+      while (isspace((int) *pline)) pline++;
+      int id = atoi(pline);
+      // if ( id > 255 ) id -= 256;
+      if (id == 0) continue;
+
+      while (isdigit((int) *pline)) pline++;
+
+      int ltype = CDI_UNDEFID;
+      if (*pline == ';' || *pline == ':')
+        {
+          pline++;
+          ltype = atoi(pline);
+          while (isdigit((int) *pline)) pline++;
+
+          if (*pline == ';' || *pline == ':')
+            {
+              pline++;
+              while (isdigit((int) *pline)) pline++;
+            }
+        }
+
+      while (isdigit((int) *pline)) pline++;
+
+      int err = (strchr(pline, '|')) ? decodeForm2(pline, name, longname, units) : decodeForm1(pline, name, longname, units);
+      if (err) continue;
+
+      if (name[0] == 0) snprintf(name, sizeof(name), "var%d", id);
+
+      tableDefEntry(tableID, id, ltype, name, longname, units);
+    }
+
+  return tableID;
+}
+
+static int
+tableFromEnv(int modelID, int tablenum)
+{
+  char tablename[256] = { '\0' };
+  size_t tablenameLen = 0;
+  int instID;
+
+  const char *name2Use;
+  {
+    const char *modelName, *instName;
+    if ((modelName = modelInqNamePtr(modelID)))
+      name2Use = modelName;
+    else if ((instID = modelInqInstitut(modelID)) != CDI_UNDEFID && (instName = institutInqNamePtr(instID)))
+      name2Use = instName;
+    else
+      return CDI_UNDEFID;
+  }
+  tablenameLen = strlen(name2Use);
+  memcpy(tablename, name2Use, tablenameLen);
+  if (tablenum) tablenameLen += (size_t) (snprintf(tablename + tablenameLen, 256 - tablenameLen, "_%03d", tablenum));
+  size_t lenp = 0, lenf = tablenameLen;
+  if (tablePath) lenp = strlen(tablePath);
+  // if (tablePath) printf("tablePath = %s\n", tablePath);
+  // if (tablename) printf("tableName = %s\n", tablename);
+  char *tablefile = (char *) malloc(lenp + lenf + 3);
+  if (tablePath)
+    {
+      strcpy(tablefile, tablePath);
+      strcat(tablefile, "/");
+    }
+  else
+    tablefile[0] = '\0';
+  strcat(tablefile, tablename);
+  // if (tablefile) printf("tableFile = %s\n", tablefile);
+
+  int tableID = tableRead(tablefile);
+  if (tableID != CDI_UNDEFID)
+    {
+      tableDefModelID(tableID, modelID);
+      tableDefNum(tableID, tablenum);
+    }
+  // printf("tableID = %d %s\n", tableID, tablefile);
+  free(tablefile);
+
+  return tableID;
+}
+
+int
+tableInq(int modelID, int tablenum, const char *tablename)
+{
+  int tableID = CDI_UNDEFID;
+  int modelID2 = CDI_UNDEFID;
+  char tablefile[256] = { '\0' };
+
+  if (!ParTableInit) parTableInit();
+
+  if (tablename)
+    {
+      strcpy(tablefile, tablename);
+      /*
+      printf("tableInq: tablefile = >%s<\n", tablefile);
+      */
+      /* search for internal table */
+      for (tableID = 0; tableID < MAX_TABLE; tableID++)
+        {
+          if (parTable[tableID].used && parTable[tableID].name)
+            {
+              /* len = strlen(parTable[tableID].name); */
+              size_t len = strlen(tablename);
+              if (memcmp(parTable[tableID].name, tablename, len) == 0) break;
+            }
+        }
+      if (tableID == MAX_TABLE) tableID = CDI_UNDEFID;
+      if (CDI_Debug) Message("tableID = %d tablename = %s", tableID, tablename);
+    }
+  else
+    {
+      for (tableID = 0; tableID < MAX_TABLE; tableID++)
+        {
+          if (parTable[tableID].used)
+            {
+              if (parTable[tableID].modelID == modelID && parTable[tableID].number == tablenum) break;
+            }
+        }
+
+      if (tableID == MAX_TABLE) tableID = CDI_UNDEFID;
+
+      if (tableID == CDI_UNDEFID)
+        {
+          if (modelID != CDI_UNDEFID)
+            {
+              const char *modelName;
+              if ((modelName = modelInqNamePtr(modelID)))
+                {
+                  strcpy(tablefile, modelName);
+                  size_t len = strlen(tablefile);
+                  for (size_t i = 0; i < len; i++)
+                    if (tablefile[i] == '.') tablefile[i] = '\0';
+                  modelID2 = modelInq(-1, 0, tablefile);
+                }
+            }
+          if (modelID2 != CDI_UNDEFID)
+            for (tableID = 0; tableID < MAX_TABLE; tableID++)
+              {
+                if (parTable[tableID].used)
+                  {
+                    if (parTable[tableID].modelID == modelID2 && parTable[tableID].number == tablenum) break;
+                  }
+              }
+        }
+
+      if (tableID == MAX_TABLE) tableID = CDI_UNDEFID;
+
+      if (tableID == CDI_UNDEFID && modelID != CDI_UNDEFID) tableID = tableFromEnv(modelID, tablenum);
+
+      if (CDI_Debug && tablename) Message("tableID = %d tablename = %s", tableID, tablename);
+    }
+
+  return tableID;
+}
+
+int
+tableDef(int modelID, int tablenum, const char *tablename)
+{
+  int tableID = CDI_UNDEFID;
+
+  if (!ParTableInit) parTableInit();
+  // if (!(modelID == CDI_UNDEFID && tablenum == 0)) tableID = tableInq(modelID, tablenum, tablename);
+  if (tableID == CDI_UNDEFID)
+    {
+      tableID = tableNewEntry();
+
+      parTable[tableID].modelID = modelID;
+      parTable[tableID].number = tablenum;
+      if (tablename) parTable[tableID].name = strdup(tablename);
+
+      parTable[tableID].pars = (param_type *) malloc(MAX_PARS * sizeof(param_type));
+    }
+
+  return tableID;
+}
+
+static void
+tableDefModelID(int tableID, int modelID)
+{
+  parTable[tableID].modelID = modelID;
+}
+
+static void
+tableDefNum(int tableID, int tablenum)
+{
+  parTable[tableID].number = tablenum;
+}
+
+int
+tableInqNum(int tableID)
+{
+  int number = 0;
+
+  if (tableID >= 0 && tableID < MAX_TABLE) number = parTable[tableID].number;
+
+  return number;
+}
+
+int
+tableInqModel(int tableID)
+{
+  int modelID = -1;
+
+  if (tableID >= 0 && tableID < MAX_TABLE) modelID = parTable[tableID].modelID;
+
+  return modelID;
+}
+
+static void
+partabCheckID(int item)
+{
+  if (item < 0 || item >= parTableSize) Error("item %d undefined!", item);
+
+  if (!parTable[item].name) Error("item %d name undefined!", item);
+}
+
+const char *
+tableInqNamePtr(int tableID)
+{
+  const char *tablename = NULL;
+
+  if (CDI_Debug) Message("tableID = %d", tableID);
+
+  if (!ParTableInit) parTableInit();
+
+  if (tableID >= 0 && tableID < parTableSize)
+    if (parTable[tableID].name) tablename = parTable[tableID].name;
+
+  return tablename;
+}
+
+static size_t
+max_length(size_t maxlen, const char *cstring)
+{
+  if (cstring)
+    {
+      size_t len = strlen(cstring);
+      if (len > maxlen) maxlen = len;
+    }
+  return maxlen;
+}
+
+void
+tableWrite(const char *ptfile, int tableID)
+{
+  size_t maxname = 4, maxlname = 10, maxunits = 2;
+  int instID = CDI_UNDEFID;
+  int center = 0, subcenter = 0;
+  const char *instnameptr = NULL, *modelnameptr = NULL;
+
+  if (CDI_Debug) Message("write parameter table %d to %s", tableID, ptfile);
+
+  if (tableID == CDI_UNDEFID)
+    {
+      Warning("parameter table ID undefined");
+      return;
+    }
+
+  partabCheckID(tableID);
+
+  FILE *ptfp = fopen(ptfile, "w");
+
+  int npars = parTable[tableID].npars;
+  for (int item = 0; item < npars; item++)
+    {
+      maxname = max_length(maxname, parTable[tableID].pars[item].name);
+      maxlname = max_length(maxlname, parTable[tableID].pars[item].longname);
+      maxunits = max_length(maxunits, parTable[tableID].pars[item].units);
+    }
+
+  int tablenum = tableInqNum(tableID);
+  int modelID = parTable[tableID].modelID;
+  if (modelID != CDI_UNDEFID)
+    {
+      modelnameptr = modelInqNamePtr(modelID);
+      instID = modelInqInstitut(modelID);
+    }
+  if (instID != CDI_UNDEFID)
+    {
+      center = institutInqCenter(instID);
+      subcenter = institutInqSubcenter(instID);
+      instnameptr = institutInqNamePtr(instID);
+    }
+
+  fprintf(ptfp, "# Parameter table\n");
+  fprintf(ptfp, "#\n");
+  if (tablenum) fprintf(ptfp, "# TABLE_ID=%d\n", tablenum);
+  fprintf(ptfp, "# TABLE_NAME=%s\n", parTable[tableID].name);
+  if (modelnameptr) fprintf(ptfp, "# TABLE_MODEL=%s\n", modelnameptr);
+  if (instnameptr) fprintf(ptfp, "# TABLE_INSTITUT=%s\n", instnameptr);
+  if (center) fprintf(ptfp, "# TABLE_CENTER=%d\n", center);
+  if (subcenter) fprintf(ptfp, "# TABLE_SUBCENTER=%d\n", subcenter);
+  fprintf(ptfp, "#\n");
+  fprintf(ptfp, "#\n");
+  fprintf(ptfp, "# id       = parameter ID\n");
+  fprintf(ptfp, "# name     = variable name\n");
+  fprintf(ptfp, "# title    = long name (description)\n");
+  fprintf(ptfp, "# units    = variable units\n");
+  fprintf(ptfp, "#\n");
+  fprintf(ptfp, "# The format of each record is:\n");
+  fprintf(ptfp, "#\n");
+  fprintf(ptfp, "# id | %-*s | %-*s | %-*s\n", (int) maxname, "name", (int) maxlname, "title", (int) maxunits, "units");
+
+  for (int item = 0; item < npars; item++)
+    {
+      const char *name = parTable[tableID].pars[item].name, *longname = parTable[tableID].pars[item].longname,
+                 *units = parTable[tableID].pars[item].units;
+      if (name == NULL) name = " ";
+      if (longname == NULL) longname = " ";
+      if (units == NULL) units = " ";
+      fprintf(ptfp, "%4d | %-*s | %-*s | %-*s\n", parTable[tableID].pars[item].id, (int) maxname, name, (int) maxlname, longname,
+              (int) maxunits, units);
+    }
+
+  fclose(ptfp);
+}
+
+void
+tableFWriteC(FILE *ptfp, int tableID)
+{
+  const char chelp[] = "";
+  size_t maxname = 0, maxlname = 0, maxunits = 0;
+  char tablename[256];
+
+  if (tableID == CDI_UNDEFID)
+    {
+      Warning("parameter table ID undefined");
+      return;
+    }
+
+  partabCheckID(tableID);
+
+  int npars = parTable[tableID].npars;
+  for (int item = 0; item < npars; item++)
+    {
+      maxname = max_length(maxname, parTable[tableID].pars[item].name);
+      maxlname = max_length(maxlname, parTable[tableID].pars[item].longname);
+      maxunits = max_length(maxunits, parTable[tableID].pars[item].units);
+    }
+
+  strncpy(tablename, parTable[tableID].name, sizeof(tablename) - 1);
+  tablename[sizeof(tablename) - 1] = '\0';
+  {
+    size_t len = strlen(tablename);
+    for (size_t i = 0; i < len; i++)
+      if (tablename[i] == '.') tablename[i] = '_';
+  }
+  fprintf(ptfp, "static const param_type %s[] = {\n", tablename);
+
+  for (int item = 0; item < npars; item++)
+    {
+      size_t len = strlen(parTable[tableID].pars[item].name),
+             llen = parTable[tableID].pars[item].longname ? strlen(parTable[tableID].pars[item].longname) : 0,
+             ulen = parTable[tableID].pars[item].units ? strlen(parTable[tableID].pars[item].units) : 0;
+      fprintf(ptfp, "  {%4d, -1, 0, \"%s\", %-*s%c%s%s, %-*s%c%s%s %-*s},\n", parTable[tableID].pars[item].id,
+              parTable[tableID].pars[item].name, (int) (maxname - len), chelp, llen ? '"' : ' ',
+              llen ? parTable[tableID].pars[item].longname : "NULL", llen ? "\"" : "", (int) (maxlname - (llen ? llen : 3)), chelp,
+              ulen ? '"' : ' ', ulen ? parTable[tableID].pars[item].units : "NULL", ulen ? "\"" : "",
+              (int) (maxunits - (ulen ? ulen : 3)), chelp);
+    }
+
+  fprintf(ptfp, "};\n\n");
+}
+
+void
+tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units)
+{
+  if (((tableID >= 0) & (tableID < MAX_TABLE)) | (tableID == CDI_UNDEFID))
+    {
+    }
+  else
+    Error("Invalid table ID %d", tableID);
+
+  if (tableID != CDI_UNDEFID)
+    {
+      int npars = parTable[tableID].npars;
+      for (int item = 0; item < npars; item++)
+        {
+          if (parTable[tableID].pars[item].id == id
+              && (parTable[tableID].pars[item].ltype == -1 || ltype == -1 || parTable[tableID].pars[item].ltype == ltype))
+            {
+              if (name && parTable[tableID].pars[item].name) strcpy(name, parTable[tableID].pars[item].name);
+              if (longname && parTable[tableID].pars[item].longname) strcpy(longname, parTable[tableID].pars[item].longname);
+              if (units && parTable[tableID].pars[item].units) strcpy(units, parTable[tableID].pars[item].units);
+
+              break;
+            }
+        }
+    }
+}
+
+int
+tableInqParCode(int tableID, char *varname, int *code)
+{
+  int err = 1;
+
+  if (tableID != CDI_UNDEFID && varname != NULL)
+    {
+      int npars = parTable[tableID].npars;
+      for (int item = 0; item < npars; item++)
+        {
+          if (parTable[tableID].pars[item].name && str_is_equal(parTable[tableID].pars[item].name, varname))
+            {
+              *code = parTable[tableID].pars[item].id;
+              err = 0;
+              break;
+            }
+        }
+    }
+
+  return err;
+}
+
+int
+tableInqNumber(void)
+{
+  if (!ParTableInit) parTableInit();
+
+  return parTableNum;
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifndef NORMALIZE_MONTH_H
+#define NORMALIZE_MONTH_H
+
+#include <stdlib.h>
+
+struct YearMonth
+{
+  int year, month;
+};
+
+/* normalizes month to range [1,12] and adjusts year accordingly */
+static inline struct YearMonth
+normalize_month(int year, int month)
+{
+  div_t modres = div(month - 1, 12);
+  year += modres.quot - ((month < 1) & (modres.rem != 0));
+  return (struct YearMonth){ .year = year, .month = (modres.rem + 12) % 12 + 1 };
+}
+
+#endif
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <stddef.h>
+#include <stdio.h>
+
+
+static int DefaultTimeType = TAXIS_ABSOLUTE;
+static int DefaultTimeUnit = TUNIT_HOUR;
+
+static int taxisCompareP(void *taxisptr1, void *taxisptr2);
+static void taxisDestroyP(void *taxisptr);
+static void taxisPrintKernel(taxis_t *taxisptr, FILE *fp);
+static int taxisGetPackSize(void *taxisptr, void *context);
+static void taxisPack(void *taxisptr, void *buf, int size, int *position, void *context);
+static int taxisTxCode(void *taxisptr);
+
+const resOps taxisOps
+    = { taxisCompareP, taxisDestroyP, (void (*)(void *, FILE *)) taxisPrintKernel, taxisGetPackSize, taxisPack, taxisTxCode };
+
+#define container_of(ptr, type, member) ((type *) (void *) ((unsigned char *) ptr - offsetof(type, member)))
+
+struct refcount_string
+{
+  int ref_count;
+  char string[];
+};
+
+static char *
+new_refcount_string(size_t len)
+{
+  struct refcount_string *container = (struct refcount_string *) Malloc(sizeof(*container) + len + 1);
+  container->ref_count = 1;
+  return container->string;
+}
+
+static void
+delete_refcount_string(void *p)
+{
+  if (p)
+    {
+      struct refcount_string *container = container_of(p, struct refcount_string, string);
+      if (!--(container->ref_count)) Free(container);
+    }
+}
+
+static char *
+dup_refcount_string(char *p)
+{
+  if (p)
+    {
+      struct refcount_string *container = container_of(p, struct refcount_string, string);
+      ++(container->ref_count);
+    }
+  return p;
+}
+
+#undef container_of
+
+const char *
+taxisNamePtr(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->name;
+}
+
+const char *
+tunitNamePtr(int unitID)
+{
+  static const char Timeunits[][TAXIS_MAX_UNIT_STR_LEN + 1] = {
+    "undefined", "seconds", "minutes", "quarters", "30minutes", "hours", "3hours", "6hours", "12hours", "days", "months", "years",
+  };
+  enum
+  {
+    size = sizeof(Timeunits) / sizeof(Timeunits[0])
+  };
+
+  return (unitID > 0 && unitID < size) ? Timeunits[unitID] : Timeunits[0];
+}
+
+void
+ptaxisInit(taxis_t *taxisptr)
+{
+  taxisptr->self = CDI_UNDEFID;
+  taxisptr->datatype = CDI_DATATYPE_FLT64;
+  taxisptr->type = DefaultTimeType;
+  taxisptr->calendar = CDI_Default_Calendar;
+  taxisptr->unit = DefaultTimeUnit;
+  taxisptr->numavg = 0;
+  taxisptr->climatology = false;
+  taxisptr->hasBounds = false;
+  cdiDateTime_init(&taxisptr->sDateTime);
+  cdiDateTime_init(&taxisptr->vDateTime);
+  cdiDateTime_init(&taxisptr->rDateTime);
+  cdiDateTime_init(&taxisptr->fDateTime);
+  cdiDateTime_init(&taxisptr->vDateTime_lb);
+  cdiDateTime_init(&taxisptr->vDateTime_ub);
+  taxisptr->fc_unit = DefaultTimeUnit;
+  taxisptr->fc_period = 0;
+  taxisptr->name = NULL;
+  taxisptr->longname = NULL;
+  taxisptr->units = NULL;
+}
+
+static taxis_t *
+taxisNewEntry(cdiResH resH)
+{
+  taxis_t *taxisptr = (taxis_t *) Malloc(sizeof(taxis_t));
+
+  ptaxisInit(taxisptr);
+  if (resH == CDI_UNDEFID)
+    taxisptr->self = reshPut(taxisptr, &taxisOps);
+  else
+    {
+      taxisptr->self = resH;
+      reshReplace(resH, taxisptr, &taxisOps);
+    }
+
+  return taxisptr;
+}
+
+/*
+@Function  taxisCreate
+@Title     Create a Time axis
+
+@Prototype int taxisCreate(int taxistype)
+@Parameter
+    @Item  taxistype  The type of the Time axis, one of the set of predefined CDI time axis types.
+                      The valid CDI time axis types are @func{TAXIS_ABSOLUTE} and @func{TAXIS_RELATIVE}.
+
+@Description
+The function @func{taxisCreate} creates a Time axis.
+
+@Result
+@func{taxisCreate} returns an identifier to the Time axis.
+
+@Example
+Here is an example using @func{taxisCreate} to create a relative T-axis with a standard calendar.
+
+@Source
+   ...
+int taxisID;
+   ...
+taxisID = taxisCreate(TAXIS_RELATIVE);
+taxisDefCalendar(taxisID, CALENDAR_STANDARD);
+taxisDefRdate(taxisID, 19850101);
+taxisDefRtime(taxisID, 120000);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+taxisCreate(int taxistype)
+{
+  taxis_t *taxisptr = taxisNewEntry(CDI_UNDEFID);
+  taxisptr->type = taxistype;
+
+  int taxisID = taxisptr->self;
+  return taxisID;
+}
+
+void
+taxisDestroyKernel(taxis_t *taxisptr)
+{
+  delete_refcount_string(taxisptr->name);
+  delete_refcount_string(taxisptr->longname);
+  delete_refcount_string(taxisptr->units);
+}
+
+/*
+@Function  taxisDestroy
+@Title     Destroy a Time axis
+
+@Prototype void taxisDestroy(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @func{taxisCreate}
+
+@EndFunction
+*/
+void
+taxisDestroy(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  reshRemove(taxisID, &taxisOps);
+  taxisDestroyKernel(taxisptr);
+  Free(taxisptr);
+}
+
+void
+taxisDestroyP(void *taxisptr)
+{
+  taxisDestroyKernel((taxis_t *) taxisptr);
+  Free(taxisptr);
+}
+
+int
+taxisDuplicate(int taxisID1)
+{
+  taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps);
+  taxis_t *taxisptr2 = taxisNewEntry(CDI_UNDEFID);
+
+  int taxisID2 = taxisptr2->self;
+
+  ptaxisCopy(taxisptr2, taxisptr1);
+
+  return taxisID2;
+}
+
+void
+taxisDefType(int taxisID, int taxistype)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->type != taxistype)
+    {
+      taxisptr->type = taxistype;
+      taxisptr->datatype = CDI_DATATYPE_FLT64;
+      delete_refcount_string(taxisptr->units);
+      taxisptr->units = NULL;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefVdate
+@Title     Define the verification date
+
+@Prototype void taxisDefVdate(int taxisID, int vdate)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  vdate    Verification date (YYYYMMDD)
+
+@Description
+The function @func{taxisDefVdate} defines the verification date of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefVdate(int taxisID, int vdate)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if ((int) cdiDate_get(taxisptr->vDateTime.date) != vdate)
+    {
+      taxisptr->vDateTime.date = cdiDate_set(vdate);
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefVtime
+@Title     Define the verification time
+
+@Prototype void taxisDefVtime(int taxisID, int vtime)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  vtime    Verification time (hhmmss)
+
+@Description
+The function @func{taxisDefVtime} defines the verification time of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefVtime(int taxisID, int vtime)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiTime_get(taxisptr->vDateTime.time) != vtime)
+    {
+      taxisptr->vDateTime.time = cdiTime_set(vtime);
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefVdatetime(int taxisID, CdiDateTime vDateTime)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNE(taxisptr->vDateTime, vDateTime))
+    {
+      taxisptr->vDateTime = vDateTime;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefRdatetime(int taxisID, CdiDateTime rDateTime)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNE(taxisptr->rDateTime, rDateTime))
+    {
+      taxisptr->rDateTime = rDateTime;
+      delete_refcount_string(taxisptr->units);
+      taxisptr->units = NULL;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefRdate
+@Title     Define the reference date
+
+@Prototype void taxisDefRdate(int taxisID, int rdate)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  rdate    Reference date (YYYYMMDD)
+
+@Description
+The function @func{taxisDefRdate} defines the reference date of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefRdate(int taxisID, int rdate)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if ((int) cdiDate_get(taxisptr->rDateTime.date) != rdate)
+    {
+      taxisptr->rDateTime.date = cdiDate_set(rdate);
+      delete_refcount_string(taxisptr->units);
+      taxisptr->units = NULL;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefRtime
+@Title     Define the reference time
+
+@Prototype void taxisDefRtime(int taxisID, int rtime)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  rtime    Reference time (hhmmss)
+
+@Description
+The function @func{taxisDefRtime} defines the reference time of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefRtime(int taxisID, int rtime)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiTime_get(taxisptr->rDateTime.time) != rtime)
+    {
+      taxisptr->rDateTime.time = cdiTime_set(rtime);
+      if (taxisptr->units)
+        {
+          delete_refcount_string(taxisptr->units);
+          taxisptr->units = NULL;
+        }
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefFdatetime
+@Title     Define the forecast reference date/time
+
+@Prototype void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime)
+@Parameter
+    @Item  taxisID    Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  fDateTime  Forecast reference date/time
+
+@Description
+The function @func{taxisDefFdatetime} defines the forecast reference date/time of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefFdatetime(int taxisID, CdiDateTime fDateTime)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNE(taxisptr->fDateTime, fDateTime))
+    {
+      taxisptr->fDateTime = fDateTime;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisDefCalendar
+@Title     Define the calendar
+
+@Prototype void taxisDefCalendar(int taxisID, int calendar)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}
+    @Item  calendar The type of the calendar, one of the set of predefined CDI calendar types.
+                    The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC},
+                    @func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}.
+
+@Description
+The function @func{taxisDefCalendar} defines the calendar of a Time axis.
+
+@EndFunction
+*/
+void
+taxisDefCalendar(int taxisID, int calendar)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->calendar != calendar)
+    {
+      taxisptr->calendar = calendar;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefTunit(int taxisID, int unit)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->unit != unit)
+    {
+      taxisptr->unit = unit;
+      delete_refcount_string(taxisptr->units);
+      taxisptr->units = NULL;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefForecastTunit(int taxisID, int unit)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->fc_unit != unit)
+    {
+      taxisptr->fc_unit = unit;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefForecastPeriod(int taxisID, double fc_period)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (IS_NOT_EQUAL(taxisptr->fc_period, fc_period))
+    {
+      taxisptr->fc_period = fc_period;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefNumavg(int taxisID, int numavg)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->numavg != numavg)
+    {
+      taxisptr->numavg = numavg;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+  The type of the time axis, one of the set of predefined CDI time types.
+  The valid CDI time types are TAXIS_ABSOLUTE and TAXIS_RELATIVE.
+*/
+int
+taxisInqType(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->type;
+}
+
+int
+taxisHasBounds(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return (int) taxisptr->hasBounds;
+}
+
+void
+taxisWithBounds(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->hasBounds == false)
+    {
+      taxisptr->hasBounds = true;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDeleteBounds(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->hasBounds)
+    {
+      taxisptr->hasBounds = false;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisCopyTimestep(int taxisID2, int taxisID1)
+{
+  taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps), *taxisptr2 = (taxis_t *) reshGetVal(taxisID2, &taxisOps);
+
+  reshLock();
+
+  // reference date/time and units can't be changed after streamDefVlist()!
+
+  taxisptr2->sDateTime = taxisptr1->sDateTime;
+  taxisptr2->vDateTime = taxisptr1->vDateTime;
+  taxisptr2->fDateTime = taxisptr1->fDateTime;
+
+  if (taxisptr2->hasBounds)
+    {
+      taxisptr2->vDateTime_lb = taxisptr1->vDateTime_lb;
+      taxisptr2->vDateTime_ub = taxisptr1->vDateTime_ub;
+    }
+
+  taxisptr2->fc_unit = taxisptr1->fc_unit;
+  taxisptr2->fc_period = taxisptr1->fc_period;
+
+  reshSetStatus(taxisID2, &taxisOps, RESH_DESYNC_IN_USE);
+  reshUnlock();
+}
+
+CdiDateTime
+taxisInqVdatetime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->vDateTime;
+}
+
+CdiDateTime
+taxisInqRdatetime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNull(taxisptr->rDateTime))
+    {
+      taxisptr->rDateTime = taxisptr->vDateTime;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+
+  return taxisptr->rDateTime;
+}
+
+/*
+@Function  taxisInqVdate
+@Title     Get the verification date
+
+@Prototype int taxisInqVdate(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqVdate} returns the verification date of a Time axis.
+
+@Result
+@func{taxisInqVdate} returns the verification date.
+
+@EndFunction
+*/
+int
+taxisInqVdate(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return (int) cdiDate_get(taxisptr->vDateTime.date);
+}
+
+CdiDateTime
+taxisInqSdatetime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->sDateTime;
+}
+
+void
+taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  *vdate_lb = (int) cdiDate_get(taxisptr->vDateTime_lb.date);
+  *vdate_ub = (int) cdiDate_get(taxisptr->vDateTime_ub.date);
+}
+
+void
+taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  *vDateTime_lb = taxisptr->vDateTime_lb;
+  *vDateTime_ub = taxisptr->vDateTime_ub;
+}
+
+void
+taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->hasBounds == false || (int) cdiDate_get(taxisptr->vDateTime_lb.date) != vdate_lb
+      || (int) cdiDate_get(taxisptr->vDateTime_ub.date) != vdate_ub)
+    {
+      taxisptr->vDateTime_lb.date = cdiDate_set(vdate_lb);
+      taxisptr->vDateTime_ub.date = cdiDate_set(vdate_ub);
+      taxisptr->hasBounds = true;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->hasBounds == false || cdiDateTime_isNE(taxisptr->vDateTime_lb, vDateTime_lb)
+      || cdiDateTime_isNE(taxisptr->vDateTime_ub, vDateTime_ub))
+    {
+      taxisptr->vDateTime_lb = vDateTime_lb;
+      taxisptr->vDateTime_ub = vDateTime_ub;
+      taxisptr->hasBounds = true;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisInqVtime
+@Title     Get the verification time
+
+@Prototype int taxisInqVtime(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqVtime} returns the verification time of a Time axis.
+
+@Result
+@func{taxisInqVtime} returns the verification time.
+
+@EndFunction
+*/
+int
+taxisInqVtime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return cdiTime_get(taxisptr->vDateTime.time);
+}
+
+void
+taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  *vtime_lb = cdiTime_get(taxisptr->vDateTime_lb.time);
+  *vtime_ub = cdiTime_get(taxisptr->vDateTime_ub.time);
+}
+
+void
+taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (taxisptr->hasBounds == false || cdiTime_get(taxisptr->vDateTime_lb.time) != vtime_lb
+      || cdiTime_get(taxisptr->vDateTime_ub.time) != vtime_ub)
+    {
+      taxisptr->vDateTime_lb.time = cdiTime_set(vtime_lb);
+      taxisptr->vDateTime_ub.time = cdiTime_set(vtime_ub);
+      taxisptr->hasBounds = true;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  taxisInqRdate
+@Title     Get the reference date
+
+@Prototype int taxisInqRdate(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqRdate} returns the reference date of a Time axis.
+
+@Result
+@func{taxisInqRdate} returns the reference date.
+
+@EndFunction
+*/
+int
+taxisInqRdate(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNull(taxisptr->rDateTime))
+    {
+      taxisptr->rDateTime = taxisptr->vDateTime;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+
+  return (int) cdiDate_get(taxisptr->rDateTime.date);
+}
+
+/*
+@Function  taxisInqRtime
+@Title     Get the reference time
+
+@Prototype int taxisInqRtime(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqRtime} returns the reference time of a Time axis.
+
+@Result
+@func{taxisInqRtime} returns the reference time.
+
+@EndFunction
+*/
+int
+taxisInqRtime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNull(taxisptr->rDateTime))
+    {
+      taxisptr->rDateTime = taxisptr->vDateTime;
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+
+  return cdiTime_get(taxisptr->rDateTime.time);
+}
+
+/*
+@Function  taxisInqFdatetime
+@Title     Get the forecast reference date/time
+
+@Prototype int taxisInqFdatetime(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqFdatetime} returns the forecast reference date/time of a Time axis.
+
+@Result
+@func{taxisInqFdate} returns the forecast reference date/time.
+
+@EndFunction
+*/
+CdiDateTime
+taxisInqFdatetime(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+
+  if (cdiDateTime_isNull(taxisptr->fDateTime))
+    {
+      // rDateTime is initialized from vDateTime if empty!
+      taxisptr->fDateTime = taxisInqRdatetime(taxisID);
+      reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE);
+    }
+
+  return taxisptr->fDateTime;
+}
+
+/*
+@Function  taxisInqCalendar
+@Title     Get the calendar
+
+@Prototype int taxisInqCalendar(int taxisID)
+@Parameter
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis}
+
+@Description
+The function @func{taxisInqCalendar} returns the calendar of a Time axis.
+
+@Result
+@func{taxisInqCalendar} returns the type of the calendar,
+one of the set of predefined CDI calendar types.
+The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC},
+@func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}.
+
+@EndFunction
+*/
+int
+taxisInqCalendar(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->calendar;
+}
+
+int
+taxisInqTunit(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->unit;
+}
+
+int
+taxisInqForecastTunit(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->fc_unit;
+}
+
+double
+taxisInqForecastPeriod(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->fc_period;
+}
+
+int
+taxisInqNumavg(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr->numavg;
+}
+
+taxis_t *
+taxisPtr(int taxisID)
+{
+  taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps);
+  return taxisptr;
+}
+
+void
+ptaxisDefDatatype(taxis_t *taxisptr, int datatype)
+{
+  taxisptr->datatype = datatype;
+}
+
+void
+ptaxisDefName(taxis_t *taxisptr, const char *name)
+{
+  if (name)
+    {
+      size_t len = strlen(name);
+      delete_refcount_string(taxisptr->name);
+      char *taxisname = taxisptr->name = new_refcount_string(len);
+      strcpy(taxisname, name);
+    }
+}
+
+void
+ptaxisDefLongname(taxis_t *taxisptr, const char *longname)
+{
+  if (longname)
+    {
+      size_t len = strlen(longname);
+      delete_refcount_string(taxisptr->longname);
+      char *taxislongname = taxisptr->longname = new_refcount_string(len);
+      strcpy(taxislongname, longname);
+    }
+}
+
+char *
+ptaxisAllocUnits(taxis_t *taxisptr, size_t len)
+{
+  delete_refcount_string(taxisptr->units);
+  return taxisptr->units = new_refcount_string(len);
+}
+
+void
+ptaxisDefUnits(taxis_t *taxisptr, const char *units)
+{
+  if (units)
+    {
+      size_t len = strlen(units);
+      char *taxisunits = ptaxisAllocUnits(taxisptr, len);
+      strcpy(taxisunits, units);
+    }
+}
+
+static JulianDate
+timevalue_decode(int timeunits, double timevalue)
+{
+  JulianDate julianDate;
+  julianDate.julianDay = 0;
+  julianDate.secondOfDay = 0.0;
+
+  if (timeunits == TUNIT_MINUTE)
+    {
+      timevalue *= 60;
+      timeunits = TUNIT_SECOND;
+    }
+  else if (timeunits == TUNIT_HOUR)
+    {
+      timevalue /= 24;
+      timeunits = TUNIT_DAY;
+    }
+
+  if (timeunits == TUNIT_SECOND)
+    {
+      julianDate.julianDay = (int64_t) (timevalue / 86400.0);
+      double seconds = fmod(timevalue, 86400.0);
+      /* FIXME: does the following line serve a definable purpose? */
+      julianDate.secondOfDay = round(seconds * 1000.0) / 1000.0;
+      if (julianDate.secondOfDay < 0)
+        {
+          julianDate.julianDay -= 1;
+          julianDate.secondOfDay += 86400.0;
+        };
+      /*
+      {
+        double cval = julianDate.julianDay * 86400.0 + julianDate.secondOfDay;
+        if (cval != timevalue) printf("TUNIT_SECOND error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay,
+      julianDate.secondOfDay);
+      }
+      */
+    }
+  else if (timeunits == TUNIT_DAY)
+    {
+      julianDate.julianDay = (int64_t) timevalue;
+      double days, seconds = modf(timevalue, &days) * 86400.0;
+      /* FIXME: why does the seconds value have to be integral? If that's
+       * needed why not use modf? */
+      julianDate.secondOfDay = (int) lround(seconds);
+      if (julianDate.secondOfDay < 0)
+        {
+          julianDate.julianDay -= 1;
+          julianDate.secondOfDay += 86400.0;
+        };
+      /*
+      {
+        double cval = julianDate.julianDay + julianDate.secondOfDay / 86400.0;
+        if (cval != timevalue) printf("TUNIT_DAY error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay,
+      julianDate.secondOfDay);
+      }
+      */
+    }
+  else
+    {
+      static bool lwarn = true;
+      if (lwarn)
+        {
+          Warning("timeunit %s unsupported!", tunitNamePtr(timeunits));
+          lwarn = false;
+        }
+    }
+
+  return julianDate;
+}
+
+static double
+cdi_encode_timevalue(int64_t days, double secs, int timeunit)
+{
+  double timevalue = 0.0;
+
+  if (timeunit == TUNIT_SECOND)
+    {
+      timevalue = (double) days * 86400.0 + secs;
+    }
+  else if (timeunit == TUNIT_MINUTE || timeunit == TUNIT_QUARTER || timeunit == TUNIT_30MINUTES)
+    {
+      timevalue = (double) days * 1440. + secs / 60.;
+    }
+  else if (timeunit == TUNIT_HOUR || timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS)
+    {
+      timevalue = (double) days * 24. + secs / 3600.;
+    }
+  else if (timeunit == TUNIT_DAY)
+    {
+      timevalue = (double) days + secs / 86400.;
+    }
+  else
+    {
+      static bool lwarn = true;
+      if (lwarn)
+        {
+          Warning("timeunit %s unsupported!", tunitNamePtr(timeunit));
+          lwarn = false;
+        }
+    }
+
+  return timevalue;
+}
+
+// convert relative time value to CdiDateTime
+static CdiDateTime
+rtimeval2datetime(double timevalue, const taxis_t *taxis)
+{
+  if (IS_EQUAL(timevalue, 0.0)) return taxis->rDateTime;
+
+  int timeunits = taxis->unit;
+  int calendar = taxis->calendar;
+
+  if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS)
+    {
+      timeunits = TUNIT_DAY;
+      timevalue *= 30;
+    }
+
+  CdiDateTime rDateTime = taxis->rDateTime;
+
+  if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR)
+    {
+      int year = rDateTime.date.year;
+      int month = rDateTime.date.month;
+
+      if (timeunits == TUNIT_YEAR) timevalue *= 12;
+
+      double fmon = fmod(timevalue, 1.0);
+
+      month += (int) timevalue;
+
+      struct YearMonth ym = normalize_month(year, month);
+      year = ym.year;
+      month = ym.month;
+
+      timeunits = TUNIT_DAY;
+      timevalue = fmon * days_per_month(calendar, year, month);
+
+      rDateTime.date.year = year;
+      rDateTime.date.month = (short) month;
+    }
+
+  JulianDate julianDate = julianDate_encode(calendar, rDateTime);
+  JulianDate julianDate2 = timevalue_decode(timeunits, timevalue);
+
+  return julianDate_decode(calendar, julianDate_add(julianDate2, julianDate));
+}
+
+// convert CdiDateTime to relative time value
+static double
+datetime2rtimeval(CdiDateTime vDateTime, const taxis_t *taxis)
+{
+  double value = 0.0;
+
+  int calendar = taxis->calendar;
+  int timeunits = taxis->unit;
+  int timeunits0 = timeunits;
+
+  CdiDateTime rDateTime = taxis->rDateTime;
+
+  if (cdiDateTime_isNull(rDateTime)) rDateTime = (*taxis).vDateTime;
+
+  if (cdiDateTime_isNull(rDateTime) && cdiDateTime_isNull(vDateTime)) return value;
+
+  JulianDate julianDate1 = julianDate_encode(calendar, rDateTime);
+
+  if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) timeunits = TUNIT_DAY;
+
+  if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR)
+    {
+      int ryear = rDateTime.date.year;
+      int rmonth = rDateTime.date.month;
+      int year = vDateTime.date.year;
+      int month = vDateTime.date.month;
+      value = (year - ryear) * 12 - rmonth + month;
+
+      int nmonth = (int) value;
+      month -= nmonth;
+
+      struct YearMonth ym = normalize_month(year, month);
+      year = ym.year;
+      month = ym.month;
+
+      int dpm = days_per_month(calendar, year, month);
+
+      vDateTime.date.year = year;
+      vDateTime.date.month = (short) month;
+      JulianDate julianDate2 = julianDate_encode(calendar, vDateTime);
+      JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1);
+
+      value += ((double) dateDifference.julianDay + dateDifference.secondOfDay / 86400.0) / dpm;
+      if (timeunits == TUNIT_YEAR) value = value / 12;
+    }
+  else
+    {
+      JulianDate julianDate2 = julianDate_encode(calendar, vDateTime);
+      JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1);
+
+      value = cdi_encode_timevalue(dateDifference.julianDay, dateDifference.secondOfDay, timeunits);
+    }
+
+  if (timeunits0 == TUNIT_MONTH && calendar == CALENDAR_360DAYS) value /= 30.0;
+
+  return value;
+}
+
+// convert absolute seconds to CdiDateTime
+static CdiDateTime
+seconds2datetime(double timevalue)
+{
+  int calendar = CALENDAR_STANDARD;
+  int64_t seconds = (int64_t) timevalue;
+
+  CdiDateTime datetime0;
+  datetime0.date = cdiDate_encode(1, 1, 1);
+  datetime0.time = cdiTime_encode(0, 0, 0, 0);
+  JulianDate julianDate = julianDate_encode(calendar, datetime0);
+
+  return julianDate_decode(calendar, julianDate_add_seconds(julianDate, seconds));
+}
+
+// convert absolute time value to CdiDateTime
+static CdiDateTime
+absTimeval2datetime(double timevalue)
+{
+  int64_t vdate = (int64_t) timevalue;
+  double days, tmpval = modf(timevalue, &days) * 86400.0;
+  /* FIXME: why +0.01? */
+  int daysec = (vdate < 0) ? (int) (-tmpval + 0.01) : (int) (tmpval + 0.01);
+
+  CdiDateTime datetime;
+  datetime.date = cdiDate_set(vdate);
+  int hour = daysec / 3600;
+  int minute = (daysec - hour * 3600) / 60;
+  int second = daysec - hour * 3600 - minute * 60;
+  int ms = 0;
+  datetime.time = cdiTime_encode(hour, minute, second, ms);
+
+  return datetime;
+}
+
+static CdiDateTime
+split_timevalue(double timevalue, int timeunit)
+{
+  CdiDateTime datetime;
+  cdiDateTime_init(&datetime);
+
+  if (timeunit == TUNIT_SECOND)
+    {
+      datetime = seconds2datetime(timevalue);
+    }
+  else if (timeunit == TUNIT_HOUR)
+    {
+      timevalue /= 24;
+      datetime = absTimeval2datetime(timevalue);
+    }
+  else if (timeunit == TUNIT_DAY)
+    {
+      datetime = absTimeval2datetime(timevalue);
+    }
+  else if (timeunit == TUNIT_MONTH)
+    {
+      int64_t vdate = (int64_t) timevalue * 100 - ((timevalue < 0) * 2 - 1);
+      datetime.date = cdiDate_set(vdate);
+    }
+  else if (timeunit == TUNIT_YEAR)
+    {
+      {
+        static bool lwarn = true;
+        if (lwarn && (fabs(timevalue - trunc(timevalue)) > 0))
+          {
+            Warning("Fraction of a year is not supported!!");
+            lwarn = false;
+          }
+      }
+
+      {
+        static bool lwarn = true;
+        if (timevalue < -214700)
+          {
+            if (lwarn)
+              {
+                Warning("Year %g out of range, set to -214700", timevalue);
+                lwarn = false;
+              }
+            timevalue = -214700;
+          }
+        else if (timevalue > 214700)
+          {
+            if (lwarn)
+              {
+                Warning("Year %g out of range, set to 214700", timevalue);
+                lwarn = false;
+              }
+            timevalue = 214700;
+          }
+      }
+
+      int64_t vdate = (int64_t) timevalue * 10000;
+      vdate += (timevalue < 0) ? -101 : 101;
+      datetime.date = cdiDate_set(vdate);
+    }
+  else
+    {
+      static bool lwarn = true;
+      if (lwarn)
+        {
+          Warning("timeunit %s unsupported!", tunitNamePtr(timeunit));
+          lwarn = false;
+        }
+    }
+
+  // verify date and time
+
+  int year, month, day;
+  cdiDate_decode(datetime.date, &year, &month, &day);
+  int hour, minute, second, ms;
+  cdiTime_decode(datetime.time, &hour, &minute, &second, &ms);
+
+  if (month > 17 || day > 31 || hour > 23 || minute > 59 || second > 59)
+    {
+      if ((month > 17 || day > 31) && (year < -9999 || year > 9999)) year = 1;
+      if (month > 17) month = 1;
+      if (day > 31) day = 1;
+      if (hour > 23) hour = 0;
+      if (minute > 59) minute = 0;
+      if (second > 59) second = 0;
+
+      datetime.date = cdiDate_encode(year, month, day);
+      datetime.time = cdiTime_encode(hour, minute, second, ms);
+
+      static bool lwarn = true;
+      if (lwarn)
+        {
+          lwarn = false;
+          Warning("Reset wrong date/time to %4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d!", year, month, day, hour, minute, second);
+        }
+    }
+
+  return datetime;
+}
+
+void
+cdi_set_forecast_period(double timevalue, taxis_t *taxis)
+{
+  taxis->fc_period = timevalue;
+
+  int timeunits = taxis->fc_unit;
+  int calendar = taxis->calendar;
+
+  if (cdiDateTime_isNull(taxis->vDateTime) && DBL_IS_EQUAL(timevalue, 0.0)) return;
+
+  if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS)
+    {
+      timeunits = TUNIT_DAY;
+      timevalue *= 30;
+    }
+
+  CdiDateTime vDateTime = taxis->vDateTime;
+
+  if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR)
+    {
+      int year = vDateTime.date.year;
+      int month = vDateTime.date.month;
+
+      if (timeunits == TUNIT_YEAR) timevalue *= 12;
+
+      double fmon = fmod(timevalue, 1.0);
+
+      month -= (int) timevalue;
+
+      struct YearMonth ym = normalize_month(year, month);
+      year = ym.year;
+      month = ym.month;
+
+      timeunits = TUNIT_DAY;
+      timevalue = fmon * days_per_month(calendar, year, month);
+
+      vDateTime.date.year = year;
+      vDateTime.date.month = (short) month;
+    }
+
+  JulianDate julianDate = julianDate_encode(calendar, vDateTime);
+  JulianDate julianDate2 = timevalue_decode(timeunits, timevalue);
+
+  taxis->fDateTime = julianDate_decode(calendar, julianDate_sub(julianDate, julianDate2));
+}
+
+CdiDateTime
+cdi_decode_timeval(double timevalue, const taxis_t *taxis)
+{
+  return (taxis->type == TAXIS_ABSOLUTE) ? split_timevalue(timevalue, taxis->unit) : rtimeval2datetime(timevalue, taxis);
+}
+
+static int64_t
+datetime2seconds(CdiDateTime datetime)
+{
+  int calendar = CALENDAR_STANDARD;
+
+  CdiDateTime datetime0;
+  datetime0.date = cdiDate_encode(1, 1, 1);
+  datetime0.time = cdiTime_encode(0, 0, 0, 0);
+  JulianDate julianDate0 = julianDate_encode(calendar, datetime0);
+  JulianDate julianDate = julianDate_encode(calendar, datetime);
+
+  int64_t days = julianDate.julianDay - julianDate0.julianDay;
+  int64_t seconds = days * 86400 + (int64_t) julianDate.secondOfDay;
+
+  return seconds;
+}
+
+double
+cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis)
+{
+  double timeValue = 0.0;
+
+  if (taxis->type == TAXIS_ABSOLUTE)
+    {
+      if (taxis->unit == TUNIT_YEAR)
+        {
+          timeValue = datetime.date.year;
+        }
+      else if (taxis->unit == TUNIT_MONTH)
+        {
+          int64_t xdate = cdiDate_get(datetime.date);
+          timeValue = (double) xdate / 100 + copysign((double) (datetime.date.day != 0) * 0.5, (double) xdate);
+        }
+      else if (taxis->unit == TUNIT_SECOND)
+        {
+          timeValue = (double) datetime2seconds(datetime);
+        }
+      else
+        {
+          int hour, minute, second, ms;
+          cdiTime_decode(datetime.time, &hour, &minute, &second, &ms);
+          int64_t xdate = cdiDate_get(datetime.date);
+          timeValue = copysign(1.0, (double) xdate) * (fabs((double) xdate) + (hour * 3600 + minute * 60 + second) / 86400.0);
+        }
+    }
+  else
+    timeValue = datetime2rtimeval(datetime, taxis);
+
+  return timeValue;
+}
+
+void
+ptaxisCopy(taxis_t *dest, taxis_t *source)
+{
+  reshLock();
+
+  // memcpy(dest, source, sizeof(taxis_t));
+  dest->datatype = source->datatype;
+  dest->type = source->type;
+  dest->calendar = source->calendar;
+  dest->unit = source->unit;
+  dest->numavg = source->numavg;
+  dest->climatology = source->climatology;
+  dest->hasBounds = source->hasBounds;
+  dest->sDateTime = source->sDateTime;
+  dest->vDateTime = source->vDateTime;
+  dest->rDateTime = source->rDateTime;
+  dest->fDateTime = source->fDateTime;
+  dest->vDateTime_lb = source->vDateTime_lb;
+  dest->vDateTime_ub = source->vDateTime_ub;
+  dest->fc_unit = source->fc_unit;
+  dest->fc_period = source->fc_period;
+
+  dest->climatology = source->climatology;
+  delete_refcount_string(dest->name);
+  delete_refcount_string(dest->longname);
+  delete_refcount_string(dest->units);
+  dest->name = dup_refcount_string(source->name);
+  dest->longname = dup_refcount_string(source->longname);
+  dest->units = dup_refcount_string(source->units);
+  if (dest->self != CDI_UNDEFID) reshSetStatus(dest->self, &taxisOps, RESH_DESYNC_IN_USE);
+
+  reshUnlock();
+}
+
+static void
+taxisPrintKernel(taxis_t *taxisptr, FILE *fp)
+{
+  int vdate_lb, vdate_ub;
+  int vtime_lb, vtime_ub;
+
+  taxisInqVdateBounds(taxisptr->self, &vdate_lb, &vdate_ub);
+  taxisInqVtimeBounds(taxisptr->self, &vtime_lb, &vtime_ub);
+
+  fprintf(fp,
+          "#\n"
+          "# taxisID %d\n"
+          "#\n"
+          "self        = %d\n"
+          "type        = %d\n"
+          "vdate       = %d\n"
+          "vtime       = %d\n"
+          "rdate       = %d\n"
+          "rtime       = %d\n"
+          "fdate       = %d\n"
+          "ftime       = %d\n"
+          "calendar    = %d\n"
+          "unit        = %d\n"
+          "numavg      = %d\n"
+          "climatology = %d\n"
+          "hasBounds   = %d\n"
+          "vdate_lb    = %d\n"
+          "vtime_lb    = %d\n"
+          "vdate_ub    = %d\n"
+          "vtime_ub    = %d\n"
+          "fc_unit     = %d\n"
+          "fc_period   = %g\n"
+          "\n",
+          taxisptr->self, taxisptr->self, taxisptr->type, (int) cdiDate_get(taxisptr->vDateTime.date),
+          cdiTime_get(taxisptr->vDateTime.time), (int) cdiDate_get(taxisptr->rDateTime.date), cdiTime_get(taxisptr->rDateTime.time),
+          (int) cdiDate_get(taxisptr->fDateTime.date), cdiTime_get(taxisptr->fDateTime.time), taxisptr->calendar, taxisptr->unit,
+          taxisptr->numavg, (int) taxisptr->climatology, (int) taxisptr->hasBounds, vdate_lb, vtime_lb, vdate_ub, vtime_ub,
+          taxisptr->fc_unit, taxisptr->fc_period);
+}
+
+static int
+taxisCompareP(void *taxisptr1, void *taxisptr2)
+{
+  const taxis_t *t1 = (const taxis_t *) taxisptr1, *t2 = (const taxis_t *) taxisptr2;
+
+  xassert(t1 && t2);
+
+  return !(t1->type == t2->type && cdiDateTime_isEQ(t1->vDateTime, t2->vDateTime) && cdiDateTime_isEQ(t1->rDateTime, t2->rDateTime)
+           && cdiDateTime_isEQ(t1->fDateTime, t2->fDateTime) && t1->calendar == t2->calendar && t1->unit == t2->unit
+           && t1->fc_unit == t2->fc_unit && IS_EQUAL(t1->fc_period, t2->fc_period) && t1->numavg == t2->numavg
+           && t1->climatology == t2->climatology && t1->hasBounds == t2->hasBounds
+           && cdiDateTime_isEQ(t1->vDateTime_lb, t2->vDateTime_lb) && cdiDateTime_isEQ(t1->vDateTime_ub, t2->vDateTime_ub));
+}
+
+static int
+taxisTxCode(void *taxisptr)
+{
+  (void) taxisptr;
+  return TAXIS;
+}
+
+enum
+{
+  TAXIS_PACK_INT_SELF,
+  TAXIS_PACK_INT_TYPE,
+  TAXIS_PACK_INT_VDATE,
+  TAXIS_PACK_INT_VTIME,
+  TAXIS_PACK_INT_RDATE,
+  TAXIS_PACK_INT_RTIME,
+  TAXIS_PACK_INT_FDATE,
+  TAXIS_PACK_INT_FTIME,
+  TAXIS_PACK_INT_CALENDAR,
+  TAXIS_PACK_INT_UNIT,
+  TAXIS_PACK_INT_FC_UNIT,
+  TAXIS_PACK_INT_NUMAVG,
+  TAXIS_PACK_INT_CLIMATOLOGY,
+  TAXIS_PACK_INT_HAS_BOUNDS,
+  TAXIS_PACK_INT_VDATE_LB,
+  TAXIS_PACK_INT_VDATE_UB,
+  TAXIS_PACK_INT_VTIME_LB,
+  TAXIS_PACK_INT_VTIME_UB,
+  TAXIS_PACK_INT_NAMELEN,
+  TAXIS_PACK_INT_LNAMELEN,
+  TAXIS_PACK_INT_UNITSLEN,
+  taxisNint
+};
+
+enum
+{
+  TAXIS_PACK_FC_PERIOD,
+  taxisNdouble
+};
+
+static int
+taxisGetPackSize(void *p, void *context)
+{
+  taxis_t *taxisptr = (taxis_t *) p;
+  int packBufferSize = serializeGetSize(taxisNint, CDI_DATATYPE_INT, context)
+                       + serializeGetSize(taxisNdouble, CDI_DATATYPE_FLT64, context)
+                       + (taxisptr->name ? serializeGetSize((int) strlen(taxisptr->name), CDI_DATATYPE_TXT, context) : 0)
+                       + (taxisptr->longname ? serializeGetSize((int) strlen(taxisptr->longname), CDI_DATATYPE_TXT, context) : 0)
+                       + (taxisptr->units ? serializeGetSize((int) strlen(taxisptr->units), CDI_DATATYPE_TXT, context) : 0)
+                       + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+  return packBufferSize;
+}
+
+int
+taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id)
+{
+#define adaptKey(key) (namespaceAdaptKey((key), originNamespace))
+  taxis_t *taxisP;
+  int intBuffer[taxisNint];
+  double dblBuffer[taxisNdouble];
+  uint32_t d;
+
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, taxisNint, CDI_DATATYPE_INT, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+
+  xassert(cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer) == d);
+
+  cdiResH targetID = force_id ? adaptKey(intBuffer[TAXIS_PACK_INT_SELF]) : CDI_UNDEFID;
+  taxisP = taxisNewEntry(targetID);
+
+  xassert(!force_id || targetID == taxisP->self);
+
+  taxisP->type = intBuffer[TAXIS_PACK_INT_TYPE];
+  taxisP->vDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE]);
+  taxisP->vDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME]);
+  taxisP->rDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_RDATE]);
+  taxisP->rDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_RTIME]);
+  taxisP->fDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_FDATE]);
+  taxisP->fDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_FTIME]);
+  taxisP->calendar = intBuffer[TAXIS_PACK_INT_CALENDAR];
+  taxisP->unit = intBuffer[TAXIS_PACK_INT_UNIT];
+  taxisP->fc_unit = intBuffer[TAXIS_PACK_INT_FC_UNIT];
+  taxisP->numavg = intBuffer[TAXIS_PACK_INT_NUMAVG];
+  taxisP->climatology = intBuffer[TAXIS_PACK_INT_CLIMATOLOGY];
+  taxisP->hasBounds = (bool) intBuffer[TAXIS_PACK_INT_HAS_BOUNDS];
+  taxisP->vDateTime_lb.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE_LB]);
+  taxisP->vDateTime_lb.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VDATE_UB]);
+  taxisP->vDateTime_ub.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VTIME_LB]);
+  taxisP->vDateTime_ub.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME_UB]);
+  taxisP->fc_period = dblBuffer[TAXIS_PACK_FC_PERIOD];
+  if (intBuffer[TAXIS_PACK_INT_NAMELEN])
+    {
+      int len = intBuffer[TAXIS_PACK_INT_NAMELEN];
+      char *name = new_refcount_string((size_t) len);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, name, len, CDI_DATATYPE_TXT, context);
+      name[len] = '\0';
+      taxisP->name = name;
+    }
+  if (intBuffer[TAXIS_PACK_INT_LNAMELEN])
+    {
+      int len = intBuffer[TAXIS_PACK_INT_LNAMELEN];
+      char *longname = new_refcount_string((size_t) len);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, longname, len, CDI_DATATYPE_TXT, context);
+      longname[len] = '\0';
+      taxisP->longname = longname;
+    }
+  if (intBuffer[TAXIS_PACK_INT_UNITSLEN])
+    {
+      int len = intBuffer[TAXIS_PACK_INT_UNITSLEN];
+      char *units = new_refcount_string((size_t) len);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, units, len, CDI_DATATYPE_TXT, context);
+      units[len] = '\0';
+      taxisP->units = units;
+    }
+
+  reshSetStatus(taxisP->self, &taxisOps, reshGetStatus(taxisP->self, &taxisOps) & ~RESH_SYNC_BIT);
+#undef adaptKey
+
+  return taxisP->self;
+}
+
+static void
+taxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  taxis_t *taxisP = (taxis_t *) voidP;
+  int nameLen, lnameLen, unitsLen;
+  uint32_t d;
+
+  {
+    int intBuffer[taxisNint];
+    intBuffer[TAXIS_PACK_INT_SELF] = taxisP->self;
+    intBuffer[TAXIS_PACK_INT_TYPE] = taxisP->type;
+    intBuffer[TAXIS_PACK_INT_VDATE] = (int) cdiDate_get(taxisP->vDateTime.date);
+    intBuffer[TAXIS_PACK_INT_VTIME] = cdiTime_get(taxisP->vDateTime.time);
+    intBuffer[TAXIS_PACK_INT_RDATE] = (int) cdiDate_get(taxisP->rDateTime.date);
+    intBuffer[TAXIS_PACK_INT_RTIME] = cdiTime_get(taxisP->rDateTime.time);
+    intBuffer[TAXIS_PACK_INT_FDATE] = (int) cdiDate_get(taxisP->fDateTime.date);
+    intBuffer[TAXIS_PACK_INT_FTIME] = cdiTime_get(taxisP->fDateTime.time);
+    intBuffer[TAXIS_PACK_INT_CALENDAR] = taxisP->calendar;
+    intBuffer[TAXIS_PACK_INT_UNIT] = taxisP->unit;
+    intBuffer[TAXIS_PACK_INT_FC_UNIT] = taxisP->fc_unit;
+    intBuffer[TAXIS_PACK_INT_NUMAVG] = taxisP->numavg;
+    intBuffer[TAXIS_PACK_INT_CLIMATOLOGY] = taxisP->climatology;
+    intBuffer[TAXIS_PACK_INT_HAS_BOUNDS] = taxisP->hasBounds;
+    intBuffer[TAXIS_PACK_INT_VDATE_LB] = (int) cdiDate_get(taxisP->vDateTime_lb.date);
+    intBuffer[TAXIS_PACK_INT_VDATE_UB] = cdiTime_get(taxisP->vDateTime_lb.time);
+    intBuffer[TAXIS_PACK_INT_VTIME_LB] = (int) cdiDate_get(taxisP->vDateTime_ub.date);
+    intBuffer[TAXIS_PACK_INT_VTIME_UB] = cdiTime_get(taxisP->vDateTime_ub.time);
+    intBuffer[TAXIS_PACK_INT_NAMELEN] = nameLen = taxisP->name ? (int) strlen(taxisP->name) : 0;
+    intBuffer[TAXIS_PACK_INT_LNAMELEN] = lnameLen = taxisP->longname ? (int) strlen(taxisP->longname) : 0;
+    intBuffer[TAXIS_PACK_INT_UNITSLEN] = unitsLen = taxisP->units ? (int) strlen(taxisP->units) : 0;
+    serializePack(intBuffer, taxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context);
+    d = cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer);
+  }
+
+  {
+    double dblBuffer[taxisNdouble];
+    dblBuffer[TAXIS_PACK_FC_PERIOD] = taxisP->fc_period;
+    serializePack(dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+  }
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+  if (taxisP->name) serializePack(taxisP->name, nameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
+  if (taxisP->longname)
+    serializePack(taxisP->longname, lnameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
+  if (taxisP->units) serializePack(taxisP->units, unitsLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <limits.h>
+
+
+static void
+tstepsInitEntry(tsteps_t *tstep)
+{
+  tstep->recIDs = NULL;
+  tstep->records = NULL;
+  tstep->recordSize = 0;
+  tstep->nrecs = 0;
+  tstep->curRecID = CDI_UNDEFID;
+  tstep->ncStepIndex = 0;
+  tstep->position = 0;
+  tstep->nallrecs = 0;
+  tstep->next = 0;
+
+  ptaxisInit(&(tstep->taxis));
+}
+
+int
+tstepsNewEntry(stream_t *streamptr)
+{
+  const int tsID = streamptr->tstepsNextID++;
+  int tstepsTableSize = streamptr->tstepsTableSize;
+  tsteps_t *tstepsTable = streamptr->tsteps;
+
+  // If the table overflows, double its size.
+  if (tsID == tstepsTableSize)
+    {
+      if (tstepsTableSize == 0) tstepsTableSize = 1;
+      if (tstepsTableSize <= INT_MAX / 2)
+        tstepsTableSize *= 2;
+      else if (tstepsTableSize < INT_MAX)
+        tstepsTableSize = INT_MAX;
+      else
+        Error("Resizing of tstep table failed!");
+
+      tstepsTable = (tsteps_t *) Realloc(tstepsTable, (size_t) tstepsTableSize * sizeof(tsteps_t));
+    }
+
+  streamptr->tstepsTableSize = tstepsTableSize;
+  streamptr->tsteps = tstepsTable;
+
+  tsteps_t *curTstep = &streamptr->tsteps[tsID];
+  tstepsInitEntry(curTstep);
+
+  return tsID;
+}
+
+void
+cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr)
+{
+  streamptr->ntsteps = (long) numTimesteps;
+  if (streamptr->tstepsTableSize > 0) return;
+
+  size_t ntsteps = (numTimesteps == 0) ? 1 : numTimesteps;
+
+  streamptr->tsteps = (tsteps_t *) Malloc(ntsteps * sizeof(tsteps_t));
+
+  streamptr->tstepsTableSize = (int) ntsteps;
+  streamptr->tstepsNextID = (int) ntsteps;
+
+  for (size_t tsID = 0; tsID < ntsteps; tsID++)
+    {
+      tstepsInitEntry(&streamptr->tsteps[tsID]);
+    }
+}
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#define _XOPEN_SOURCE 600
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+static const char uuidFmt[] = "%02hhx%02hhx%02hhx%02hhx-"
+                              "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-"
+                              "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx";
+
+int
+cdiUUID2Str(const unsigned char *uuid, char *uuidstr)
+{
+  if (uuid == NULL || uuidstr == NULL) return 0;
+
+  int iret = snprintf(uuidstr, uuidNumHexChars + 1, uuidFmt, uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
+                      uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
+
+  if (iret != uuidNumHexChars)
+    {
+      uuidstr[0] = 0;
+      iret = -1;
+    }
+
+  return iret;
+}
+
+int
+cdiStr2UUID(const char *uuidstr, unsigned char *uuid)
+{
+  if (uuid == NULL || uuidstr == NULL || strlen(uuidstr) != uuidNumHexChars) return -1;
+
+  int iret = sscanf(uuidstr, uuidFmt, &uuid[0], &uuid[1], &uuid[2], &uuid[3], &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8],
+                    &uuid[9], &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]);
+  if (iret != CDI_UUID_SIZE) return -1;
+
+  return iret;
+}
+
+// Returns a malloc'ed string that escapes all spaces and backslashes with backslashes.
+char *
+cdiEscapeSpaces(const char *string)
+{
+  // How much memory do we need?
+  size_t escapeCount = 0, length = 0;
+  for (; string[length]; ++length) escapeCount += string[length] == ' ' || string[length] == '\\';
+
+  char *result = (char *) Malloc(length + escapeCount + 1);
+  if (!result) return NULL;
+
+  // Do the escaping.
+  for (size_t in = 0, out = 0; in < length; ++out, ++in)
+    {
+      if (string[in] == ' ' || string[in] == '\\') result[out++] = '\\';
+      result[out] = string[in];
+    }
+  result[length + escapeCount] = 0;  // termination!
+  return result;
+}
+
+// input: a space terminated string that may contain escaped characters
+// output: a new zero terminated string with the escape characters removed
+//*outStringEnd points to the terminating character upon return.
+char *
+cdiUnescapeSpaces(const char *string, const char **outStringEnd)
+{
+  // How much memory do we need?
+  size_t escapeCount = 0, length = 0;
+  for (const char *current = string; *current && *current != ' '; current++)
+    {
+      if (*current == '\\')
+        {
+          current++, escapeCount++;
+          if (!current) return NULL;
+        }
+      length++;
+    }
+
+  char *result = (char *) Malloc(length + 1);
+  if (!result) return NULL;
+
+  // Do the unescaping.
+  for (size_t in = 0, out = 0; out < length;)
+    {
+      if (string[in] == '\\') in++;
+      result[out++] = string[in++];
+    }
+  result[length] = 0;  // termination!
+  if (outStringEnd) *outStringEnd = &string[length + escapeCount];
+  return result;
+}
+
+#if defined(HAVE_DECL_UUID_GENERATE) && defined(HAVE_UUID_UUID_H)
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <uuid/uuid.h>
+void
+cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE])
+{
+  static int uuid_seeded = 0;
+  static char uuid_rand_state[31 * sizeof(long)];
+  char *caller_rand_state;
+  if (uuid_seeded)
+    caller_rand_state = setstate(uuid_rand_state);
+  else
+    {
+      struct timeval tv;
+      int status = gettimeofday(&tv, NULL);
+      if (status != 0)
+        {
+          perror("uuid random seed generation failed!");
+          exit(1);
+        }
+      unsigned seed = (unsigned) (tv.tv_sec ^ tv.tv_usec);
+      caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state));
+      uuid_seeded = 1;
+    }
+  uuid_generate(uuid);
+  setstate(caller_rand_state);
+}
+#elif defined(HAVE_DECL_UUID_CREATE) && defined(HAVE_UUID_H)
+#ifdef HAVE_DECL_UUID_MAKE_V5
+#include <uuid.h>
+void
+cdiCreateUUID(unsigned char *uuid)
+{
+  static const char error_stage[][16]
+      = { "uuid_create", "uuid_create", "uuid_load", "uuid_make", "uuid_export", "uuid_destroy1", "uuid_destroy2" };
+  uuid_t *objuuid = NULL, *nsuuid = NULL;
+  int stage = 0;
+  uuid_rc_t status;
+  if ((status = uuid_create(&objuuid)) == UUID_RC_OK)
+    {
+      ++stage;
+      if ((status = uuid_create(&nsuuid)) == UUID_RC_OK)
+        {
+          ++stage;
+          if ((status = uuid_load(nsuuid, "ns:OID")) == UUID_RC_OK)
+            {
+              ++stage;
+              if ((status = uuid_make(objuuid, UUID_MAKE_V5, nsuuid, cdiLibraryVersion())) == UUID_RC_OK)
+                {
+                  ++stage;
+                  size_t datalen = CDI_UUID_SIZE;
+                  status = uuid_export(objuuid, UUID_FMT_BIN, &uuid, &datalen);
+                }
+            }
+        }
+    }
+  if (status != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]);
+  stage = 5;
+  if ((status = uuid_destroy(nsuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]);
+  ++stage;
+  if ((status = uuid_destroy(objuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]);
+}
+#else
+#include <inttypes.h>
+typedef uint8_t u_int8_t;
+typedef uint16_t u_int16_t;
+typedef uint32_t u_int32_t;
+#include <uuid.h>
+void
+cdiCreateUUID(unsigned char *uuid)
+{
+  uint32_t status;
+  uuid_create((uuid_t *) (void *) uuid, &status);
+  if (status != uuid_s_ok)
+    {
+      perror("uuid generation failed!");
+      exit(1);
+    }
+}
+#endif
+#else
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+void
+cdiCreateUUID(unsigned char *uuid)
+{
+  static int uuid_seeded = 0;
+#ifndef _SX
+  static char uuid_rand_state[31 * sizeof(long)];
+  char *caller_rand_state;
+  if (uuid_seeded)
+    caller_rand_state = setstate(uuid_rand_state);
+  else
+    {
+#ifdef HAVE_SYS_TIME_H
+      struct timeval tv;
+      int status = gettimeofday(&tv, NULL);
+      if (status != 0)
+        {
+          perror("failed seed generation!");
+          exit(1);
+        }
+      unsigned seed = tv.tv_sec ^ tv.tv_usec;
+#else
+      unsigned seed = 0;
+#endif
+      caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state));
+      uuid_seeded = 1;
+    }
+  for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) random();
+#else
+  unsigned short caller_rand_state[3];
+  {
+    static unsigned short our_rand_state[3];
+    if (!uuid_seeded)
+      {
+#ifdef HAVE_SYS_TIME_H
+        struct timeval tv;
+        int status = gettimeofday(&tv, NULL);
+        if (status != 0)
+          {
+            perror("failed seed generation!");
+            exit(1);
+          }
+        unsigned seed = tv.tv_sec ^ tv.tv_usec;
+#else
+        unsigned seed = 0;
+#endif
+        our_rand_state[0] = 0x330E;
+        our_rand_state[1] = (unsigned short) (seed & 0xFFFFU);
+        our_rand_state[2] = (unsigned short) ((seed >> 16) & 0xFFFFU);
+      }
+    unsigned short *p = seed48(our_rand_state);
+    uuid_seeded = 1;
+    memcpy(caller_rand_state, p, sizeof(caller_rand_state));
+  }
+  for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) lrand48();
+#endif
+  /* encode variant into msb of octet 8 */
+  uuid[8] = (unsigned char) ((uuid[8] & 0x3f) | (1 << 7));
+  /* encode version 4 ((pseudo-)random uuid) into msb of octet 7 */
+  uuid[7] = (unsigned char) ((uuid[7] & 0x0f) | (4 << 4));
+#ifndef _SX
+  setstate(caller_rand_state);
+#else
+  seed48(caller_rand_state);
+#endif
+}
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+static size_t Vctsize = 0;
+static double *Vct = NULL;
+
+static int numberOfVerticalLevels = 0;
+static int numberOfVerticalGrid = 0;
+static unsigned char uuidVGrid[CDI_UUID_SIZE];
+
+typedef struct
+{
+  int level1;
+  int level2;
+  int recID;
+  int lindex;
+} leveltable_t;
+
+typedef struct
+{
+  int subtypeIndex;  //  corresponding tile in subtype_t structure (subtype->self)
+  int nlevels;
+  int levelTableSize;
+  leveltable_t *levelTable;
+} subtypetable_t;
+
+typedef struct
+{
+  int varID;
+  int param;
+  int prec;
+  int tsteptype;
+  VarScanKeys scanKeys;
+  int gridID;
+  int zaxistype;
+  int ltype1;  // GRIB first level type
+  int ltype2;  // GRIB second level type
+  int hasBounds;
+  int level_sf;
+  int level_unit;
+  int zaxisID;
+
+  int nsubtypes_alloc;
+  int nsubtypes;
+  subtypetable_t *recordTable;  // ~ two-dimensional record list [nsubtypes_alloc][levelTableSize]
+
+  int instID;
+  int modelID;
+  int tableID;
+  int comptype;   // compression type
+  int complevel;  // compression level
+  bool lmissval;
+  double missval;
+  char *name;
+
+  // meta-data for specification of tiles (currently only GRIB-API:
+  subtype_t *tiles;
+
+  cdi_keys_t keys;
+
+  int opt_grib_nentries;                // current no. key-value pairs
+  int opt_grib_kvpair_size;             // current allocated size
+  opt_key_val_pair_t *opt_grib_kvpair;  // (optional) list of keyword/value pairs
+} vartable_t;
+
+static vartable_t *vartable;
+static int varTableSize = 0;
+static int varTableUsed = 0;
+
+static void
+paramInitEntry(int varID, int param)
+{
+  vartable[varID].varID = varID;
+  vartable[varID].param = param;
+  vartable[varID].prec = 0;
+  vartable[varID].tsteptype = TSTEP_INSTANT;
+  varScanKeysInit(&vartable[varID].scanKeys);
+  vartable[varID].gridID = CDI_UNDEFID;
+  vartable[varID].zaxistype = 0;
+  vartable[varID].ltype1 = 0;
+  vartable[varID].ltype2 = -1;
+  vartable[varID].hasBounds = 0;
+  vartable[varID].level_sf = 0;
+  vartable[varID].level_unit = 0;
+  vartable[varID].recordTable = NULL;
+  vartable[varID].nsubtypes_alloc = 0;
+  vartable[varID].nsubtypes = 0;
+  vartable[varID].instID = CDI_UNDEFID;
+  vartable[varID].modelID = CDI_UNDEFID;
+  vartable[varID].tableID = CDI_UNDEFID;
+  cdiInitKeys(&vartable[varID].keys);
+  vartable[varID].comptype = CDI_COMPRESS_NONE;
+  vartable[varID].complevel = 1;
+  vartable[varID].lmissval = false;
+  vartable[varID].missval = 0;
+  vartable[varID].name = NULL;
+  vartable[varID].tiles = NULL;
+}
+
+// Test if a variable specified by the given meta-data has already been registered in "vartable".
+static int
+varGetEntry(int param, int gridID, int zaxistype, int ltype1, int tsteptype, const char *name, const VarScanKeys *scanKeys,
+            const var_tile_t *tiles)
+{
+  for (int varID = 0; varID < varTableSize; ++varID)
+    {
+      // testing for "param" implicitly checks if we are beyond the current vartable size:
+      if (vartable[varID].param == param)
+        {
+          int no_of_tiles = tiles ? tiles->numberOfTiles : -1;
+          int vt_no_of_tiles
+              = vartable[varID].tiles ? subtypeGetGlobalDataP(vartable[varID].tiles, SUBTYPE_ATT_NUMBER_OF_TILES) : -1;
+          if ((vartable[varID].zaxistype == zaxistype) && (vartable[varID].ltype1 == ltype1)
+              && (vartable[varID].tsteptype == tsteptype)
+              && (scanKeys == NULL || varScanKeysIsEqual(&vartable[varID].scanKeys, scanKeys)) && (vartable[varID].gridID == gridID)
+              && (vt_no_of_tiles == no_of_tiles))
+            {
+              if (name && name[0] && vartable[varID].name && vartable[varID].name[0])
+                {
+                  if (str_is_equal(name, vartable[varID].name)) return varID;
+                }
+              else
+                {
+                  return varID;
+                }
+            }
+        }
+    }
+
+  return -1;
+}
+
+static void
+varFree(void)
+{
+  if (CDI_Debug) Message("call to varFree");
+
+  for (int varID = 0; varID < varTableUsed; ++varID)
+    {
+      if (vartable[varID].recordTable)
+        {
+          for (int isub = 0; isub < vartable[varID].nsubtypes_alloc; isub++) Free(vartable[varID].recordTable[isub].levelTable);
+          Free(vartable[varID].recordTable);
+        }
+
+      if (vartable[varID].name) Free(vartable[varID].name);
+      if (vartable[varID].tiles) subtypeDestroyPtr(vartable[varID].tiles);
+
+      cdi_keys_t *keysp = &(vartable[varID].keys);
+      cdiDeleteVarKeys(keysp);
+
+      if (vartable[varID].opt_grib_kvpair)
+        {
+          for (int i = 0; i < vartable[varID].opt_grib_nentries; i++)
+            {
+              if (vartable[varID].opt_grib_kvpair[i].keyword) Free(vartable[varID].opt_grib_kvpair[i].keyword);
+            }
+          Free(vartable[varID].opt_grib_kvpair);
+        }
+      vartable[varID].opt_grib_nentries = 0;
+      vartable[varID].opt_grib_kvpair_size = 0;
+      vartable[varID].opt_grib_kvpair = NULL;
+    }
+
+  if (vartable) Free(vartable);
+  vartable = NULL;
+  varTableSize = 0;
+  varTableUsed = 0;
+
+  if (Vct) Free(Vct);
+  Vct = NULL;
+  Vctsize = 0;
+}
+
+// Search for a tile subtype with subtypeIndex == tile_index.
+static int
+tileGetEntry(int varID, int tile_index)
+{
+  for (int isub = 0; isub < vartable[varID].nsubtypes; isub++)
+    if (vartable[varID].recordTable[isub].subtypeIndex == tile_index) return isub;
+  return CDI_UNDEFID;
+}
+
+/* Resizes vartable:recordTable data structure, if necessary. */
+static int
+tileNewEntry(int varID)
+{
+  int tileID = 0;
+  if (vartable[varID].nsubtypes_alloc == 0)
+    {
+      /* create table for the first time. */
+      vartable[varID].nsubtypes_alloc = 2;
+      vartable[varID].nsubtypes = 0;
+      vartable[varID].recordTable = (subtypetable_t *) Malloc((size_t) vartable[varID].nsubtypes_alloc * sizeof(subtypetable_t));
+      if (vartable[varID].recordTable == NULL) SysError("Allocation of leveltable failed!");
+
+      for (int isub = 0; isub < vartable[varID].nsubtypes_alloc; isub++)
+        {
+          vartable[varID].recordTable[isub].levelTable = NULL;
+          vartable[varID].recordTable[isub].levelTableSize = 0;
+          vartable[varID].recordTable[isub].nlevels = 0;
+          vartable[varID].recordTable[isub].subtypeIndex = CDI_UNDEFID;
+        }
+    }
+  else
+    {
+      /* data structure large enough; find a free entry. */
+      while (tileID < vartable[varID].nsubtypes_alloc)
+        {
+          if (vartable[varID].recordTable[tileID].levelTable == NULL) break;
+          tileID++;
+        }
+    }
+
+  /* If the table overflows, double its size. */
+  if (tileID == vartable[varID].nsubtypes_alloc)
+    {
+      tileID = vartable[varID].nsubtypes_alloc;
+      vartable[varID].nsubtypes_alloc *= 2;
+      vartable[varID].recordTable = (subtypetable_t *) Realloc(vartable[varID].recordTable,
+                                                               (size_t) vartable[varID].nsubtypes_alloc * sizeof(subtypetable_t));
+      if (vartable[varID].recordTable == NULL) SysError("Reallocation of leveltable failed");
+      for (int isub = tileID; isub < vartable[varID].nsubtypes_alloc; isub++)
+        {
+          vartable[varID].recordTable[isub].levelTable = NULL;
+          vartable[varID].recordTable[isub].levelTableSize = 0;
+          vartable[varID].recordTable[isub].nlevels = 0;
+          vartable[varID].recordTable[isub].subtypeIndex = CDI_UNDEFID;
+        }
+    }
+
+  return tileID;
+}
+
+static int
+levelNewEntry(int varID, int level1, int level2, int tileID)
+{
+  int levelID = 0;
+  int levelTableSize = vartable[varID].recordTable[tileID].levelTableSize;
+  leveltable_t *levelTable = vartable[varID].recordTable[tileID].levelTable;
+
+  // Look for a free slot in levelTable. (Create the table the first time through).
+  if (!levelTableSize)
+    {
+      levelTableSize = 2;
+      levelTable = (leveltable_t *) Malloc((size_t) levelTableSize * sizeof(leveltable_t));
+      for (int i = 0; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID;
+    }
+  else
+    {
+      while (levelID < levelTableSize && levelTable[levelID].recID != CDI_UNDEFID) ++levelID;
+    }
+
+  // If the table overflows, double its size.
+  if (levelID == levelTableSize)
+    {
+      levelTable = (leveltable_t *) Realloc(levelTable, (size_t) (levelTableSize *= 2) * sizeof(leveltable_t));
+      for (int i = levelID; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID;
+    }
+
+  levelTable[levelID].level1 = level1;
+  levelTable[levelID].level2 = level2;
+  levelTable[levelID].lindex = levelID;
+
+  vartable[varID].recordTable[tileID].nlevels = levelID + 1;
+  vartable[varID].recordTable[tileID].levelTableSize = levelTableSize;
+  vartable[varID].recordTable[tileID].levelTable = levelTable;
+
+  return levelID;
+}
+
+#define UNDEF_PARAM -4711
+
+static int
+paramNewEntry(int param)
+{
+  int varID = 0;
+
+  // Look for a free slot in vartable. (Create the table the first time through).
+  if (!varTableSize)
+    {
+      varTableSize = 2;
+      vartable = (vartable_t *) Malloc((size_t) varTableSize * sizeof(vartable_t));
+      if (vartable == NULL)
+        {
+          Message("varTableSize = %d", varTableSize);
+          SysError("Allocation of vartable failed");
+        }
+
+      for (int i = 0; i < varTableSize; i++)
+        {
+          vartable[i].param = UNDEF_PARAM;
+          vartable[i].opt_grib_kvpair = NULL;
+          vartable[i].opt_grib_kvpair_size = 0;
+          vartable[i].opt_grib_nentries = 0;
+        }
+    }
+  else
+    {
+      while (varID < varTableSize)
+        {
+          if (vartable[varID].param == UNDEF_PARAM) break;
+          varID++;
+        }
+    }
+
+  // If the table overflows, double its size.
+  if (varID == varTableSize)
+    {
+      vartable = (vartable_t *) Realloc(vartable, (size_t) (varTableSize *= 2) * sizeof(vartable_t));
+      for (int i = varID; i < varTableSize; i++)
+        {
+          vartable[i].param = UNDEF_PARAM;
+          vartable[i].opt_grib_kvpair = NULL;
+          vartable[i].opt_grib_kvpair_size = 0;
+          vartable[i].opt_grib_nentries = 0;
+        }
+    }
+
+  paramInitEntry(varID, param);
+
+  return varID;
+}
+
+// Append tile set to a subtype. Return index of the new tile (i.e. the "entry->self" value).
+static int
+varInsertTileSubtype(vartable_t *vptr, const var_tile_t *tiles)
+{
+  if (tiles == NULL) return 0;
+
+  // first, generate a subtype based on the info in "tiles".
+  subtype_t *subtype_ptr;
+  subtypeAllocate(&subtype_ptr, SUBTYPE_TILES);
+  subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS, tiles->totalno_of_tileattr_pairs);
+  subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TILE_CLASSIFICATION, tiles->tileClassification);
+  subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_NUMBER_OF_TILES, tiles->numberOfTiles);
+
+  // Here, we create a tile set for comparison that contains only one tile/attribute pair (based on "tiles").
+  struct subtype_entry_t *entry = subtypeEntryInsert(subtype_ptr);
+  subtypeDefEntryDataP(entry, SUBTYPE_ATT_NUMBER_OF_ATTR, tiles->numberOfAttributes);
+  subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEINDEX, tiles->tileindex);
+  subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEATTRIBUTE, tiles->attribute);
+
+  if (vptr->tiles == NULL)
+    {
+      vptr->tiles = subtype_ptr;
+      return 0;
+    }
+  else
+    {
+      tilesetInsertP(vptr->tiles, subtype_ptr);
+      subtypeDestroyPtr(subtype_ptr);
+      return vptr->tiles->nentries - 1;
+    }
+}
+
+void
+varAddRecord(int recID, int param, int gridID, int zaxistype, int hasBounds, int level1, int level2, int level_sf, int level_unit,
+             int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name,
+             const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index)
+{
+  int varID = (CDI_Split_Ltype105 != 1 || zaxistype != ZAXIS_HEIGHT)
+                  ? varGetEntry(param, gridID, zaxistype, ltype1, tsteptype, name, scanKeys, tiles)
+                  : CDI_UNDEFID;
+
+  if (varID == CDI_UNDEFID)
+    {
+      varTableUsed++;
+      varID = paramNewEntry(param);
+      vartable[varID].gridID = gridID;
+      vartable[varID].zaxistype = zaxistype;
+      vartable[varID].ltype1 = ltype1;
+      vartable[varID].ltype2 = ltype2;
+      vartable[varID].hasBounds = hasBounds;
+      vartable[varID].level_sf = level_sf;
+      vartable[varID].level_unit = level_unit;
+      vartable[varID].tsteptype = tsteptype;
+      if (scanKeys) vartable[varID].scanKeys = *scanKeys;
+
+      if (name && name[0]) vartable[varID].name = strdup(name);
+    }
+  else
+    {
+      char paramstr[32];
+      cdiParamToString(param, paramstr, sizeof(paramstr));
+
+      if (vartable[varID].gridID != gridID)
+        {
+          Message("param = %s gridID = %d", paramstr, gridID);
+          Error("horizontal grid must not change for same parameter!");
+        }
+      if (vartable[varID].zaxistype != zaxistype)
+        {
+          Message("param = %s zaxistype = %d", paramstr, zaxistype);
+          Error("zaxistype must not change for same parameter!");
+        }
+    }
+
+  if (prec > vartable[varID].prec) vartable[varID].prec = prec;
+
+  // append current tile to tile subtype info.
+  int this_tile = varInsertTileSubtype(&vartable[varID], tiles);
+  int tileID = tileGetEntry(varID, this_tile);
+  if (tile_index) (*tile_index) = this_tile;
+  if (tileID == CDI_UNDEFID)
+    {
+      tileID = tileNewEntry((int) varID);
+      vartable[varID].recordTable[tileID].subtypeIndex = this_tile;
+      vartable[varID].nsubtypes++;
+    }
+
+  // append current level to level table info
+  int levelID = levelNewEntry(varID, level1, level2, tileID);
+  if (CDI_Debug)
+    Message("vartable[%d].recordTable[%d].levelTable[%d].recID = %d; level1,2=%d,%d", varID, tileID, levelID, recID, level1,
+            level2);
+  vartable[varID].recordTable[tileID].levelTable[levelID].recID = recID;
+
+  *pvarID = (int) varID;
+  *plevelID = levelID;
+}
+
+/*
+static
+int dblcmp(const void *s1, const void *s2)
+{
+  int cmp = 0;
+
+  if      ( *((double *) s1) < *((double *) s2) ) cmp = -1;
+  else if ( *((double *) s1) > *((double *) s2) ) cmp =  1;
+
+  return cmp;
+}
+*/
+static int
+cmpLevelTable(const void *s1, const void *s2)
+{
+  int cmp = 0;
+  const leveltable_t *x = (const leveltable_t *) s1;
+  const leveltable_t *y = (const leveltable_t *) s2;
+  // printf("%g %g  %d %d\n", x->leve11, y->level1, x, y);
+  if (x->level1 < y->level1)
+    cmp = -1;
+  else if (x->level1 > y->level1)
+    cmp = 1;
+
+  return cmp;
+}
+
+static int
+cmpLevelTableInv(const void *s1, const void *s2)
+{
+  int cmp = 0;
+  const leveltable_t *x = (const leveltable_t *) s1;
+  const leveltable_t *y = (const leveltable_t *) s2;
+  // printf("%g %g  %d %d\n", x->leve11, y->level1, x, y);
+  if (x->level1 < y->level1)
+    cmp = 1;
+  else if (x->level1 > y->level1)
+    cmp = -1;
+
+  return cmp;
+}
+
+void
+varCopyKeys(int vlistID, int varID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  cdiInitKeys(&vlistptr->vars[varID].keys);
+  cdiCopyVarKeys(&vartable[varID].keys, &vlistptr->vars[varID].keys);
+}
+/*
+struct cdi_generate_varinfo
+{
+  int varid;
+  const char *name;
+};
+
+static int
+cdi_generate_cmp_varname(const void *s1, const void *s2)
+{
+  const struct cdi_generate_varinfo *x = (const struct cdi_generate_varinfo *) s1, *y = (const struct cdi_generate_varinfo *) s2;
+  return strcmp(x->name, y->name);
+}
+*/
+void
+cdi_generate_vars(stream_t *streamptr)
+{
+  int vlistID = streamptr->vlistID;
+
+  int *varids = (int *) Malloc((size_t) varTableUsed * sizeof(int));
+  for (int varID = 0; varID < varTableUsed; varID++) varids[varID] = (int) varID;
+  /*
+    if (streamptr->sortname)
+      {
+        bool hasName = true;
+        for (int varID = 0; varID < varTableUsed; varID++)
+          if (!vartable[varID].name) hasName = false;
+
+        if (hasName)
+          {
+            struct cdi_generate_varinfo *varInfo
+                = (struct cdi_generate_varinfo *) Malloc((size_t) varTableUsed * sizeof(struct cdi_generate_varinfo));
+
+            for (int varID = 0; varID < varTableUsed; varID++)
+              {
+                varInfo[varID].varid = varids[varID];
+                varInfo[varID].name = vartable[varids[varID]].name;
+              }
+            qsort(varInfo, varTableUsed, sizeof(varInfo[0]), cdi_generate_cmp_varname);
+            for (int varID = 0; varID < varTableUsed; varID++)
+              {
+                varids[varID] = varInfo[varID].varid;
+              }
+            Free(varInfo);
+          }
+      }
+  */
+  for (int index = 0; index < varTableUsed; index++)
+    {
+      int varid = varids[index];
+
+      int gridID = vartable[varid].gridID;
+      int param = vartable[varid].param;
+      int ltype1 = vartable[varid].ltype1;
+      int ltype2 = vartable[varid].ltype2;
+      int zaxistype = vartable[varid].zaxistype;
+      if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && cdiDefaultLeveltype != -1) zaxistype = cdiDefaultLeveltype;
+      int hasBounds = vartable[varid].hasBounds;
+      int prec = vartable[varid].prec;
+      int instID = vartable[varid].instID;
+      int modelID = vartable[varid].modelID;
+      int tableID = vartable[varid].tableID;
+      int tsteptype = vartable[varid].tsteptype;
+      int comptype = vartable[varid].comptype;
+
+      double level_sf = (vartable[varid].level_sf != 0) ? (1.0 / vartable[varid].level_sf) : 1;
+
+      /* consistency check: test if all subtypes have the same levels: */
+      int nlevels = vartable[varid].recordTable[0].nlevels;
+      for (int isub = 1; isub < vartable[varid].nsubtypes; isub++)
+        {
+          if (vartable[varid].recordTable[isub].nlevels != nlevels)
+            {
+              fprintf(stderr,
+                      "var \"%s\": isub = %d / %d :: "
+                      "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n",
+                      vartable[varid].name, isub, vartable[varid].nsubtypes, nlevels, vartable[varid].recordTable[isub].nlevels);
+              Error("zaxis size must not change for same parameter!");
+            }
+
+          const leveltable_t *t1 = vartable[varid].recordTable[isub - 1].levelTable;
+          const leveltable_t *t2 = vartable[varid].recordTable[isub].levelTable;
+          for (int ilev = 0; ilev < nlevels; ilev++)
+            if ((t1[ilev].level1 != t2[ilev].level1) || (t1[ilev].level2 != t2[ilev].level2)
+                || (t1[ilev].lindex != t2[ilev].lindex))
+              {
+                fprintf(stderr,
+                        "var \"%s\", varID=%d: isub = %d / %d :: "
+                        "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n",
+                        vartable[varid].name, varid, isub, vartable[varid].nsubtypes, nlevels,
+                        vartable[varid].recordTable[isub].nlevels);
+                Message("t1[ilev].level1=%d / t2[ilev].level1=%d", t1[ilev].level1, t2[ilev].level1);
+                Message("t1[ilev].level2=%d / t2[ilev].level2=%d", t1[ilev].level2, t2[ilev].level2);
+                Message("t1[ilev].lindex=%d / t2[ilev].lindex=%d", t1[ilev].lindex, t2[ilev].lindex);
+                Error("zaxis type must not change for same parameter!");
+              }
+        }
+      leveltable_t *levelTable = vartable[varid].recordTable[0].levelTable;
+
+      if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && nlevels == 1 && levelTable[0].level1 == 0) zaxistype = ZAXIS_SURFACE;
+
+      double *dlevels = (double *) Malloc((size_t) nlevels * sizeof(double));
+
+      /*
+      if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF )
+        for (int levelID = 0; levelID < nlevels; levelID++)
+          dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0;
+      else
+      */
+      for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1;
+
+      if (nlevels > 1)
+        {
+          bool linc = true, ldec = true, lsort = false;
+          for (int levelID = 1; levelID < nlevels; levelID++)
+            {
+              // check increasing of levels
+              linc &= (dlevels[levelID] > dlevels[levelID - 1]);
+              // check decreasing of levels
+              ldec &= (dlevels[levelID] < dlevels[levelID - 1]);
+            }
+          /*
+           * always sort pressure z-axis to ensure
+           * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 > levelID2
+           * unless already sorted in decreasing order
+           */
+          if ((!linc && !ldec) && zaxistype == ZAXIS_PRESSURE)
+            {
+              qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTableInv);
+              lsort = true;
+            }
+          /*
+           * always sort hybrid and depth-below-land z-axis to ensure
+           * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 < levelID2
+           * unless already sorted in increasing order
+           */
+          else if ((!linc && !ldec) || zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_DEPTH_BELOW_LAND)
+            {
+              qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTable);
+              lsort = true;
+            }
+
+          if (lsort)
+            {
+              /*
+              if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF )
+                for (int levelID = 0; levelID < nlevels; levelID++)
+                  dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0;
+              else
+              */
+              for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1;
+            }
+        }
+
+      double *dlevels1 = NULL, *dlevels2 = NULL;
+      if (hasBounds)
+        {
+          dlevels1 = (double *) Malloc(2 * (size_t) nlevels * sizeof(double));
+          dlevels2 = dlevels1 + nlevels;
+          for (int levelID = 0; levelID < nlevels; levelID++) dlevels1[levelID] = level_sf * levelTable[levelID].level1;
+          for (int levelID = 0; levelID < nlevels; levelID++) dlevels2[levelID] = level_sf * levelTable[levelID].level2;
+        }
+
+      const char **cvals = NULL;
+      const char *unitptr = cdiUnitNamePtr(vartable[varid].level_unit);
+      int zaxisID = varDefZaxis(vlistID, zaxistype, nlevels, dlevels, cvals, 0, dlevels1, dlevels2, (int) Vctsize, Vct, NULL, NULL,
+                                unitptr, 0, 0, ltype1, ltype2);
+
+      if (CDI_CMOR_Mode && nlevels == 1 && zaxistype != ZAXIS_HYBRID) zaxisDefScalar(zaxisID);
+
+      if (zaxisInqType(zaxisID) == ZAXIS_REFERENCE)
+        {
+          if (numberOfVerticalLevels > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, numberOfVerticalLevels);
+          if (numberOfVerticalGrid > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, numberOfVerticalGrid);
+          if (!cdiUUIDIsNull(uuidVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidVGrid, CDI_UUID_SIZE);
+        }
+
+      if (hasBounds) Free(dlevels1);
+      Free(dlevels);
+
+      // define new subtype for tile set
+      int tilesetID = CDI_UNDEFID;
+      if (vartable[varid].tiles) tilesetID = vlistDefTileSubtype(vlistID, vartable[varid].tiles);
+
+      // generate new variable
+      int varID = stream_new_var(streamptr, gridID, zaxisID, tilesetID);
+      varID = vlistDefVarTiles(vlistID, gridID, zaxisID, TIME_VARYING, tilesetID);
+
+      vlistDefVarTsteptype(vlistID, varID, tsteptype);
+      vlistDefVarParam(vlistID, varID, param);
+      vlistDefVarDatatype(vlistID, varID, prec);
+      vlistDefVarCompType(vlistID, varID, comptype);
+
+      varCopyKeys(vlistID, varID);
+
+      if (vartable[varid].lmissval) vlistDefVarMissval(vlistID, varID, vartable[varid].missval);
+      if (vartable[varid].name) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, vartable[varid].name);
+
+      vlist_t *vlistptr = vlist_to_pointer(vlistID);
+      for (int i = 0; i < vartable[varid].opt_grib_nentries; i++)
+        {
+          resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1);
+          vlistptr->vars[varID].opt_grib_nentries += 1;
+          int idx = vlistptr->vars[varID].opt_grib_nentries - 1;
+
+          vlistptr->vars[varID].opt_grib_kvpair[idx] = vartable[varid].opt_grib_kvpair[i];
+          vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = NULL;
+          if (vartable[varid].opt_grib_kvpair[i].keyword)
+            vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(vartable[varid].opt_grib_kvpair[i].keyword);
+          vlistptr->vars[varID].opt_grib_kvpair[i].update = true;
+        }
+      // note: if the key is not defined, we do not throw an error!
+
+      if (CDI_Default_TableID != CDI_UNDEFID)
+        {
+          int pdis, pcat, pnum;
+          cdiDecodeParam(param, &pnum, &pcat, &pdis);
+          char name[CDI_MAX_NAME];
+          name[0] = 0;
+          char longname[CDI_MAX_NAME];
+          longname[0] = 0;
+          char units[CDI_MAX_NAME];
+          units[0] = 0;
+          tableInqEntry(CDI_Default_TableID, pnum, -1, name, longname, units);
+          if (name[0])
+            {
+              if (tableID != CDI_UNDEFID)
+                {
+                  cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name);
+                  if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname);
+                  if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units);
+                }
+              else
+                tableID = CDI_Default_TableID;
+            }
+          if (CDI_Default_ModelID != CDI_UNDEFID) modelID = CDI_Default_ModelID;
+          if (CDI_Default_InstID != CDI_UNDEFID) instID = CDI_Default_InstID;
+        }
+
+      if (instID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, instID);
+      if (modelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, modelID);
+      if (tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, tableID);
+    }
+
+  for (int index = 0; index < varTableUsed; index++)
+    {
+      int varid = varids[index];
+      int nlevels = vartable[varid].recordTable[0].nlevels;
+
+      int nsub = (vartable[varid].nsubtypes >= 0) ? vartable[varid].nsubtypes : 0;
+      for (int isub = 0; isub < nsub; isub++)
+        {
+          sleveltable_t *streamRecordTable = streamptr->vars[index].recordTable + isub;
+          leveltable_t *vartableLevelTable = vartable[varid].recordTable[isub].levelTable;
+          for (int levelID = 0; levelID < nlevels; levelID++)
+            {
+              streamRecordTable->recordID[levelID] = vartableLevelTable[levelID].recID;
+              int lindex;
+              for (lindex = 0; lindex < nlevels; lindex++)
+                if (levelID == vartableLevelTable[lindex].lindex) break;
+              if (lindex == nlevels) Error("Internal problem! lindex not found.");
+              streamRecordTable->lindex[levelID] = (int) lindex;
+            }
+        }
+    }
+
+  Free(varids);
+
+  varFree();
+}
+
+void
+varDefVCT(size_t vctsize, double *vctptr)
+{
+  if (Vct == NULL && vctptr != NULL && vctsize > 0)
+    {
+      Vctsize = vctsize;
+      Vct = (double *) Malloc(vctsize * sizeof(double));
+      memcpy(Vct, vctptr, vctsize * sizeof(double));
+    }
+}
+
+void
+varDefZAxisReference(int nhlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE])
+{
+  numberOfVerticalLevels = nhlev;
+  numberOfVerticalGrid = nvgrid;
+  memcpy(uuidVGrid, uuid, CDI_UUID_SIZE);
+}
+
+bool
+zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds,
+              const char *longname, const char *units, int ltype1, int ltype2)
+{
+  bool differ = true;
+
+  int ltype1_0 = 0, ltype2_0 = -1;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &ltype1_0);
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, &ltype2_0);
+  bool ltype1IsEqual = (ltype1 == ltype1_0);
+  bool ltype2IsEqual = (ltype2 == ltype2_0);
+  bool hasBounds = (lbounds && ubounds);
+
+  if (ltype1IsEqual && ltype2IsEqual && (zaxistype == zaxisInqType(zaxisID) || zaxistype == ZAXIS_GENERIC))
+    {
+      bool hasBoundsZ = (zaxisInqLbounds(zaxisID, NULL) > 0 && zaxisInqUbounds(zaxisID, NULL) > 0);
+      if (nlevels == zaxisInqSize(zaxisID) && hasBoundsZ == hasBounds)
+        {
+          const double *dlevels = zaxisInqLevelsPtr(zaxisID);
+          if (dlevels && levels)
+            {
+              int levelID;
+              for (levelID = 0; levelID < nlevels; levelID++)
+                if (fabs(dlevels[levelID] - levels[levelID]) > 1.e-9) break;
+              if (levelID == nlevels) differ = false;
+            }
+
+          if (!differ && hasBounds)
+            {
+              double *bounds = (double *) Malloc(2 * (size_t) nlevels * sizeof(double));
+              zaxisInqLbounds(zaxisID, bounds);
+              zaxisInqUbounds(zaxisID, bounds + nlevels);
+              for (int levelID = 0; levelID < nlevels; levelID++)
+                {
+                  if (fabs(lbounds[levelID] - bounds[levelID]) > 1.e-9
+                      || fabs(ubounds[levelID] - bounds[levelID + nlevels]) > 1.e-9)
+                    {
+                      differ = true;
+                      break;
+                    }
+                }
+              Free(bounds);
+            }
+
+          if (!differ)
+            {
+              if (longname && longname[0])
+                {
+                  char zlongname[CDI_MAX_NAME];
+                  int length = CDI_MAX_NAME;
+                  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, zlongname, &length);
+                  if (zlongname[0] && !str_is_equal(longname, zlongname)) differ = true;
+                }
+              if (units && units[0])
+                {
+                  char zunits[CDI_MAX_NAME];
+                  int length = CDI_MAX_NAME;
+                  cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length);
+                  if (zunits[0] && !str_is_equal(units, zunits)) differ = true;
+                }
+            }
+        }
+    }
+
+  return differ;
+}
+
+struct varDefZAxisSearchState
+{
+  int resIDValue;
+  int zaxistype;
+  int nlevels;
+  const double *levels;
+  const double *lbounds;
+  const double *ubounds;
+  const char *longname;
+  const char *units;
+  int ltype1;
+  int ltype2;
+};
+
+static enum cdiApplyRet
+varDefZAxisSearch(int id, void *res, void *data)
+{
+  struct varDefZAxisSearchState *state = (struct varDefZAxisSearchState *) data;
+  (void) res;
+  if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, state->longname,
+                    state->units, state->ltype1, state->ltype2)
+      == false)
+    {
+      state->resIDValue = id;
+      return CDI_APPLY_STOP;
+    }
+  else
+    return CDI_APPLY_GO_ON;
+}
+
+int
+varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength,
+            const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname,
+            const char *units, int prec, int mode, int ltype1, int ltype2)
+{
+  /*
+    mode: 0 search in vlist and zaxis table
+          1 search in zaxis table
+   */
+  int zaxisID = CDI_UNDEFID;
+  bool zaxisdefined = false;
+  bool zaxisglobdefined = false;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int nzaxis = vlistptr->nzaxis;
+
+  if (ltype2 == 255) ltype2 = -1;
+
+  if (mode == 0)
+    for (int index = 0; index < nzaxis; index++)
+      {
+        zaxisID = vlistptr->zaxisIDs[index];
+
+        if (!zaxis_compare(zaxisID, zaxistype, nlevels, levels, levels1, levels2, longname, units, ltype1, ltype2))
+          {
+            zaxisdefined = true;
+            break;
+          }
+      }
+
+  if (!zaxisdefined)
+    {
+      struct varDefZAxisSearchState query;
+      query.zaxistype = zaxistype;
+      query.nlevels = nlevels;
+      query.levels = levels;
+      query.lbounds = levels1;
+      query.ubounds = levels2;
+      query.longname = longname;
+      query.units = units;
+      query.ltype1 = ltype1;
+      query.ltype2 = ltype2;
+
+      if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), varDefZAxisSearch, &query) == CDI_APPLY_STOP)))
+        zaxisID = query.resIDValue;
+
+      if (mode == 1 && zaxisglobdefined)
+        for (int index = 0; index < nzaxis; index++)
+          if (vlistptr->zaxisIDs[index] == zaxisID)
+            {
+              zaxisglobdefined = false;
+              break;
+            }
+    }
+
+  if (!zaxisdefined)
+    {
+      if (!zaxisglobdefined)
+        {
+          zaxisID = zaxisCreate(zaxistype, nlevels);
+          if (levels) zaxisDefLevels(zaxisID, levels);
+          if (levels1 && levels2)
+            {
+              zaxisDefLbounds(zaxisID, levels1);
+              zaxisDefUbounds(zaxisID, levels2);
+            }
+
+          if (cvals != NULL && nlevels != 0 && clength != 0) zaxisDefCvals(zaxisID, cvals, (int) clength);
+
+          if ((zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct);
+
+          if (name && name[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name);
+          if (longname && longname[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname);
+          if (units && units[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units);
+          zaxisDefDatatype(zaxisID, prec);
+          cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype1);
+          if (ltype2 != -1) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, ltype2);
+        }
+
+      vlistptr->zaxisIDs[nzaxis] = zaxisID;
+      vlistptr->nzaxis++;
+    }
+
+  return zaxisID;
+}
+
+void
+varDefMissval(int varID, double missval)
+{
+  vartable[varID].lmissval = true;
+  vartable[varID].missval = missval;
+}
+
+void
+varDefCompType(int varID, int comptype)
+{
+  if (vartable[varID].comptype == CDI_COMPRESS_NONE) vartable[varID].comptype = comptype;
+}
+
+void
+varDefCompLevel(int varID, int complevel)
+{
+  vartable[varID].complevel = complevel;
+}
+
+int
+varInqInst(int varID)
+{
+  return vartable[varID].instID;
+}
+
+void
+varDefInst(int varID, int instID)
+{
+  vartable[varID].instID = instID;
+}
+
+int
+varInqModel(int varID)
+{
+  return vartable[varID].modelID;
+}
+
+void
+varDefModel(int varID, int modelID)
+{
+  vartable[varID].modelID = modelID;
+}
+
+int
+varInqTable(int varID)
+{
+  return vartable[varID].tableID;
+}
+
+void
+varDefTable(int varID, int tableID)
+{
+  vartable[varID].tableID = tableID;
+}
+
+void
+varDefKeyInt(int varID, int key, int value)
+{
+  cdi_keys_t *keysp = &(vartable[varID].keys);
+  cdiDefVarKeyInt(keysp, key, value);
+}
+
+void
+varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length)
+{
+  cdi_keys_t *keysp = &(vartable[varID].keys);
+  cdiDefVarKeyBytes(keysp, key, bytes, length);
+}
+
+void
+varDefKeyString(int varID, int key, const char *string)
+{
+  int length = (int) strlen(string) + 1;
+  cdi_keys_t *keysp = &(vartable[varID].keys);
+  cdiDefVarKeyBytes(keysp, key, (const unsigned char *) string, length);
+}
+
+#ifdef HAVE_LIBGRIB_API
+// Resizes and initializes opt_grib_kvpair data structure.
+static void
+resize_vartable_opt_grib_entries(vartable_t *var, int nentries)
+{
+  if (var->opt_grib_kvpair_size < nentries)
+    {
+      if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries);
+
+      int new_size = ((2 * var->opt_grib_kvpair_size) > nentries) ? (2 * var->opt_grib_kvpair_size) : nentries;
+      if (CDI_Debug) Message("resize vartable opt_grib_entries array to size %d", new_size);
+      opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t));
+      for (int i = 0; i < var->opt_grib_kvpair_size; i++)
+        {
+          tmp[i] = var->opt_grib_kvpair[i];
+        }
+      for (int i = var->opt_grib_kvpair_size; i < new_size; i++)
+        {
+          tmp[i].int_val = 0;
+          tmp[i].dbl_val = 0;
+          tmp[i].update = false;
+          tmp[i].keyword = NULL;
+        }  // for
+      var->opt_grib_kvpair_size = new_size;
+      Free(var->opt_grib_kvpair);
+      var->opt_grib_kvpair = tmp;
+    }
+}
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+void
+varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword)
+{
+  int idx = -1;
+  for (int i = 0; i < vartable[varID].opt_grib_nentries; i++)
+    {
+      if (str_is_equal(keyword, vartable[varID].opt_grib_kvpair[i].keyword)
+          && (vartable[varID].opt_grib_kvpair[i].data_type == t_int)
+          && (vartable[varID].opt_grib_kvpair[i].subtype_index == tile_index))
+        idx = i;
+    }
+
+  if (idx == -1)
+    {
+      resize_vartable_opt_grib_entries(&vartable[varID], vartable[varID].opt_grib_nentries + 1);
+      vartable[varID].opt_grib_nentries += 1;
+      idx = vartable[varID].opt_grib_nentries - 1;
+    }
+  else
+    {
+      if (vartable[varID].opt_grib_kvpair[idx].keyword) Free(vartable[varID].opt_grib_kvpair[idx].keyword);
+    }
+  vartable[varID].opt_grib_kvpair[idx].data_type = t_int;
+  vartable[varID].opt_grib_kvpair[idx].int_val = (int) lval;
+  vartable[varID].opt_grib_kvpair[idx].keyword = strdup(keyword);
+  vartable[varID].opt_grib_kvpair[idx].subtype_index = tile_index;
+}
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+void
+varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword)
+{
+  int idx = -1;
+  for (int i = 0; i < vartable[varID].opt_grib_nentries; i++)
+    {
+      if (str_is_equal(keyword, vartable[varID].opt_grib_kvpair[i].keyword)
+          && (vartable[varID].opt_grib_kvpair[i].data_type == t_double)
+          && (vartable[varID].opt_grib_kvpair[i].subtype_index == tile_index))
+        idx = i;
+    }
+
+  if (idx == -1)
+    {
+      resize_vartable_opt_grib_entries(&vartable[varID], vartable[varID].opt_grib_nentries + 1);
+      vartable[varID].opt_grib_nentries += 1;
+      idx = vartable[varID].opt_grib_nentries - 1;
+    }
+  else
+    {
+      if (vartable[varID].opt_grib_kvpair[idx].keyword) Free(vartable[varID].opt_grib_kvpair[idx].keyword);
+    }
+  vartable[varID].opt_grib_kvpair[idx].data_type = t_double;
+  vartable[varID].opt_grib_kvpair[idx].dbl_val = dval;
+  vartable[varID].opt_grib_kvpair[idx].keyword = strdup(keyword);
+  vartable[varID].opt_grib_kvpair[idx].subtype_index = tile_index;
+}
+#endif
+
+#ifdef HAVE_LIBGRIB_API
+int
+varOptGribNentries(int varID)
+{
+  int nentries = vartable[varID].opt_grib_nentries;
+  return nentries;
+}
+#endif
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+#include <stdbool.h>
+
+
+
+#ifdef HAVE_LIBGRIB_API
+/* list of additional GRIB2 keywords which are read by the open process */
+int cdiNAdditionalGRIBKeys = 0;
+char *cdiAdditionalGRIBKeys[MAX_OPT_GRIB_ENTRIES];
+#endif
+
+static int VLIST_Debug = 0;
+
+static void vlist_initialize(void);
+
+#ifdef HAVE_LIBPTHREAD
+#include <pthread.h>
+
+static pthread_once_t _vlist_init_thread = PTHREAD_ONCE_INIT;
+
+#define VLIST_INIT() pthread_once(&_vlist_init_thread, vlist_initialize)
+
+#else
+
+static bool vlistIsInitialized = false;
+
+#define VLIST_INIT() \
+  if (!vlistIsInitialized) vlist_initialize()
+#endif
+
+static int
+vlist_compare(vlist_t *a, vlist_t *b)
+{
+  int diff = (a->nvars != b->nvars) | (a->ngrids != b->ngrids) | (a->nzaxis != b->nzaxis) | (a->instID != b->instID)
+             | (a->modelID != b->modelID) | (a->tableID != b->tableID) | (a->ntsteps != b->ntsteps)
+             | (a->atts.nelems != b->atts.nelems);
+
+  int nvars = a->nvars;
+  for (int varID = 0; varID < nvars; ++varID) diff |= vlistVarCompare(a, varID, b, varID);
+
+  size_t natts = a->atts.nelems;
+  for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->atts, &a->atts, (int) attID);
+
+  return diff;
+}
+
+static void vlistPrintKernel(vlist_t *vlistptr, FILE *fp);
+static void vlist_delete(vlist_t *vlistptr);
+
+static int vlistGetSizeP(void *vlistptr, void *context);
+static void vlistPackP(void *vlistptr, void *buff, int size, int *position, void *context);
+static int vlistTxCode(void *vlistptr);
+
+const resOps vlistOps = { (valCompareFunc) vlist_compare,
+                          (valDestroyFunc) vlist_delete,
+                          (valPrintFunc) vlistPrintKernel,
+                          vlistGetSizeP,
+                          vlistPackP,
+                          vlistTxCode };
+
+vlist_t *
+vlist_to_pointer(int vlistID)
+{
+  VLIST_INIT();
+  return (vlist_t *) reshGetVal(vlistID, &vlistOps);
+}
+
+static void
+vlist_init_entry(vlist_t *vlistptr)
+{
+  vlistptr->immutable = 0;
+  vlistptr->internal = 0;
+  vlistptr->self = CDI_UNDEFID;
+  vlistptr->nvars = 0;
+  vlistptr->vars = NULL;
+  vlistptr->ngrids = 0;
+  vlistptr->nzaxis = 0;
+  vlistptr->taxisID = CDI_UNDEFID;
+  vlistptr->instID = CDI_Default_InstID;
+  vlistptr->modelID = CDI_Default_ModelID;
+  vlistptr->tableID = CDI_Default_TableID;
+  vlistptr->varsAllocated = 0;
+  vlistptr->ntsteps = CDI_UNDEFID;
+  vlistptr->keys.nalloc = MAX_KEYS;
+  vlistptr->keys.nelems = 0;
+  for (int i = 0; i < MAX_KEYS; ++i) vlistptr->keys.value[i].length = 0;
+  vlistptr->atts.nalloc = MAX_ATTRIBUTES;
+  vlistptr->atts.nelems = 0;
+  vlistptr->nsubtypes = 0;
+  for (int i = 0; i < MAX_SUBTYPES_PS; ++i) vlistptr->subtypeIDs[i] = CDI_UNDEFID;
+}
+
+static vlist_t *
+vlist_new_entry(cdiResH resH)
+{
+  vlist_t *vlistptr = (vlist_t *) Malloc(sizeof(vlist_t));
+  vlist_init_entry(vlistptr);
+  if (resH == CDI_UNDEFID)
+    vlistptr->self = reshPut(vlistptr, &vlistOps);
+  else
+    {
+      vlistptr->self = resH;
+      reshReplace(resH, vlistptr, &vlistOps);
+    }
+  return vlistptr;
+}
+
+static void
+vlist_delete_entry(int vlistID)
+{
+  reshRemove(vlistID, &vlistOps);
+
+  if (VLIST_Debug) Message("Removed idx %d from vlist list", vlistID);
+}
+
+static void
+vlist_initialize(void)
+{
+  char *env = getenv("VLIST_DEBUG");
+  if (env) VLIST_Debug = atoi(env);
+#ifndef HAVE_LIBPTHREAD
+  vlistIsInitialized = true;
+#endif
+}
+
+static void
+vlist_copy(vlist_t *vlistptr2, vlist_t *vlistptr1)
+{
+  int vlistID2 = vlistptr2->self;
+  int vlist2internal = vlistptr2->internal;
+  memcpy(vlistptr2, vlistptr1, sizeof(vlist_t));
+  vlistptr2->internal = vlist2internal;  // the question who's responsible to destroy the vlist is tied to its containing memory
+                                         // region, so we retain this flag
+  vlistptr2->immutable = 0;              // this is a copy, so it's mutable, independent of whether the original is mutable or not
+  vlistptr2->keys.nelems = 0;
+  vlistptr2->atts.nelems = 0;
+  vlistptr2->self = vlistID2;
+}
+
+void
+cdiVlistMakeInternal(int vlistID)
+{
+  vlist_to_pointer(vlistID)->internal = 1;
+}
+
+void
+cdiVlistMakeImmutable(int vlistID)
+{
+  vlist_to_pointer(vlistID)->immutable = 1;
+}
+
+/*
+@Function  vlistCreate
+@Title     Create a variable list
+
+@Prototype int vlistCreate(void)
+
+@Example
+Here is an example using @func{vlistCreate} to create a variable list
+and add a variable with @func{vlistDefVar}.
+
+@Source
+   ...
+int vlistID, varID;
+   ...
+vlistID = vlistCreate();
+varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING);
+   ...
+streamDefVlist(streamID, vlistID);
+   ...
+vlistDestroy(vlistID);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+vlistCreate(void)
+{
+  cdiInitialize();
+
+  VLIST_INIT();
+
+  vlist_t *vlistptr = vlist_new_entry(CDI_UNDEFID);
+  if (CDI_Debug) Message("create vlistID = %d", vlistptr->self);
+  return vlistptr->self;
+}
+
+static void
+vlist_delete(vlist_t *vlistptr)
+{
+  int vlistID = vlistptr->self;
+  if (CDI_Debug) Message("call to vlist_delete, vlistID = %d", vlistID);
+
+  cdiDeleteKeys(vlistID, CDI_GLOBAL);
+  cdiDeleteAtts(vlistID, CDI_GLOBAL);
+
+  int nvars = vlistptr->nvars;
+  var_t *vars = vlistptr->vars;
+
+  for (int varID = 0; varID < nvars; varID++)
+    {
+      if (vars[varID].levinfo) Free(vars[varID].levinfo);
+
+      if (vlistptr->vars[varID].opt_grib_kvpair)
+        {
+          for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++)
+            {
+              if (vlistptr->vars[varID].opt_grib_kvpair[i].keyword) Free(vlistptr->vars[varID].opt_grib_kvpair[i].keyword);
+            }
+          Free(vlistptr->vars[varID].opt_grib_kvpair);
+        }
+      vlistptr->vars[varID].opt_grib_nentries = 0;
+      vlistptr->vars[varID].opt_grib_kvpair_size = 0;
+      vlistptr->vars[varID].opt_grib_kvpair = NULL;
+
+      cdiDeleteKeys(vlistID, varID);
+      cdiDeleteAtts(vlistID, varID);
+    }
+
+  if (vars) Free(vars);
+
+  Free(vlistptr);
+}
+
+// destroy a vlist object, should always be called through namespace lookup
+void
+cdiVlistDestroy_(int vlistID, bool assertInternal)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  static const char warningTextUserByInternal[]
+      = "Destroying a vlist object that is owned by the user (vlistID=%d).\n"
+        "This is most likely because of a missing vlistDestroy() in the application code.\n"
+        "If that's not the case, and you are absolutely certain about it, please report the bug.",
+      warningTextInternalByUser[] = "Attempt to destroy an internal vlist object by the user (vlistID=%d).";
+  static const char *const wText[2] = { warningTextUserByInternal, warningTextInternalByUser };
+  if (vlistptr->internal == assertInternal)
+    {
+      vlist_delete(vlistptr);
+      vlist_delete_entry(vlistID);
+    }
+  else
+    Warning(wText[!assertInternal], vlistID);
+}
+
+/*
+@Function  vlistDestroy
+@Title     Destroy a variable list
+
+@Prototype void vlistDestroy(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+
+@EndFunction
+*/
+void
+vlistDestroy(int vlistID)
+{
+  void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func;
+  mycdiVlistDestroy_(vlistID, false);
+}
+
+static void
+var_copy_entries(var_t *var2, var_t *var1)
+{
+  var2->opt_grib_kvpair_size = 0;
+  var2->opt_grib_kvpair = NULL;
+  var2->opt_grib_nentries = 0;
+
+  resize_opt_grib_entries(var2, var1->opt_grib_nentries);
+  var2->opt_grib_nentries = var1->opt_grib_nentries;
+  if ((var2->opt_grib_nentries > 0) && CDI_Debug) Message("copy %d optional GRIB keywords", var2->opt_grib_nentries);
+
+  for (int i = 0; i < var1->opt_grib_nentries; i++)
+    {
+      if (CDI_Debug) Message("copy entry \"%s\" ...", var1->opt_grib_kvpair[i].keyword);
+      var2->opt_grib_kvpair[i].keyword = NULL;
+      if (var1->opt_grib_kvpair[i].keyword != NULL)
+        {
+          var2->opt_grib_kvpair[i] = var1->opt_grib_kvpair[i];
+          var2->opt_grib_kvpair[i].keyword = strdup(var1->opt_grib_kvpair[i].keyword);
+          var2->opt_grib_kvpair[i].update = true;
+          if (CDI_Debug) Message("done.");
+        }
+      else
+        {
+          if (CDI_Debug) Message("not done.");
+        }
+    }
+}
+
+/*
+@Function  vlistCopy
+@Title     Copy a variable list
+
+@Prototype void vlistCopy(int vlistID2, int vlistID1)
+@Parameter
+    @Item  vlistID1  Source variable list ID.
+    @Item  vlistID2  Target variable list ID.
+
+@Description
+The function @func{vlistCopy} copies all entries from vlistID1 to vlistID2.
+
+@EndFunction
+*/
+void
+vlistCopy(int vlistID1, int vlistID2)
+{
+  vlist_t *vlistptr1 = vlist_to_pointer(vlistID1);
+  vlist_t *vlistptr2 = vlist_to_pointer(vlistID2);
+  if (CDI_Debug) Message("call to vlistCopy, vlistIDs %d -> %d", vlistID1, vlistID2);
+
+  var_t *vars1 = vlistptr1->vars;
+  var_t *vars2 = vlistptr2->vars;
+  vlist_copy(vlistptr2, vlistptr1);
+
+  vlistptr2->keys.nelems = 0;
+  cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL);
+  vlistptr2->atts.nelems = 0;
+  cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL);
+
+  if (vars1)
+    {
+      int nvars = vlistptr1->nvars;
+      // vlistptr2->varsAllocated = nvars;
+
+      size_t n = (size_t) vlistptr2->varsAllocated;
+      vars2 = (var_t *) Realloc(vars2, n * sizeof(var_t));
+      memcpy(vars2, vars1, n * sizeof(var_t));
+      vlistptr2->vars = vars2;
+
+      for (int varID = 0; varID < nvars; varID++)
+        {
+          var_copy_entries(&vars2[varID], &vars1[varID]);
+          vlistptr2->vars[varID].keys.nelems = 0;
+          cdiCopyKeys(vlistID1, varID, vlistID2, varID);
+
+          vlistptr2->vars[varID].atts.nelems = 0;
+          cdiCopyAtts(vlistID1, varID, vlistID2, varID);
+
+          if (vars1[varID].levinfo)
+            {
+              n = (size_t) zaxisInqSize(vars1[varID].zaxisID);
+              vars2[varID].levinfo = (levinfo_t *) Malloc(n * sizeof(levinfo_t));
+              memcpy(vars2[varID].levinfo, vars1[varID].levinfo, n * sizeof(levinfo_t));
+            }
+        }
+    }
+}
+
+/*
+@Function  vlistDuplicate
+@Title     Duplicate a variable list
+
+@Prototype int vlistDuplicate(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+
+@Description
+The function @func{vlistDuplicate} duplicates the variable list from vlistID1.
+
+@Result
+@func{vlistDuplicate} returns an identifier to the duplicated variable list.
+
+@EndFunction
+*/
+int
+vlistDuplicate(int vlistID)
+{
+  if (CDI_Debug) Message("call to vlistDuplicate");
+
+  int vlistIDnew = vlistCreate();
+  vlistCopy(vlistID, vlistIDnew);
+  return vlistIDnew;
+}
+
+void
+vlistClearFlag(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int varID = 0; varID < vlistptr->nvars; varID++)
+    {
+      vlistptr->vars[varID].flag = false;
+      if (vlistptr->vars[varID].levinfo)
+        {
+          int nlevs = zaxisInqSize(vlistptr->vars[varID].zaxisID);
+          for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID].flag = false;
+        }
+    }
+}
+
+struct vgzSearchState
+{
+  int resIDValue;
+  int zaxistype;
+  int nlevels;
+  const double *levels;
+  const double *lbounds;
+  const double *ubounds;
+};
+
+static enum cdiApplyRet
+vgzZAxisSearch(int id, void *res, void *data)
+{
+  struct vgzSearchState *state = (struct vgzSearchState *) data;
+  (void) res;
+  if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, NULL, NULL, 0, -1)
+      == false)
+    {
+      state->resIDValue = id;
+      return CDI_APPLY_STOP;
+    }
+
+  return CDI_APPLY_GO_ON;
+}
+
+static int
+vlist_generate_zaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds,
+                     int vctsize, const double *vct, const char **cvals, size_t clen)
+{
+  int zaxisID = CDI_UNDEFID;
+  bool zaxisdefined = false;
+  bool zaxisglobdefined = false;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int nzaxis = vlistptr->nzaxis;
+
+  bool hasBounds = (lbounds && ubounds);
+
+  for (int index = 0; index < nzaxis; ++index)
+    {
+      zaxisID = vlistptr->zaxisIDs[index];
+
+      if (zaxis_compare(zaxisID, zaxistype, nlevels, levels, lbounds, ubounds, NULL, NULL, 0, -1) == false)
+        {
+          zaxisdefined = true;
+          break;
+        }
+    }
+
+  if (!zaxisdefined)
+    {
+      struct vgzSearchState query;
+      query.zaxistype = zaxistype;
+      query.nlevels = nlevels;
+      query.levels = levels;
+      query.lbounds = lbounds;
+      query.ubounds = ubounds;
+
+      if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), vgzZAxisSearch, &query) == CDI_APPLY_STOP)))
+        zaxisID = query.resIDValue;
+    }
+
+  if (!zaxisdefined)
+    {
+      if (!zaxisglobdefined)
+        {
+          zaxisID = zaxisCreate(zaxistype, nlevels);
+          zaxisDefLevels(zaxisID, levels);
+
+          if (zaxistype == ZAXIS_CHAR) zaxisDefCvals(zaxisID, cvals, (int) clen);
+
+          if (hasBounds)
+            {
+              zaxisDefLbounds(zaxisID, lbounds);
+              zaxisDefUbounds(zaxisID, ubounds);
+            }
+
+          if (zaxistype == ZAXIS_HYBRID && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct);
+        }
+
+      nzaxis = vlistptr->nzaxis;
+      vlistptr->zaxisIDs[nzaxis] = zaxisID;
+      vlistptr->nzaxis++;
+    }
+
+  return zaxisID;
+}
+
+/*
+@Function  vlistCopyFlag
+@Title     Copy some entries of a variable list
+
+@Prototype void vlistCopyFlag(int vlistID2, int vlistID1)
+@Parameter
+    @Item  vlistID2  Target variable list ID.
+    @Item  vlistID1  Source variable list ID.
+
+@Description
+The function @func{vlistCopyFlag} copies all entries with a flag from vlistID1 to vlistID2.
+
+@EndFunction
+*/
+void
+vlistCopyFlag(int vlistID2, int vlistID1)
+{
+  vlist_t *vlistptr1 = vlist_to_pointer(vlistID1);
+  vlist_t *vlistptr2 = vlist_to_pointer(vlistID2);
+  var_t *vars1 = vlistptr1->vars;
+  var_t *vars2 = vlistptr2->vars;
+
+  vlist_copy(vlistptr2, vlistptr1);
+
+  vlistptr2->keys.nelems = 0;
+  cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL);
+  vlistptr2->atts.nelems = 0;
+  cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL);
+
+  if (vlistptr1->vars)
+    {
+      vlistptr2->ngrids = 0;
+      vlistptr2->nzaxis = 0;
+
+      int nvars = vlistptr1->nvars;
+      int nvars2 = 0;
+      for (int varID = 0; varID < nvars; varID++) nvars2 += vars1[varID].flag;
+
+      vlistptr2->nvars = nvars2;
+      vlistptr2->varsAllocated = nvars2;
+      vars2 = (nvars2 > 0) ? (var_t *) Malloc((size_t) nvars2 * sizeof(var_t)) : NULL;
+
+      vlistptr2->vars = vars2;
+
+      int varID2 = 0;
+      for (int varID = 0; varID < nvars; varID++)
+        if (vars1[varID].flag)
+          {
+            vlistptr2->vars[varID2].flag = false;
+            int zaxisID = vlistptr1->vars[varID].zaxisID;
+            int gridID = vlistptr1->vars[varID].gridID;
+            int subtypeID = vlistptr1->vars[varID].subtypeID;
+
+            memcpy(&vars2[varID2], &vars1[varID], sizeof(var_t));
+
+            vars1[varID].fvarID = varID2;
+            vars2[varID2].fvarID = varID;
+
+            vars2[varID2].mvarID = varID2;
+
+            var_copy_entries(&vars2[varID2], &vars1[varID]);
+            vlistptr2->vars[varID2].keys.nelems = 0;
+            cdiCopyKeys(vlistID1, varID, vlistID2, varID2);
+
+            vlistptr2->vars[varID2].atts.nelems = 0;
+            cdiCopyAtts(vlistID1, varID, vlistID2, varID2);
+
+            int nlevs = zaxisInqSize(vars1[varID].zaxisID);
+            int nlevs2 = 0;
+            if (vars1[varID].levinfo)
+              for (int levID = 0; levID < nlevs; levID++) nlevs2 += vars1[varID].levinfo[levID].flag;
+
+            vars2[varID2].levinfo = (levinfo_t *) Malloc((size_t) nlevs2 * sizeof(levinfo_t));
+
+            if (nlevs != nlevs2)
+              {
+                int nvct = 0;
+                double *levels = NULL;
+                double *lbounds = NULL, *ubounds = NULL;
+                const double *vct = NULL;
+
+                if (!vars1[varID].levinfo) cdiVlistCreateVarLevInfo(vlistptr1, varID);
+
+                zaxisID = vars1[varID].zaxisID;
+                int zaxisType = zaxisInqType(zaxisID);
+
+                int levID2 = 0;
+                for (int levID = 0; levID < nlevs; levID++)
+                  if (vars1[varID].levinfo[levID].flag)
+                    {
+                      vars1[varID].levinfo[levID].flevelID = levID2;
+                      vars1[varID].levinfo[levID].mlevelID = levID2;
+                    }
+
+                if (zaxisInqLevels(zaxisID, NULL))
+                  {
+                    levels = (double *) Malloc((size_t) nlevs2 * sizeof(double));
+
+                    levID2 = 0;
+                    for (int levID = 0; levID < nlevs; ++levID)
+                      if (vars1[varID].levinfo[levID].flag) levels[levID2++] = zaxisInqLevel(zaxisID, levID);
+                  }
+
+                if (zaxisType == ZAXIS_HYBRID)
+                  {
+                    nvct = zaxisInqVctSize(zaxisID);
+                    vct = zaxisInqVctPtr(zaxisID);
+                  }
+
+                size_t clen2 = 0;
+                char **cvals2 = NULL;
+#ifndef USE_MPI
+                if (zaxisType == ZAXIS_CHAR)
+                  {
+                    char **cvals1 = zaxisInqCValsPtr(zaxisID);
+                    size_t clen1 = (size_t) zaxisInqCLen(zaxisID);
+                    for (int levID = 0; levID < nlevs; ++levID)
+                      if (vars1[varID].levinfo[levID].flag)
+                        {
+                          size_t testlen = clen1;
+                          while (cvals1[levID][testlen] == ' ') testlen--;
+                          if (clen2 < testlen) clen2 = testlen;
+                        }
+                    cvals2 = (char **) Malloc((size_t) nlevs2 * sizeof(char *));
+                    levID2 = 0;
+
+                    for (int levID = 0; levID < nlevs; ++levID)
+                      if (vars1[varID].levinfo[levID].flag)
+                        {
+                          cvals2[levID2] = (char *) Malloc((size_t) (clen2) * sizeof(char));
+                          memcpy(cvals2[levID2], cvals1[levID], clen2 * sizeof(char));
+                          levID2++;
+                        }
+                  }
+#endif
+
+                if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL))
+                  {
+                    lbounds = (double *) Malloc(2 * (size_t) nlevs2 * sizeof(double));
+                    ubounds = lbounds + nlevs2;
+
+                    double *lbounds1 = (double *) Malloc(2 * (size_t) nlevs * sizeof(double)), *ubounds1 = lbounds1 + nlevs;
+
+                    zaxisInqLbounds(zaxisID, lbounds1);
+                    zaxisInqUbounds(zaxisID, ubounds1);
+
+                    levID2 = 0;
+                    for (int levID = 0; levID < nlevs; ++levID)
+                      if (vars1[varID].levinfo[levID].flag)
+                        {
+                          lbounds[levID2] = lbounds1[levID];
+                          ubounds[levID2] = ubounds1[levID];
+                          levID2++;
+                        }
+
+                    Free(lbounds1);
+                  }
+
+                int zaxisID2 = vlist_generate_zaxis(vlistID2, zaxisType, nlevs2, levels, lbounds, ubounds, nvct, vct,
+                                                    (const char **) cvals2, clen2);
+                if (levels) Free(levels);
+                if (lbounds) Free(lbounds);
+                if (cvals2)
+                  {
+                    for (int levID = 0; levID < nlevs2; ++levID) Free(cvals2[levID]);
+                    Free(cvals2);
+                  }
+
+                char ctemp[CDI_MAX_NAME];
+                int length = CDI_MAX_NAME;
+                cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ctemp, &length);
+                cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_NAME, ctemp);
+                length = CDI_MAX_NAME;
+                cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp, &length);
+                cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp);
+                length = CDI_MAX_NAME;
+                cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ctemp, &length);
+                cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_UNITS, ctemp);
+
+                zaxisDefDatatype(zaxisID2, zaxisInqDatatype(zaxisID));
+                zaxisDefPositive(zaxisID2, zaxisInqPositive(zaxisID));
+
+                if (zaxisType == ZAXIS_CHAR)
+                  {
+                    char dimname[CDI_MAX_NAME + 3];
+                    length = sizeof(dimname);
+                    cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length);
+                    if (dimname[0] == 0)
+                      {
+                        memcpy(dimname, "area_type", 10);
+                        dimname[10] = 0;
+                      }
+                    cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname);
+                  }
+
+                if (zaxisType == ZAXIS_GENERIC) cdiCopyKey(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, zaxisID2);
+
+                cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisID2, CDI_GLOBAL);
+
+                zaxisID = zaxisID2;
+                vars2[varID2].zaxisID = zaxisID2;
+              }
+
+            for (int levID = 0; levID < nlevs2; levID++)
+              {
+                vars2[varID2].levinfo[levID].flag = false;
+                vars2[varID2].levinfo[levID].index = -1;
+              }
+
+            int levID2 = 0;
+            for (int levID = 0; levID < nlevs; levID++)
+              if (vars1[varID].levinfo[levID].flag)
+                {
+                  vars2[varID2].levinfo[levID2].flevelID = levID;
+                  vars2[varID2].levinfo[levID2].mlevelID = levID2;
+                  levID2++;
+                }
+
+            vlistAdd2GridIDs(vlistptr2, gridID);
+            vlistAdd2ZaxisIDs(vlistptr2, zaxisID);
+            vlistAdd2SubtypeIDs(vlistptr2, subtypeID);
+
+            varID2++;
+          }
+    }
+}
+
+/*
+@Function  vlistCat
+@Title     Concatenate two variable lists
+
+@Prototype void vlistCat(int vlistID2, int vlistID1)
+@Parameter
+    @Item  vlistID2  Target variable list ID.
+    @Item  vlistID1  Source variable list ID.
+
+@Description
+Concatenate the variable list vlistID1 at the end of vlistID2.
+
+@EndFunction
+*/
+void
+vlistCat(int vlistID2, int vlistID1)
+{
+  vlist_t *vlistptr1 = vlist_to_pointer(vlistID1);
+  vlist_t *vlistptr2 = vlist_to_pointer(vlistID2);
+  var_t *vars1 = vlistptr1->vars;
+  var_t *vars2 = vlistptr2->vars;
+  int nvars1 = vlistptr1->nvars;
+  int nvars2 = vlistptr2->nvars;
+  int nvars = nvars1 + nvars2;
+  vlistptr2->nvars = nvars;
+
+  if (nvars > vlistptr2->varsAllocated)
+    {
+      vlistptr2->varsAllocated = nvars;
+      vars2 = (var_t *) Realloc(vars2, (size_t) nvars * sizeof(var_t));
+      vlistptr2->vars = vars2;
+    }
+  memcpy(vars2 + nvars2, vars1, (size_t) nvars1 * sizeof(var_t));
+
+  for (int varID = 0; varID < nvars1; varID++)
+    {
+      int varID2 = varID + nvars2;
+      vars1[varID].fvarID = varID2;
+      vars2[varID2].fvarID = varID;
+
+      vars1[varID].mvarID = varID2;
+      vars2[varID2].mvarID = varID;
+
+      if (vars1[varID].param < 0)
+        {
+          int pnum, pcat, pdis;
+          cdiDecodeParam(vars1[varID].param, &pnum, &pcat, &pdis);
+          pnum = -(varID2 + 1);
+          vars2[varID2].param = cdiEncodeParam(pnum, pcat, pdis);
+        }
+
+      var_copy_entries(&vars2[varID2], &vars1[varID]);
+      vars2[varID2].keys.nelems = 0;
+      cdiCopyKeys(vlistID1, varID, vlistID2, varID2);
+
+      if (vars1[varID].levinfo)
+        {
+          size_t nlevs = (size_t) zaxisInqSize(vars1[varID].zaxisID);
+          vars2[varID2].levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t));
+          memcpy(vars2[varID2].levinfo, vars1[varID].levinfo, nlevs * sizeof(levinfo_t));
+        }
+
+      vars2[varID2].atts.nelems = 0;
+      cdiCopyAtts(vlistID1, varID, vlistID2, varID2);
+
+      vlistAdd2GridIDs(vlistptr2, vars1[varID].gridID);
+      vlistAdd2ZaxisIDs(vlistptr2, vars1[varID].zaxisID);
+      vlistAdd2SubtypeIDs(vlistptr2, vars1[varID].subtypeID);
+    }
+}
+
+/*
+@Function  vlistMerge
+@Title     Merge two variable lists
+
+@Prototype void vlistMerge(int vlistID2, int vlistID1)
+@Parameter
+    @Item  vlistID2  Target variable list ID.
+    @Item  vlistID1  Source variable list ID.
+
+@Description
+Merge the variable list vlistID1 to the variable list vlistID2.
+
+@EndFunction
+*/
+void
+vlistMerge(int vlistID2, int vlistID1)
+{
+  int varID = 0;
+  vlist_t *vlistptr1 = vlist_to_pointer(vlistID1);
+  vlist_t *vlistptr2 = vlist_to_pointer(vlistID2);
+  var_t *vars1 = vlistptr1->vars;
+  var_t *vars2 = vlistptr2->vars;
+  int nvars1 = vlistptr1->nvars;
+  int nvars2 = vlistptr2->nvars;
+
+  if (nvars1 == nvars2)
+    {
+      char name1[CDI_MAX_NAME], name2[CDI_MAX_NAME];
+      for (varID = 0; varID < nvars2; varID++)
+        {
+          SizeType ngp1 = gridInqSize(vars1[varID].gridID);
+          SizeType ngp2 = gridInqSize(vars2[varID].gridID);
+          if (ngp1 != ngp2) break;
+
+          int length = CDI_MAX_NAME;
+          (void) cdiInqKeyString(vlistID1, varID, CDI_KEY_NAME, name1, &length);
+          length = CDI_MAX_NAME;
+          (void) cdiInqKeyString(vlistID2, varID, CDI_KEY_NAME, name2, &length);
+
+          if (*name1 && *name2)
+            {
+              if (!str_is_equal(name1, name2)) break;
+            }
+          else
+            {
+              if (vars1[varID].param != vars2[varID].param) break;
+            }
+        }
+    }
+
+  if (varID == nvars2) /* same variables in vlistID1 and vlistID2 */
+    {
+      for (varID = 0; varID < nvars2; varID++)
+        {
+          vars1[varID].fvarID = varID;
+          vars2[varID].fvarID = varID;
+
+          vars1[varID].mvarID = varID;
+          vars2[varID].mvarID = varID;
+
+          int nlevs1 = zaxisInqSize(vars1[varID].zaxisID);
+          int nlevs2 = zaxisInqSize(vars2[varID].zaxisID);
+
+          int nlevs = nlevs1 + nlevs2;
+
+          /*
+          fprintf(stderr, "var %d %d %d %d %d\n", varID, nlevs1, nlevs2, nlevs, sizeof(levinfo_t));
+          */
+          if (vars1[varID].levinfo)
+            {
+              vars2[varID].levinfo = (levinfo_t *) Realloc(vars2[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t));
+
+              memcpy(vars2[varID].levinfo + nlevs2, vars1[varID].levinfo, (size_t) nlevs1 * sizeof(levinfo_t));
+            }
+          else
+            cdiVlistCreateVarLevInfo(vlistptr1, varID);
+
+          for (int levID = 0; levID < nlevs1; levID++) vars1[varID].levinfo[levID].mlevelID = nlevs2 + levID;
+        }
+
+      bool *lvar = (bool *) Calloc((size_t) nvars2, sizeof(bool));
+
+      for (varID = 0; varID < nvars2; varID++)
+        {
+          if (lvar[varID] == true) continue;
+
+          int zaxisID1 = vars1[varID].zaxisID;
+          int zaxisID2 = vars2[varID].zaxisID;
+          // nlevs1 = zaxisInqSize(vars1[varID].zaxisID);
+          // nlevs2 = zaxisInqSize(vars2[varID].zaxisID);
+          int nlevs1 = zaxisInqSize(zaxisID1);
+          int nlevs2 = zaxisInqSize(zaxisID2);
+          // fprintf(stderr, "zaxis %d %d %d %d\n", zaxisID1, zaxisID2, nlevs1, nlevs2);
+
+          int nlevs = nlevs1 + nlevs2;
+
+          int zaxisID = zaxisDuplicate(zaxisID2);
+          zaxisResize(zaxisID, nlevs);
+
+          if (zaxisInqLevels(zaxisID1, NULL))
+            {
+              double *levels = (double *) Malloc((size_t) nlevs1 * sizeof(double));
+
+              zaxisInqLevels(zaxisID1, levels);
+              /*
+                for (int levID = 0; levID < nlevs1; levID++)
+                  fprintf(stderr, "%d %d %d %d %d %g\n", varID, levID, nlevs1, nlevs2, vars2[varID].nlevs, levels[levID]);
+              */
+              for (int levID = 0; levID < nlevs1; levID++) zaxisDefLevel(zaxisID, nlevs2 + levID, levels[levID]);
+
+              Free(levels);
+            }
+
+          for (int index = 0; index < vlistptr2->nzaxis; index++)
+            if (vlistptr2->zaxisIDs[index] == zaxisID2) vlistptr2->zaxisIDs[index] = zaxisID;
+
+          for (int varID2 = 0; varID2 < nvars2; varID2++)
+            if (lvar[varID2] == false && vars2[varID2].zaxisID == zaxisID2)
+              {
+                vars2[varID2].zaxisID = zaxisID;
+                lvar[varID2] = true;
+              }
+        }
+
+      Free(lvar);
+    }
+  else
+    {
+      vlistCat(vlistID2, vlistID1);
+    }
+}
+
+/*
+@Function  vlistNvars
+@Title     Number of variables in a variable list
+
+@Prototype int vlistNvars(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+
+@Description
+The function @func{vlistNvars} returns the number of variables in the variable list vlistID.
+
+@Result
+@func{vlistNvars} returns the number of variables in a variable list.
+
+@EndFunction
+*/
+int
+vlistNvars(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  return vlistptr->nvars;
+}
+
+int
+vlistNumRecords(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int nrecs = 0;
+  for (int varID = 0; varID < vlistptr->nvars; varID++) nrecs += zaxisInqSize(vlistptr->vars[varID].zaxisID);
+
+  return nrecs;
+}
+
+int
+vlistNumber(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int datatype = vlistptr->vars[0].datatype;
+  int number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL;
+
+  for (int varID = 1; varID < vlistptr->nvars; varID++)
+    {
+      datatype = vlistptr->vars[varID].datatype;
+      int number2 = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL;
+      if (number2 != number)
+        {
+          number = CDI_BOTH;
+          break;
+        }
+    }
+
+  return number;
+}
+
+/*
+@Function  vlistNumGrids
+@Title     Number of grids in a variable list
+
+@Prototype int vlistNumGrids(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+
+@Description
+The function @func{vlistNumGrids} returns the number of grids in the variable list vlistID.
+
+@Result
+@func{vlistNumGrids} returns the number of grids in a variable list.
+
+@EndFunction
+*/
+int
+vlistNumGrids(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  return vlistptr->ngrids;
+}
+
+/*
+@Function  vlistNumZaxis
+@Title     Number of zaxis in a variable list
+
+@Prototype int vlistNumZaxis(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+
+@Description
+The function @func{vlistNumZaxis} returns the number of zaxis in the variable list vlistID.
+
+@Result
+@func{vlistNumZaxis} returns the number of zaxis in a variable list.
+
+@EndFunction
+*/
+int
+vlistNumZaxis(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  return vlistptr->nzaxis;
+}
+
+int
+vlistNsubtypes(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  return vlistptr->nsubtypes;
+}
+
+void
+vlistDefNtsteps(int vlistID, int nts)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (vlistptr->ntsteps != nts)
+    {
+      vlistptr->ntsteps = nts;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+// This function is used in CDO!
+int
+vlistNtsteps(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  return (int) vlistptr->ntsteps;
+}
+
+static void
+vlistPrintKernel(vlist_t *vlistptr, FILE *fp)
+{
+  int vlistID = vlistptr->self;
+  fprintf(fp, "#\n# vlistID %d\n#\n", vlistID);
+
+  int nvars = vlistptr->nvars;
+
+  fprintf(fp,
+          "nvars    : %d\n"
+          "ngrids   : %d\n"
+          "nzaxis   : %d\n"
+          "nsubtypes: %d\n"
+          "taxisID  : %d\n"
+          "instID   : %d\n"
+          "modelID  : %d\n"
+          "tableID  : %d\n",
+          nvars, vlistptr->ngrids, vlistptr->nzaxis, vlistptr->nsubtypes, vlistptr->taxisID, vlistptr->instID, vlistptr->modelID,
+          vlistptr->tableID);
+
+  if (nvars > 0)
+    {
+      fprintf(fp, " varID param    gridID zaxisID stypeID tsteptype flag name     longname         units\n");
+      for (int varID = 0; varID < nvars; varID++)
+        {
+          int param = vlistptr->vars[varID].param;
+          int gridID = vlistptr->vars[varID].gridID;
+          int zaxisID = vlistptr->vars[varID].zaxisID;
+          int subtypeID = vlistptr->vars[varID].subtypeID;
+          int tsteptype = vlistptr->vars[varID].tsteptype;
+          char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME];
+          int length = CDI_MAX_NAME;
+          (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length);
+          length = CDI_MAX_NAME;
+          (void) cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length);
+          length = CDI_MAX_NAME;
+          (void) cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length);
+          int flag = vlistptr->vars[varID].flag;
+
+          char paramstr[32];
+          cdiParamToString(param, paramstr, sizeof(paramstr));
+          fprintf(fp, "%6d %-8s %6d  %6d  %6d  %6d  %5d %-8s %s [%s]\n", varID, paramstr, gridID, zaxisID, subtypeID, tsteptype,
+                  flag, name, longname, units);
+        }
+
+      fputs("\n"
+            " varID  levID fvarID flevID mvarID mlevID  index  dtype  flag  level\n",
+            fp);
+      for (int varID = 0; varID < nvars; varID++)
+        {
+          int zaxisID = vlistptr->vars[varID].zaxisID;
+          int nlevs = zaxisInqSize(zaxisID);
+          int fvarID = vlistptr->vars[varID].fvarID;
+          int mvarID = vlistptr->vars[varID].mvarID;
+          int dtype = vlistptr->vars[varID].datatype;
+          for (int levID = 0; levID < nlevs; levID++)
+            {
+              levinfo_t li;
+              if (vlistptr->vars[varID].levinfo)
+                li = vlistptr->vars[varID].levinfo[levID];
+              else
+                li = DEFAULT_LEVINFO(levID);
+              int flevID = li.flevelID;
+              int mlevID = li.mlevelID;
+              int index = li.index;
+              int flag = li.flag;
+
+              double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levID) : levID + 1;
+
+              fprintf(fp, "%6d %6d %6d %6d %6d %6d %6d %6d %5d  %.9g\n", varID, levID, fvarID, flevID, mvarID, mlevID, index, dtype,
+                      flag, level);
+            }
+        }
+
+      fputs("\n"
+            " varID  size\n",
+            fp);
+      for (int varID = 0; varID < nvars; varID++)
+        fprintf(fp, "%3d %8zu\n", varID,
+                (size_t) zaxisInqSize(vlistptr->vars[varID].zaxisID) * (size_t) gridInqSize(vlistptr->vars[varID].gridID));
+    }
+}
+
+void
+vlistPrint(int vlistID)
+{
+  if (vlistID == CDI_UNDEFID) return;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  vlistPrintKernel(vlistptr, stdout);
+}
+
+/*
+@Function  vlistDefTaxis
+@Title     Define the time axis
+
+@Prototype void vlistDefTaxis(int vlistID, int taxisID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  taxisID  Time axis ID, from a previous call to @fref{taxisCreate}.
+
+@Description
+The function @func{vlistDefTaxis} defines the time axis of a variable list.
+
+@EndFunction
+*/
+void
+vlistDefTaxis(int vlistID, int taxisID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (vlistptr->taxisID != taxisID)
+    {
+      // FIXME: This code seems to leak a taxis_t object if `vlistptr->taxisID` was valid before the call to vlistDefTaxis.
+      vlistptr->taxisID = taxisID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  vlistInqTaxis
+@Title     Get the time axis
+
+@Prototype int vlistInqTaxis(int vlistID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+
+@Description
+The function @func{vlistInqTaxis} returns the time axis of a variable list.
+
+@Result
+@func{vlistInqTaxis} returns an identifier to the time axis.
+
+@EndFunction
+*/
+int
+vlistInqTaxis(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  return vlistptr->taxisID;
+}
+
+void
+vlistDefTable(int vlistID, int tableID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (vlistptr->tableID != tableID)
+    {
+      vlistptr->tableID = tableID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqTable(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  return vlistptr->tableID;
+}
+
+void
+vlistDefInstitut(int vlistID, int instID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (vlistptr->instID != instID)
+    {
+      vlistptr->instID = instID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqInstitut(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int instID = vlistptr->instID;
+
+  if (instID == CDI_UNDEFID)
+    {
+      instID = vlistInqVarInstitut(vlistID, 0);
+
+      for (int varID = 1; varID < vlistptr->nvars; varID++)
+        if (instID != vlistInqVarInstitut(vlistID, varID))
+          {
+            instID = CDI_UNDEFID;
+            break;
+          }
+      vlistDefInstitut(vlistID, instID);
+    }
+
+  return instID;
+}
+
+void
+vlistDefModel(int vlistID, int modelID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (vlistptr->modelID != modelID)
+    {
+      vlistptr->modelID = modelID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqModel(int vlistID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int modelID = vlistptr->modelID;
+
+  if (modelID == CDI_UNDEFID)
+    {
+      modelID = vlistInqVarModel(vlistID, 0);
+
+      for (int varID = 1; varID < vlistptr->nvars; varID++)
+        if (modelID != vlistInqVarModel(vlistID, varID))
+          {
+            modelID = CDI_UNDEFID;
+            break;
+          }
+
+      vlistDefModel(vlistID, modelID);
+    }
+
+  return modelID;
+}
+
+SizeType
+vlistGridsizeMax(int vlistID)
+{
+  SizeType gridsizemax = 0;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int index = 0; index < vlistptr->ngrids; index++)
+    {
+      int gridID = vlistptr->gridIDs[index];
+      SizeType gridsize = gridInqSize(gridID);
+      if (gridsize > gridsizemax) gridsizemax = gridsize;
+    }
+
+  return gridsizemax;
+}
+
+int
+vlistGrid(int vlistID, int index)
+{
+  int gridID = CDI_UNDEFID;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (index < vlistptr->ngrids && index >= 0) gridID = vlistptr->gridIDs[index];
+
+  return gridID;
+}
+
+int
+vlistGridIndex(int vlistID, int gridID)
+{
+  int index;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (index = 0; index < vlistptr->ngrids; index++)
+    if (gridID == vlistptr->gridIDs[index]) break;
+
+  if (index == vlistptr->ngrids) index = -1;
+
+  return index;
+}
+
+void
+vlistChangeGridIndex(int vlistID, int index, int gridID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int gridIDold = vlistptr->gridIDs[index];
+  if (gridIDold != gridID)
+    {
+      vlistptr->gridIDs[index] = gridID;
+
+      int nvars = vlistptr->nvars;
+      for (int varID = 0; varID < nvars; varID++)
+        if (vlistptr->vars[varID].gridID == gridIDold)
+          {
+            vlistptr->vars[varID].gridID = gridID;
+            int chunkSize = 0;
+            cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize);
+            if (chunkSize > 0) cdiDeleteKey(vlistID, varID, CDI_KEY_CHUNKSIZE);
+            if (gridInqXsize(gridIDold) == 0 && gridInqXsize(gridID) > 0 && vlistInqVarXYZ(vlistID, varID) != 0)
+              vlistDefVarXYZ(vlistID, varID, 0);
+          }
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+vlistChangeGrid(int vlistID, int gridID1, int gridID2)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (gridID1 != gridID2)
+    {
+      int ngrids = vlistptr->ngrids;
+      for (int index = 0; index < ngrids; index++)
+        {
+          if (vlistptr->gridIDs[index] == gridID1)
+            {
+              vlistptr->gridIDs[index] = gridID2;
+              break;
+            }
+        }
+      int nvars = vlistptr->nvars;
+      for (int varID = 0; varID < nvars; varID++)
+        if (vlistptr->vars[varID].gridID == gridID1) vlistptr->vars[varID].gridID = gridID2;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistZaxis(int vlistID, int index)
+{
+  int zaxisID = CDI_UNDEFID;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (index < vlistptr->nzaxis && index >= 0) zaxisID = vlistptr->zaxisIDs[index];
+
+  return zaxisID;
+}
+
+int
+vlistZaxisIndex(int vlistID, int zaxisID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int index;
+  for (index = 0; index < vlistptr->nzaxis; index++)
+    if (zaxisID == vlistptr->zaxisIDs[index]) break;
+
+  if (index == vlistptr->nzaxis) index = -1;
+
+  return index;
+}
+
+void
+vlistChangeZaxisIndex(int vlistID, int index, int zaxisID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int zaxisIDold = vlistptr->zaxisIDs[index];
+  if (zaxisIDold != zaxisID)
+    {
+      vlistptr->zaxisIDs[index] = zaxisID;
+
+      int nlevs = zaxisInqSize(zaxisID), nlevsOld = zaxisInqSize(zaxisIDold);
+      int nvars = vlistptr->nvars;
+      for (int varID = 0; varID < nvars; varID++)
+        if (vlistptr->vars[varID].zaxisID == zaxisIDold)
+          {
+            vlistptr->vars[varID].zaxisID = zaxisID;
+            if (vlistptr->vars[varID].levinfo && nlevs != nlevsOld)
+              {
+                vlistptr->vars[varID].levinfo
+                    = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t));
+
+                for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID);
+              }
+          }
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2)
+{
+  int nlevs1 = zaxisInqSize(zaxisID1), nlevs2 = zaxisInqSize(zaxisID2);
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int nzaxis = vlistptr->nzaxis;
+  for (int index = 0; index < nzaxis; index++)
+    {
+      if (vlistptr->zaxisIDs[index] == zaxisID1)
+        {
+          vlistptr->zaxisIDs[index] = zaxisID2;
+          break;
+        }
+    }
+
+  int nvars = vlistptr->nvars;
+  for (int varID = 0; varID < nvars; varID++)
+    if (vlistptr->vars[varID].zaxisID == zaxisID1)
+      {
+        vlistptr->vars[varID].zaxisID = zaxisID2;
+
+        if (vlistptr->vars[varID].levinfo && nlevs2 != nlevs1)
+          {
+            vlistptr->vars[varID].levinfo
+                = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs2 * sizeof(levinfo_t));
+
+            for (int levID = 0; levID < nlevs2; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID);
+          }
+      }
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+int
+vlistSubtype(int vlistID, int index)
+{
+  int subtypeID = CDI_UNDEFID;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (index < vlistptr->nsubtypes && index >= 0) subtypeID = vlistptr->subtypeIDs[index];
+
+  return subtypeID;
+}
+
+int
+vlistSubtypeIndex(int vlistID, int subtypeID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  int index;
+  for (index = vlistptr->nsubtypes; index--;)
+    if (subtypeID == vlistptr->subtypeIDs[index]) break;
+
+  return index;
+}
+
+int
+vlistHasTime(int vlistID)
+{
+  bool hastime = false;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  if (!(CDI_Reduce_Dim && vlistptr->ntsteps == 1))
+    {
+      size_t nvars = vlistptr->nvars > 0 ? (size_t) vlistptr->nvars : (size_t) 0;
+      var_t *restrict vars = vlistptr->vars;
+      for (size_t varID = 0; varID < nvars; varID++)
+        if (vars[varID].timetype != TIME_CONSTANT)
+          {
+            hastime = true;
+            break;
+          }
+    }
+
+  return (int) hastime;
+}
+
+enum
+{
+  VLIST_PACK_INT_SELF,
+  VLIST_PACK_INT_NVARS,
+  VLIST_PACK_INT_TAXISID,
+  VLIST_PACK_INT_TABLEID,
+  VLIST_PACK_INT_INSTID,
+  VLIST_PACK_INT_MODELID,
+  vlistNints,
+};
+
+static int
+vlistTxCode(void *vlistptr)
+{
+  (void) vlistptr;
+  return VLIST;
+}
+
+static int
+vlistGetSizeP(void *vlistptr, void *context)
+{
+  vlist_t *p = (vlist_t *) vlistptr;
+  int txsize = serializeGetSize(vlistNints, CDI_DATATYPE_INT, context);
+  txsize += serializeGetSize(1, CDI_DATATYPE_LONG, context);
+  txsize += cdiAttsGetSize(p, CDI_GLOBAL, context);
+  for (int varID = 0; varID < p->nvars; varID++) txsize += vlistVarGetPackSize(p, varID, context);
+  return txsize;
+}
+
+static void
+vlistPackP(void *vlistptr, void *buf, int size, int *position, void *context)
+{
+  int tempbuf[vlistNints];
+  vlist_t *p = (vlist_t *) vlistptr;
+  tempbuf[VLIST_PACK_INT_SELF] = p->self;
+  tempbuf[VLIST_PACK_INT_NVARS] = p->nvars;
+  tempbuf[VLIST_PACK_INT_TAXISID] = p->taxisID;
+  tempbuf[VLIST_PACK_INT_TABLEID] = p->tableID;
+  tempbuf[VLIST_PACK_INT_INSTID] = p->instID;
+  tempbuf[VLIST_PACK_INT_MODELID] = p->modelID;
+  serializePack(tempbuf, vlistNints, CDI_DATATYPE_INT, buf, size, position, context);
+  serializePack(&p->ntsteps, 1, CDI_DATATYPE_LONG, buf, size, position, context);
+
+  cdiAttsPack(p, CDI_GLOBAL, buf, size, position, context);
+  for (int varID = 0; varID < p->nvars; varID++)
+    {
+      vlistVarPack(p, varID, (char *) buf, size, position, context);
+    }
+}
+
+int
+vlistUnpack(char *buf, int size, int *position, int originNamespace, void *context, int force_id)
+{
+#define adaptKey(key) (namespaceAdaptKey((key), originNamespace))
+  int tempbuf[vlistNints];
+  serializeUnpack(buf, size, position, tempbuf, vlistNints, CDI_DATATYPE_INT, context);
+  int nvars = tempbuf[VLIST_PACK_INT_NVARS];
+  int targetID = force_id ? adaptKey(tempbuf[VLIST_PACK_INT_SELF]) : CDI_UNDEFID;
+  vlist_t *p = vlist_new_entry(targetID);
+  xassert(!force_id || p->self == targetID);
+  if (!force_id) targetID = p->self;
+  cdiVlistMakeInternal(p->self);
+  p->taxisID = adaptKey(tempbuf[VLIST_PACK_INT_TAXISID]);
+  p->tableID = tempbuf[VLIST_PACK_INT_TABLEID];
+  p->instID = adaptKey(tempbuf[VLIST_PACK_INT_INSTID]);
+  p->modelID = adaptKey(tempbuf[VLIST_PACK_INT_MODELID]);
+  serializeUnpack(buf, size, position, &p->ntsteps, 1, CDI_DATATYPE_LONG, context);
+  cdiAttsUnpack(targetID, CDI_GLOBAL, buf, size, position, context);
+  for (int varID = 0; varID < nvars; varID++) vlistVarUnpack(targetID, buf, size, position, originNamespace, context);
+  reshSetStatus(targetID, &vlistOps, reshGetStatus(targetID, &vlistOps) & ~RESH_SYNC_BIT);
+#undef adaptKey
+  return targetID;
+}
+
+void
+vlist_check_contents(int vlistID)
+{
+  int nzaxis = vlistNumZaxis(vlistID);
+  for (int index = 0; index < nzaxis; index++)
+    {
+      int zaxisID = vlistZaxis(vlistID, index);
+      if (zaxisInqType(zaxisID) == ZAXIS_GENERIC) cdiCheckZaxis(zaxisID);
+    }
+}
+
+/* Resizes and initializes opt_grib_kvpair data structure. */
+void
+resize_opt_grib_entries(var_t *var, int nentries)
+{
+  if (var->opt_grib_kvpair_size >= nentries) return;  // nothing to do; array is still large enough
+
+  if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries);
+
+  int new_size = (2 * var->opt_grib_kvpair_size) > nentries ? (2 * var->opt_grib_kvpair_size) : nentries;
+  opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t));
+  for (int i = 0; i < var->opt_grib_kvpair_size; ++i)
+    {
+      tmp[i] = var->opt_grib_kvpair[i];
+    }
+  for (int i = var->opt_grib_kvpair_size; i < new_size; ++i)
+    {
+      tmp[i].int_val = 0;
+      tmp[i].dbl_val = 0;
+      tmp[i].update = false;
+      tmp[i].keyword = NULL;
+    }  // for
+  var->opt_grib_kvpair_size = new_size;
+  Free(var->opt_grib_kvpair);
+  var->opt_grib_kvpair = tmp;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+static cdi_keys_t *
+vlist_get_keysp(vlist_t *vlistptr, int varID)
+{
+  if (varID == CDI_GLOBAL) return &vlistptr->keys;
+  if (varID >= 0 && varID < vlistptr->nvars) return &(vlistptr->vars[varID].keys);
+
+  return NULL;
+}
+
+static cdi_keys_t *
+grid_get_keysp(grid_t *gridptr, int varID)
+{
+  if (varID == CDI_GLOBAL) return &gridptr->keys;
+  if (varID == CDI_XAXIS) return &gridptr->x.keys;
+  if (varID == CDI_YAXIS) return &gridptr->y.keys;
+
+  return NULL;
+}
+
+static cdi_keys_t *
+zaxis_get_keysp(zaxis_t *zaxisptr, int varID)
+{
+  return (varID == CDI_GLOBAL) ? &zaxisptr->keys : NULL;
+}
+
+static cdi_key_t *
+new_key(cdi_keys_t *keysp, int key)
+{
+  xassert(keysp != NULL);
+
+  if (keysp->nelems == keysp->nalloc) return NULL;
+
+  cdi_key_t *keyp = &(keysp->value[keysp->nelems]);
+  keysp->nelems++;
+
+  keyp->key = key;
+  keyp->type = 0;
+  keyp->length = 0;
+  keyp->v.s = NULL;
+
+  return keyp;
+}
+
+cdi_key_t *
+find_key(cdi_keys_t *keysp, int key)
+{
+  xassert(keysp != NULL);
+
+  if (keysp->nelems == 0) return NULL;
+
+  for (size_t keyid = 0; keyid < keysp->nelems; keyid++)
+    {
+      cdi_key_t *keyp = &(keysp->value[keyid]);
+      if (keyp->key == key) return keyp;  // Normal return
+    }
+
+  return NULL;
+}
+
+static const cdi_key_t *
+find_key_const(const cdi_keys_t *keysp, int key)
+{
+  xassert(keysp != NULL);
+
+  if (keysp->nelems == 0) return NULL;
+
+  for (size_t keyid = 0; keyid < keysp->nelems; keyid++)
+    {
+      const cdi_key_t *keyp = &(keysp->value[keyid]);
+      if (keyp->key == key) return keyp;  // Normal return
+    }
+
+  return NULL;
+}
+
+static cdi_keys_t *
+cdi_get_keysp(int objID, int varID)
+{
+  if (reshGetTxCode(objID) == GRID) return grid_get_keysp(grid_to_pointer(objID), varID);
+  if (reshGetTxCode(objID) == DIST_GRID) return grid_get_keysp(grid_to_pointer(objID), varID);
+  if (reshGetTxCode(objID) == ZAXIS) return zaxis_get_keysp(zaxis_to_pointer(objID), varID);
+  if (reshGetTxCode(objID) == VLIST) return vlist_get_keysp(vlist_to_pointer(objID), varID);
+
+  return NULL;
+}
+
+int
+cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum)
+{
+  xassert(keynum >= 0 && keynum < (int) keyspa->nelems && keynum < (int) keyspb->nelems);
+  cdi_key_t *keypa = keyspa->value + keynum, *keypb = keyspb->value + keynum;
+
+  if (keypa->key != keypb->key) return 1;
+  if (keypa->type != keypb->type) return 1;
+  if (keypa->length != keypb->length) return 1;
+
+  if (keypa->type == KEY_BYTES) return (memcmp(keypa->v.s, keypb->v.s, (size_t) keypa->length) != 0);
+  if (keypa->type == KEY_FLOAT) return (IS_NOT_EQUAL(keypa->v.d, keypb->v.d));
+  if (keypa->type == KEY_INT) return (keypa->v.i != keypb->v.i);
+
+  return 0;
+}
+
+static void
+cdi_delete_key(cdi_key_t *keyp)
+{
+  if (keyp != NULL && keyp->length)  // key in use
+    {
+      keyp->length = 0;
+      if (keyp->type == KEY_BYTES)
+        {
+          if (keyp->v.s) Free(keyp->v.s);
+          keyp->v.s = NULL;
+        }
+      else if (keyp->type == KEY_FLOAT)
+        {
+          keyp->v.d = 0.0;
+        }
+      else if (keyp->type == KEY_INT)
+        {
+          keyp->v.i = 0;
+        }
+    }
+}
+
+void
+cdiDeleteVarKeys(cdi_keys_t *keysp)
+{
+  int nelems = keysp ? (int) keysp->nelems : 0;
+  for (int keyid = 0; keyid < nelems; keyid++)
+    {
+      cdi_delete_key(&(keysp->value[keyid]));
+    }
+
+  keysp->nelems = 0;
+}
+
+void
+cdiDeleteKeys(int cdiID, int varID)
+{
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdiDeleteVarKeys(keysp);
+}
+
+void
+cdiPrintVarKeys(cdi_keys_t *keysp)
+{
+  int nelems = keysp ? (int) keysp->nelems : 0;
+  for (int keyid = 0; keyid < nelems; keyid++)
+    {
+      cdi_key_t *keyp = &(keysp->value[keyid]);
+      if (keyp->length == 0) continue;
+      if (keyp->type == KEY_BYTES)
+        {
+          fprintf(stdout, "%d key %d length %d value %s\n", keyid + 1, keyp->key, keyp->length, keyp->v.s);
+        }
+      else if (keyp->type == KEY_FLOAT)
+        {
+          fprintf(stdout, "%d key %d value %g\n", keyid + 1, keyp->key, keyp->v.d);
+        }
+      else if (keyp->type == KEY_INT)
+        {
+          fprintf(stdout, "%d key %d value %d\n", keyid + 1, keyp->key, keyp->v.i);
+        }
+    }
+}
+
+void
+cdiPrintKeys(int cdiID, int varID)
+{
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdiPrintVarKeys(keysp);
+}
+
+//  cdiInqKeyLen: Get the length of the string representation of the key
+int
+cdiInqKeyLen(int cdiID, int varID, int key, int *length)
+{
+  int status = -1;
+
+  const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  if (keyp != NULL && keyp->length > 0)
+    {
+      *length = keyp->length;
+      status = CDI_NOERR;
+    }
+
+  return status;
+}
+
+static void
+cdi_define_key(const cdi_key_t *keyp, cdi_keys_t *keysp)
+{
+  // clang-format off
+  if      (keyp->type == KEY_INT)   cdiDefVarKeyInt(keysp, keyp->key, keyp->v.i);
+  else if (keyp->type == KEY_FLOAT) cdiDefVarKeyFloat(keysp, keyp->key, keyp->v.d);
+  else if (keyp->type == KEY_BYTES) cdiDefVarKeyBytes(keysp, keyp->key, keyp->v.s, keyp->length);
+  // clang-format on
+}
+
+int
+cdiDeleteKey(int cdiID, int varID, int key)
+{
+  int status = CDI_NOERR;
+
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdi_delete_key(find_key(keysp, key));
+
+  return status;
+}
+
+void
+cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2)
+{
+  for (size_t keyid = 0; keyid < keysp1->nelems; keyid++)
+    {
+      const cdi_key_t *keyp = &(keysp1->value[keyid]);
+      if (keyp->length > 0) cdi_define_key(keyp, keysp2);
+    }
+}
+
+int
+cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2)
+{
+  int status = CDI_NOERR;
+
+  cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1);
+  xassert(keysp1 != NULL);
+
+  cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID2);
+  xassert(keysp2 != NULL);
+
+  cdiCopyVarKeys(keysp1, keysp2);
+
+  return status;
+}
+
+int
+cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2)
+{
+  int status = CDI_NOERR;
+
+  const cdi_key_t *keyp = find_key_const(keysp1, key);
+  if (keyp == NULL) return -1;
+
+  if (keyp->length > 0) cdi_define_key(keyp, keysp2);
+
+  return status;
+}
+
+int
+cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2)
+{
+  cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1);
+  xassert(keysp1 != NULL);
+
+  cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID1);
+  xassert(keysp2 != NULL);
+
+  return cdiCopyVarKey(keysp1, key, keysp2);
+}
+
+void
+cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value)
+{
+  cdi_key_t *keyp = find_key(keysp, key);
+  if (keyp == NULL) keyp = new_key(keysp, key);
+
+  if (keyp != NULL)
+    {
+      // if ( keyp->v.i != value )
+      {
+        keyp->type = KEY_INT;
+        keyp->v.i = value;
+        keyp->length = 1;
+      }
+    }
+}
+
+/*
+@Function  cdiDefKeyInt
+@Title     Define an integer value from a key
+
+@Prototype int cdiDefKeyInt(int cdiID, int varID, int key, int value)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  value    An integer where the data will be read.
+
+@Description
+The function @func{cdiDefKeyInt} defines an integer value from a key.
+
+@Result
+@func{cdiDefKeyInt} returns CDI_NOERR if OK.
+
+@EndFunction
+*/
+int
+cdiDefKeyInt(int cdiID, int varID, int key, int value)
+{
+  int status = CDI_NOERR;
+
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdiDefVarKeyInt(keysp, key, value);
+
+  return status;
+}
+
+/*
+@Function  cdiInqKeyInt
+@Title     Get an integer value from a key
+
+@Prototype int cdiInqKeyInt(int cdiID, int varID, int key, int *value)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched..
+    @Item  value    The address of an integer where the data will be retrieved.
+
+@Description
+The function @func{cdiInqKeyInt} gets an integer value from a key.
+
+@Result
+@func{cdiInqKeyInt} returns CDI_NOERR if key is available.
+
+@EndFunction
+*/
+int
+cdiInqKeyInt(int cdiID, int varID, int key, int *value)
+{
+  int status = -1;
+
+  // if (varID != CDI_GLOBAL) status = cdiInqKeyInt(cdiID, CDI_GLOBAL, key, value);
+
+  const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  if (keyp != NULL && keyp->length == 1)  // key in use
+    {
+      if (keyp->type == KEY_INT)
+        {
+          *value = keyp->v.i;
+          status = CDI_NOERR;
+        }
+    }
+
+  return status;
+}
+
+int
+cdiInqVarKeyInt(const cdi_keys_t *keysp, int key)
+{
+  int value = 0;
+
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  if (keyp && keyp->type == KEY_INT) value = keyp->v.i;
+
+  return value;
+}
+
+void
+cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value)
+{
+  cdi_key_t *keyp = find_key(keysp, key);
+  if (keyp == NULL) keyp = new_key(keysp, key);
+
+  if (keyp != NULL)
+    {
+      keyp->type = KEY_FLOAT;
+      keyp->v.d = value;
+      keyp->length = 1;
+    }
+}
+
+/*
+@Function  cdiDefKeyFloat
+@Title     Define a floating point value from a key
+
+@Prototype int cdiDefKeyFloat(int cdiID, int varID, int key, double value)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched
+    @Item  value    A double where the data will be read
+
+@Description
+The function @func{cdiDefKeyFloat} defines a CDI floating point value from a key.
+
+@Result
+@func{cdiDefKeyFloat} returns CDI_NOERR if OK.
+
+@EndFunction
+*/
+int
+cdiDefKeyFloat(int cdiID, int varID, int key, double value)
+{
+  int status = CDI_NOERR;
+
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdiDefVarKeyFloat(keysp, key, value);
+
+  return status;
+}
+
+/*
+@Function  cdiInqKeyFloat
+@Title     Get a floating point value from a key
+
+@Prototype int cdiInqKeyFloat(int cdiID, int varID, int key, double *value)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  value    The address of a double where the data will be retrieved.
+
+@Description
+The function @func{cdiInqKeyFloat} gets a floating point value from a key.
+
+@Result
+@func{cdiInqKeyFloat} returns CDI_NOERR if key is available.
+
+@EndFunction
+*/
+int
+cdiInqKeyFloat(int cdiID, int varID, int key, double *value)
+{
+  int status = -1;
+
+  // if (varID != CDI_GLOBAL) status = cdiInqKeyFloat(cdiID, CDI_GLOBAL, key, value);
+
+  const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  if (keyp != NULL && keyp->length == 1)  // key in use
+    {
+      if (keyp->type == KEY_FLOAT)
+        {
+          *value = keyp->v.d;
+          status = CDI_NOERR;
+        }
+    }
+
+  return status;
+}
+
+void
+cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length)
+{
+  cdi_key_t *keyp = find_key(keysp, key);
+  if (keyp == NULL) keyp = new_key(keysp, key);
+
+  size_t length_ = length >= 0 ? (size_t) length : (size_t) 0;
+  if (keyp != NULL)
+    {
+      if (keyp->length != 0 && keyp->length != length)
+        {
+          if (keyp->v.s) Free(keyp->v.s);
+          keyp->length = 0;
+        }
+      if (keyp->length == 0)
+        {
+          keyp->v.s = (unsigned char *) Malloc(length_);
+          keyp->length = length;
+        }
+
+      memcpy(keyp->v.s, bytes, length_);
+      keyp->type = KEY_BYTES;
+    }
+}
+
+/*
+@Function  cdiDefKeyBytes
+@Title     Define a byte array from a key
+
+@Prototype int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  bytes    The address of a byte array where the data will be read.
+    @Item  length   Length of the byte array
+
+@Description
+The function @func{cdiDefKeyBytes} defines a byte array from a key.
+
+@Result
+@func{cdiDefKeyBytes} returns CDI_NOERR if OK.
+
+@EndFunction
+*/
+int
+cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length)
+{
+  int status = CDI_NOERR;
+
+  cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  cdiDefVarKeyBytes(keysp, key, bytes, length);
+
+  return status;
+}
+
+int
+cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length)
+{
+  int status = -1;
+
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  int val_len;
+  if (keyp != NULL && (val_len = keyp->length) > 0)  // key in use
+    {
+      if (keyp->type == KEY_BYTES)
+        {
+          if (val_len < *length)
+            *length = val_len;
+          else
+            val_len = *length;
+          memcpy(bytes, keyp->v.s, (size_t) val_len);
+          status = CDI_NOERR;
+        }
+    }
+
+  return status;
+}
+
+//  cdiInqKeyBytes: Get a byte array from a key
+/*
+@Function  cdiInqKeyBytes
+@Title     Get a byte array from a key
+
+@Prototype int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  bytes    The address of a byte array where the data will be retrieved.
+                    The caller must allocate space for the returned byte array.
+    @Item  length   The allocated length of the byte array on input.
+@Description
+The function @func{cdiInqKeyBytes} gets a byte array from a key.
+
+@Result
+@func{cdiInqKeyBytes} returns CDI_NOERR if key is available.
+
+@EndFunction
+*/
+int
+cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length)
+{
+  xassert(bytes != NULL);
+  xassert(length != NULL);
+
+  // if (varID != CDI_GLOBAL) status = cdiInqKeyBytes(cdiID, CDI_GLOBAL, key, bytes, length);
+
+  const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID);
+  xassert(keysp != NULL);
+
+  return cdiInqVarKeyBytes(keysp, key, bytes, length);
+}
+
+/*
+@Function  cdiDefKeyString
+@Title     Define a string from a key
+
+@Prototype int cdiDefKeyString(int cdiID, int varID, int key, const char *string)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  string   The address of a string where the data will be read.
+
+@Description
+The function @func{cdiDefKeyString} defines a text string from a key.
+
+@Result
+@func{cdiDefKeyString} returns CDI_NOERR if OK.
+
+@Example
+Here is an example using @func{cdiDefKeyString} to define the name of a variable:
+
+@Source
+   ...
+int vlistID, varID, status;
+   ...
+vlistID = vlistCreate();
+varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING);
+   ...
+status = cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "temperature");
+   ...
+@EndSource
+@EndFunction
+*/
+int
+cdiDefKeyString(int cdiID, int varID, int key, const char *string)
+{
+  xassert(string != NULL);
+
+  size_t length = strlen(string) + 1;
+  int status = cdiDefKeyBytes(cdiID, varID, key, (const unsigned char *) string, (int) length);
+
+  return status;
+}
+
+/*
+@Function  cdiInqKeyString
+@Title     Get a string from a key
+
+@Prototype int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length)
+@Parameter
+    @Item  cdiID    CDI object ID (vlistID, gridID, zaxisID).
+    @Item  varID    Variable identifier or CDI_GLOBAL.
+    @Item  key      The key to be searched.
+    @Item  string   The address of a string where the data will be retrieved.
+                    The caller must allocate space for the returned string.
+    @Item  length   The allocated length of the string on input.
+@Description
+The function @func{cdiInqKeyString} gets a text string from a key.
+
+@Result
+@func{cdiInqKeyString} returns CDI_NOERR if key is available.
+
+@Example
+Here is an example using @func{cdiInqKeyString} to get the name of the first variable:
+
+@Source
+   ...
+#define STRLEN 256
+   ...
+int streamID, vlistID, varID, status;
+int length = STRLEN;
+char name[STRLEN];
+   ...
+streamID = streamOpenRead(...);
+vlistID = streamInqVlist(streamID);
+   ...
+varID = 0;
+status = cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length)
+{
+  xassert(string != NULL);
+  xassert(length != NULL);
+
+  int maxlength = *length;
+  if (maxlength > 0) string[0] = '\0';
+
+  int status = cdiInqKeyBytes(cdiID, varID, key, (unsigned char *) string, length);
+  if (CDI_NOERR == status)
+    string[maxlength - 1] = '\0';
+  else
+    *length = 0;
+
+  return status;
+}
+
+const char *
+cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key)
+{
+  const cdi_key_t *keyp = find_key_const(keysp, key);
+  if (keyp != NULL)  // key in use
+    {
+      if (keyp->type == KEY_BYTES) return (const char *) keyp->v.s;
+    }
+
+  return NULL;
+}
+
+void
+cdiInitKeys(cdi_keys_t *keysp)
+{
+  keysp->nalloc = MAX_KEYS;
+  keysp->nelems = 0;
+  for (int i = 0; i < MAX_KEYS; ++i) keysp->value[i].length = 0;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+
+
+
+static cdi_atts_t *
+get_attsp(vlist_t *vlistptr, int varID)
+{
+  if (varID == CDI_GLOBAL)
+    return &vlistptr->atts;
+  else if (varID >= 0 && varID < vlistptr->nvars)
+    return &(vlistptr->vars[varID].atts);
+
+  return NULL;
+}
+
+static cdi_att_t *
+find_att(cdi_atts_t *attsp, const char *name)
+{
+  xassert(attsp != NULL);
+
+  if (attsp->nelems == 0) return NULL;
+
+  size_t slen = strlen(name);
+  if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME;
+
+  cdi_att_t *atts = attsp->value;
+  for (size_t attid = 0; attid < attsp->nelems; attid++)
+    {
+      cdi_att_t *attp = atts + attid;
+      if (attp->namesz == slen && memcmp(attp->name, name, slen) == 0) return attp;  // Normal return
+    }
+
+  return NULL;
+}
+
+static cdi_att_t *
+new_att(cdi_atts_t *attsp, const char *name)
+{
+  xassert(attsp != NULL);
+  xassert(name != NULL);
+
+  if (attsp->nelems == attsp->nalloc) return NULL;
+
+  cdi_att_t *attp = &(attsp->value[attsp->nelems]);
+  attsp->nelems++;
+
+  size_t slen = strlen(name);
+  if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME;
+
+  attp->name = (char *) Malloc(slen + 1);
+  memcpy(attp->name, name, slen + 1);
+  attp->namesz = slen;
+  attp->xvalue = NULL;
+
+  return attp;
+}
+
+static void
+fill_att(cdi_att_t *attp, int indtype, int exdtype, size_t nelems, size_t xsz, const void *xvalue)
+{
+  xassert(attp != NULL);
+
+  attp->xsz = xsz;
+  attp->indtype = indtype;
+  attp->exdtype = exdtype;
+  attp->nelems = nelems;
+
+  if (xsz > 0)
+    {
+      attp->xvalue = Realloc(attp->xvalue, xsz);
+      memcpy(attp->xvalue, xvalue, xsz);
+    }
+}
+
+static cdi_atts_t *
+cdi_get_attsp(int objID, int varID)
+{
+  cdi_atts_t *attsp = NULL;
+
+  if (varID == CDI_GLOBAL && reshGetTxCode(objID) == GRID)
+    {
+      grid_t *gridptr = grid_to_pointer(objID);
+      attsp = &gridptr->atts;
+    }
+  else if (varID == CDI_GLOBAL && reshGetTxCode(objID) == ZAXIS)
+    {
+      zaxis_t *zaxisptr = zaxis_to_pointer(objID);
+      attsp = &zaxisptr->atts;
+    }
+  else
+    {
+      vlist_t *vlistptr = vlist_to_pointer(objID);
+      attsp = get_attsp(vlistptr, varID);
+    }
+
+  return attsp;
+}
+
+/*
+@Function  cdiInqNatts
+@Title     Get number of attributes
+
+@Prototype int cdiInqNatts(int cdiID, int varID, int *nattsp)
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  nattsp   Pointer to location for returned number of attributes.
+
+@Description
+The function @func{cdiInqNatts} gets the number of attributes assigned to this variable.
+
+@EndFunction
+*/
+int
+cdiInqNatts(int cdiID, int varID, int *nattsp)
+{
+  int status = CDI_NOERR;
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  *nattsp = (int) attsp->nelems;
+
+  return status;
+}
+
+/*
+@Function  cdiInqAtt
+@Title     Get information about an attribute
+
+@Prototype int cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp)
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  attnum   Attribute number (from 0 to natts-1).
+    @Item  name     Pointer to the location for the returned attribute name. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+    @Item  typep    Pointer to location for returned attribute type.
+    @Item  lenp     Pointer to location for returned attribute number.
+
+@Description
+The function @func{cdiInqAtt} gets information about an attribute.
+
+@EndFunction
+*/
+int
+cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp)
+{
+  int status = CDI_NOERR;
+
+  xassert(name != NULL);
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  cdi_att_t *attp = NULL;
+  if (attnum >= 0 && attnum < (int) attsp->nelems) attp = &(attsp->value[attnum]);
+
+  if (attp != NULL && attp->name)  // name in use
+    {
+      memcpy(name, attp->name, attp->namesz + 1);
+      *typep = attp->exdtype;
+      *lenp = (int) attp->nelems;
+    }
+  else
+    {
+      name[0] = 0;
+      *typep = -1;
+      *lenp = 0;
+      status = -1;
+    }
+
+  return status;
+}
+
+int
+cdiInqAttLen(int cdiID, int varID, const char *name)
+{
+  int length = -1;
+
+  xassert(name != NULL);
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  for (int attid = 0; attid < (int) attsp->nelems; attid++)
+    {
+      cdi_att_t *attp = &(attsp->value[attid]);
+      if (attp->name && str_is_equal(attp->name, name)) length = (int) attp->nelems;
+    }
+
+  return length;
+}
+
+int
+cdiInqAttType(int cdiID, int varID, const char *name)
+{
+  int type = -1;
+
+  xassert(name != NULL);
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  for (int attid = 0; attid < (int) attsp->nelems; attid++)
+    {
+      cdi_att_t *attp = &(attsp->value[attid]);
+      if (attp->name && str_is_equal(attp->name, name)) type = attp->exdtype;
+    }
+
+  return type;
+}
+
+static void
+cdi_attribute_free(cdi_att_t *attp)
+{
+  if (attp->name)
+    {
+      Free(attp->name);
+      attp->name = NULL;
+      attp->namesz = 0;
+    }
+  if (attp->xvalue)
+    {
+      Free(attp->xvalue);
+      attp->xvalue = NULL;
+    }
+}
+
+int
+cdiDeleteAtts(int cdiID, int varID)
+{
+  int status = CDI_NOERR;
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  for (int attid = 0; attid < (int) attsp->nelems; attid++)
+    {
+      cdi_att_t *attp = &(attsp->value[attid]);
+      cdi_attribute_free(attp);
+    }
+
+  attsp->nelems = 0;
+
+  return status;
+}
+
+int
+cdiDelAtt(int cdiID, int varID, const char *name)
+{
+  int status = -1;
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  for (int attid = 0; attid < (int) attsp->nelems; attid++)
+    {
+      cdi_att_t *attp = &(attsp->value[attid]);
+      if (attp->name && str_is_equal(attp->name, name))
+        {
+          cdi_attribute_free(attp);
+          status = CDI_NOERR;
+          break;
+        }
+    }
+
+  return status;
+}
+
+static int
+cdi_def_att(int indtype, int exdtype, int cdiID, int varID, const char *name, size_t len, size_t xsz, const void *xp)
+{
+  int status = CDI_NOERR;
+
+  if (len != 0 && xp == NULL) return CDI_EINVAL;  // Null arg
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  cdi_att_t *attp = find_att(attsp, name);
+  if (attp == NULL) attp = new_att(attsp, name);
+
+  if (attp != NULL) fill_att(attp, indtype, exdtype, len, xsz, xp);
+
+  return status;
+}
+
+static int
+cdi_inq_att(int indtype, int cdiID, int varID, const char *name, size_t mxsz, void *xp)
+{
+  int status = CDI_NOERR;
+
+  if (mxsz != 0 && xp == NULL) return CDI_EINVAL;  // Null arg
+
+  cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID);
+  xassert(attsp != NULL);
+
+  cdi_att_t *attp = find_att(attsp, name);
+  if (attp != NULL)  // name in use
+    {
+      if (attp->indtype == indtype)
+        {
+          size_t xsz = attp->xsz;
+          if (mxsz < xsz) xsz = mxsz;
+          if (xsz > 0) memcpy(xp, attp->xvalue, xsz);
+        }
+      else
+        {
+          Warning("Attribute %s has wrong data type!", name);
+          status = -2;
+        }
+    }
+  else
+    {
+      // Warning("Internal problem, attribute %s not found!", name);
+      status = -1;
+    }
+
+  return status;
+}
+
+int
+cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2)
+{
+  int status = CDI_NOERR;
+
+  cdi_atts_t *attsp1 = cdi_get_attsp(cdiID1, varID1);
+  xassert(attsp1 != NULL);
+
+  for (size_t attid = 0; attid < attsp1->nelems; attid++)
+    {
+      cdi_att_t *attp = &(attsp1->value[attid]);
+      cdi_def_att(attp->indtype, attp->exdtype, cdiID2, varID2, attp->name, attp->nelems, attp->xsz, attp->xvalue);
+    }
+
+  return status;
+}
+
+/*
+@Function  cdiDefAttInt
+@Title     Define an integer attribute
+
+@Prototype int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip)
+
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  type     External data type (@func{CDI_DATATYPE_INT16} or @func{CDI_DATATYPE_INT32}).
+    @Item  len      Number of values provided for the attribute.
+    @Item  ip       Pointer to one or more integer values.
+
+@Description
+The function @func{cdiDefAttInt} defines an integer attribute.
+
+@EndFunction
+*/
+int
+cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip)
+{
+  return cdi_def_att(CDI_DATATYPE_INT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(int), ip);
+}
+
+/*
+@Function  cdiDefAttFlt
+@Title     Define a floating point attribute
+
+@Prototype int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp)
+
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  type     External data type (@func{CDI_DATATYPE_FLT32} or @func{CDI_DATATYPE_FLT64}).
+    @Item  len      Number of values provided for the attribute.
+    @Item  dp       Pointer to one or more floating point values.
+
+@Description
+The function @func{cdiDefAttFlt} defines a floating point attribute.
+
+@EndFunction
+*/
+int
+cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp)
+{
+  return cdi_def_att(CDI_DATATYPE_FLT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(double), dp);
+}
+
+/*
+@Function  cdiDefAttTxt
+@Title     Define a text attribute
+
+@Prototype int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp)
+
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  len      Number of values provided for the attribute.
+    @Item  tp       Pointer to one or more character values.
+
+@Description
+The function @func{cdiDefAttTxt} defines a text attribute.
+
+@Example
+Here is an example using @func{cdiDefAttTxt} to define the attribute "description":
+
+@Source
+   ...
+int vlistID, varID, status;
+char text[] = "description of the variable";
+   ...
+vlistID = vlistCreate();
+varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING);
+   ...
+status = cdiDefAttTxt(vlistID, varID, "description", LEN(text), text);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp)
+{
+  return cdi_def_att(CDI_DATATYPE_TXT, CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) len, (size_t) len, tp);
+}
+
+/*
+@Function  cdiInqAttInt
+@Title     Get the value(s) of an integer attribute
+
+@Prototype int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip)
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  mlen     Number of allocated values provided for the attribute.
+    @Item  ip       Pointer location for returned integer attribute value(s).
+
+@Description
+The function @func{cdiInqAttInt} gets the values(s) of an integer attribute.
+
+@EndFunction
+*/
+int
+cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip)
+{
+  return cdi_inq_att(CDI_DATATYPE_INT, cdiID, varID, name, (size_t) mlen * sizeof(int), ip);
+}
+
+/*
+@Function  cdiInqAttFlt
+@Title     Get the value(s) of a floating point attribute
+
+@Prototype int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp)
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  mlen     Number of allocated values provided for the attribute.
+    @Item  dp       Pointer location for returned floating point attribute value(s).
+
+@Description
+The function @func{cdiInqAttFlt} gets the values(s) of a floating point attribute.
+
+@EndFunction
+*/
+int
+cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp)
+{
+  return cdi_inq_att(CDI_DATATYPE_FLT, cdiID, varID, name, (size_t) mlen * sizeof(double), dp);
+}
+
+/*
+@Function  cdiInqAttTxt
+@Title     Get the value(s) of a text attribute
+
+@Prototype int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp)
+@Parameter
+    @Item  cdiID    CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}.
+    @Item  varID    Variable identifier, or @func{CDI_GLOBAL} for a global attribute.
+    @Item  name     Attribute name.
+    @Item  mlen     Number of allocated values provided for the attribute.
+    @Item  tp       Pointer location for returned text attribute value(s).
+
+@Description
+The function @func{cdiInqAttTxt} gets the values(s) of a text attribute.
+
+@EndFunction
+*/
+int
+cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp)
+{
+  return cdi_inq_att(CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) mlen * sizeof(char), tp);
+}
+
+enum
+{
+  cdi_att_nints = 4, /* namesz, exdtype, indtype, nelems */
+};
+
+static inline int
+cdiAttTypeLookup(cdi_att_t *attp)
+{
+  int type;
+  switch (attp->indtype)
+    {
+    case CDI_DATATYPE_FLT: type = CDI_DATATYPE_FLT64; break;
+    case CDI_DATATYPE_INT:
+    case CDI_DATATYPE_TXT: type = attp->indtype; break;
+    default: xabort("Unknown datatype encountered in attribute %s: %d\n", attp->name, attp->indtype);
+    }
+  return type;
+}
+
+int
+cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum)
+{
+  xassert(attnum >= 0 && attnum < (int) attspa->nelems && attnum < (int) attspb->nelems);
+  cdi_att_t *attpa = attspa->value + attnum, *attpb = attspb->value + attnum;
+
+  if (attpa->namesz != attpb->namesz) return 1;
+
+  if (attpa->name && attpb->name && memcmp(attpa->name, attpb->name, attpa->namesz)) return 1;
+
+  if (attpa->indtype != attpb->indtype || attpa->exdtype != attpb->exdtype || attpa->nelems != attpb->nelems) return 1;
+
+  return memcmp(attpa->xvalue, attpb->xvalue, attpa->xsz);
+}
+
+static int
+cdiAttGetSize(cdi_atts_t *attsp, int attnum, void *context)
+{
+  xassert(attnum >= 0 && attnum < (int) attsp->nelems);
+  cdi_att_t *attp = &(attsp->value[attnum]);
+  int txsize = serializeGetSize(cdi_att_nints, CDI_DATATYPE_INT, context)
+               + serializeGetSize((int) attp->namesz, CDI_DATATYPE_TXT, context);
+  txsize += serializeGetSize((int) attp->nelems, cdiAttTypeLookup(attp), context);
+  return txsize;
+}
+
+int
+cdiAttsGetSize(void *vp, int varID, void *context)
+{
+  cdi_atts_t *attsp;
+  xassert(attsp = get_attsp((vlist_t *) vp, varID));
+  int txsize = serializeGetSize(1, CDI_DATATYPE_INT, context);
+  size_t numAtts = attsp->nelems;
+  for (size_t i = 0; i < numAtts; ++i) txsize += cdiAttGetSize(attsp, (int) i, context);
+  return txsize;
+}
+
+static void
+cdiAttPack(cdi_atts_t *attsp, int attnum, void *buf, int size, int *position, void *context)
+{
+  int tempbuf[cdi_att_nints];
+
+  xassert(attnum >= 0 && attnum < (int) attsp->nelems);
+  cdi_att_t *attp = &(attsp->value[attnum]);
+  tempbuf[0] = (int) attp->namesz;
+  tempbuf[1] = attp->exdtype;
+  tempbuf[2] = attp->indtype;
+  tempbuf[3] = (int) attp->nelems;
+  serializePack(tempbuf, cdi_att_nints, CDI_DATATYPE_INT, buf, size, position, context);
+  serializePack(attp->name, (int) attp->namesz, CDI_DATATYPE_TXT, buf, size, position, context);
+  serializePack(attp->xvalue, (int) attp->nelems, cdiAttTypeLookup(attp), buf, size, position, context);
+}
+
+void
+cdiAttsPack(void *vp, int varID, void *buf, int size, int *position, void *context)
+{
+  cdi_atts_t *attsp;
+  xassert(attsp = get_attsp((vlist_t *) vp, varID));
+  size_t numAtts = attsp->nelems;
+  int numAttsI = (int) numAtts;
+  xassert(numAtts <= INT_MAX);
+  serializePack(&numAttsI, 1, CDI_DATATYPE_INT, buf, size, position, context);
+  for (size_t i = 0; i < numAtts; ++i) cdiAttPack(attsp, (int) i, buf, size, position, context);
+}
+
+static void
+cdiAttUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context)
+{
+  int tempbuf[cdi_att_nints];
+
+  serializeUnpack(buf, size, position, tempbuf, cdi_att_nints, CDI_DATATYPE_INT, context);
+  char *attName = (char *) Malloc((size_t) tempbuf[0] + 1);
+  serializeUnpack(buf, size, position, attName, tempbuf[0], CDI_DATATYPE_TXT, context);
+  attName[tempbuf[0]] = '\0';
+  int attVDt;
+  size_t elemSize;
+  switch (tempbuf[2])
+    {
+    case CDI_DATATYPE_FLT:
+      attVDt = CDI_DATATYPE_FLT64;
+      elemSize = sizeof(double);
+      break;
+    case CDI_DATATYPE_INT:
+      attVDt = CDI_DATATYPE_INT;
+      elemSize = sizeof(int);
+      break;
+    case CDI_DATATYPE_TXT:
+      attVDt = CDI_DATATYPE_TXT;
+      elemSize = 1;
+      break;
+    default: xabort("Unknown datatype encountered in attribute %s: %d\n", attName, tempbuf[2]);
+    }
+  void *attData = Malloc(elemSize * (size_t) tempbuf[3]);
+  serializeUnpack(buf, size, position, attData, tempbuf[3], attVDt, context);
+  cdi_def_att(tempbuf[2], tempbuf[1], cdiID, varID, attName, (size_t) tempbuf[3], (size_t) tempbuf[3] * elemSize, attData);
+  Free(attName);
+  Free(attData);
+}
+
+void
+cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context)
+{
+  int numAtts;
+  serializeUnpack(buf, size, position, &numAtts, 1, CDI_DATATYPE_INT, context);
+  for (int i = 0; i < numAtts; ++i) cdiAttUnpack(cdiID, varID, buf, size, position, context);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <float.h> /* FLT_MAX */
+
+static void
+vlistvar_init_entry(var_t *vlistvars, int varID)
+{
+  var_t *varptr = &vlistvars[varID];
+  varptr->flag = false;
+  varptr->lvalidrange = false;
+  varptr->xyz = 5;  // xyzStorVals[5] == 321
+  varptr->missvalused = false;
+  varptr->mvarID = varID;
+  varptr->fvarID = varID;
+  varptr->param = 0;
+  varptr->gridID = CDI_UNDEFID;
+  varptr->zaxisID = CDI_UNDEFID;
+  varptr->timetype = CDI_UNDEFID;
+  varptr->tsteptype = TSTEP_INSTANT;
+  varptr->datatype = CDI_UNDEFID;
+  varptr->instID = CDI_UNDEFID;
+  varptr->modelID = CDI_UNDEFID;
+  varptr->tableID = CDI_UNDEFID;
+  varptr->timave = 0;
+  varptr->nsb = 0;
+  varptr->missval = CDI_Default_Missval;
+  varptr->validrange[0] = VALIDMISS;
+  varptr->validrange[1] = VALIDMISS;
+  varptr->levinfo = NULL;
+  varptr->comptype = CDI_COMPRESS_NONE;
+  varptr->complevel = 1;
+  varptr->keys.nalloc = MAX_KEYS;
+  varptr->keys.nelems = 0;
+  for (int i = 0; i < MAX_KEYS; ++i) varptr->keys.value[i].length = 0;
+  varptr->atts.nalloc = MAX_ATTRIBUTES;
+  varptr->atts.nelems = 0;
+  varptr->subtypeID = CDI_UNDEFID;
+  varptr->opt_grib_nentries = 0;
+  varptr->opt_grib_kvpair_size = 0;
+  varptr->opt_grib_kvpair = NULL;
+}
+
+static int
+vlistvarNewEntry(int vlistID)
+{
+  int varID = 0;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  int vlistvarSize = vlistptr->varsAllocated;
+  var_t *vlistvars = vlistptr->vars;
+  // Look for a free slot in vlistvar. (Create the table the first time through).
+  if (!vlistvarSize)
+    {
+      vlistvarSize = 2;
+      vlistvars = (var_t *) Malloc((size_t) vlistvarSize * sizeof(var_t));
+      for (int i = 0; i < vlistvarSize; ++i) vlistvars[i].isUsed = false;
+    }
+  else
+    {
+      while (varID < vlistvarSize && vlistvars[varID].isUsed) ++varID;
+    }
+  // If the table overflows, double its size.
+  if (varID == vlistvarSize)
+    {
+      vlistvars = (var_t *) Realloc(vlistvars, (size_t) (vlistvarSize *= 2) * sizeof(var_t));
+      for (int i = varID; i < vlistvarSize; ++i) vlistvars[i].isUsed = false;
+    }
+
+  vlistptr->varsAllocated = vlistvarSize;
+  vlistptr->vars = vlistvars;
+
+  vlistvar_init_entry(vlistvars, varID);
+  vlistvars[varID].isUsed = true;
+
+  return varID;
+}
+
+static var_t *
+vlistptr_get_varptr(const char *caller, vlist_t *vlistptr, int varID)
+{
+  if (varID < 0 || varID >= vlistptr->nvars || !vlistptr->vars[varID].isUsed) Errorc("varID %d undefined!", varID);
+  return &vlistptr->vars[varID];
+}
+
+int
+vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID)
+{
+  if (CDI_Debug) Message("gridID = %d  zaxisID = %d  timetype = %d", gridID, zaxisID, timetype);
+
+  int varID = vlistvarNewEntry(vlistID);
+
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  vlistptr->nvars++;
+  var_t *varptr = &vlistptr->vars[varID];
+  varptr->gridID = gridID;
+  varptr->zaxisID = zaxisID;
+  varptr->timetype = timetype;
+  varptr->subtypeID = tilesetID;
+
+  if (timetype < 0)
+    {
+      Warning("Unexpected time type %d, set to TIME_VARYING!", timetype);
+      varptr->timetype = TIME_VARYING;
+    }
+
+  // Compatibility for release 1.8.3
+  if (timetype > 1 && timetype < 15)
+    {
+      varptr->timetype = TIME_VARYING;
+      varptr->tsteptype = timetype;
+      static bool printInfo = true;
+      if (printInfo)
+        {
+          printInfo = false;
+          fprintf(stdout, "CDI info: The vlistDefVar() function was called with an invalid value for the timetype parameter.\n");
+          fprintf(stdout, "CDI info:    This may be an obsolete form of using the vlistDefVar() function.\n");
+          fprintf(stdout, "CDI info:    The correct form is:\n");
+          fprintf(stdout, "CDI info:       varID = vlistDefVar(vlistID, gridID, zaxisID, timetype)\n");
+          fprintf(stdout, "CDI info:       vlistDefVarTsteptype(vlistID, varID, tsteptype)\n");
+          fprintf(stdout, "CDI info:          with: timetype = TIME_CONSTANT | TIME_VARYING\n");
+          fprintf(stdout, "CDI info:                tsteptype = TSTEP_AVG .... TSTEP_SUM\n");
+        }
+    }
+
+  vlistAdd2GridIDs(vlistptr, gridID);
+  vlistAdd2ZaxisIDs(vlistptr, zaxisID);
+  vlistAdd2SubtypeIDs(vlistptr, tilesetID);
+
+  varptr->param = cdiEncodeParam(-(varID + 1), 255, 255);
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+
+  return varID;
+}
+
+/*
+@Function  vlistDefVar
+@Title     Define a Variable
+
+@Prototype int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype)
+@Parameter
+    @Item  vlistID   Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  gridID    Grid ID, from a previous call to @fref{gridCreate}.
+    @Item  zaxisID   Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  timetype  One of the set of predefined CDI timestep types.
+                     The valid CDI timestep types are @func{TIME_CONSTANT} and @func{TIME_VARYING}.
+
+@Description
+The function @func{vlistDefVar} adds a new variable to vlistID.
+
+@Result
+@func{vlistDefVar} returns an identifier to the new variable.
+
+@Example
+Here is an example using @func{vlistCreate} to create a variable list
+and add a variable with @func{vlistDefVar}.
+
+@Source
+   ...
+int vlistID, varID;
+   ...
+vlistID = vlistCreate();
+varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING);
+   ...
+streamDefVlist(streamID, vlistID);
+   ...
+vlistDestroy(vlistID);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype)
+{
+  // call "vlistDefVarTiles" with a trivial tile index:
+  return vlistDefVarTiles(vlistID, gridID, zaxisID, timetype, CDI_UNDEFID);
+}
+
+void
+cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID);
+  xassert(varID >= 0 && varID < vlistptr->nvars && varptr->levinfo == NULL);
+
+  int zaxisID = varptr->zaxisID;
+  size_t nlevs = (size_t) zaxisInqSize(zaxisID);
+
+  varptr->levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t));
+
+  for (size_t levID = 0; levID < nlevs; ++levID) varptr->levinfo[levID] = DEFAULT_LEVINFO((int) levID);
+}
+
+/*
+@Function  vlistDefVarParam
+@Title     Define the parameter number of a Variable
+
+@Prototype void vlistDefVarParam(int vlistID, int varID, int param)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  param    Parameter number.
+
+@Description
+The function @func{vlistDefVarParam} defines the parameter number of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarParam(int vlistID, int varID, int param)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->param != param)
+    {
+      varptr->param = param;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  vlistDefVarCode
+@Title     Define the code number of a Variable
+
+@Prototype void vlistDefVarCode(int vlistID, int varID, int code)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  code     Code number.
+
+@Description
+The function @func{vlistDefVarCode} defines the code number of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarCode(int vlistID, int varID, int code)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  int pnum, pcat, pdis;
+  cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+  int newParam = cdiEncodeParam(code, pcat, pdis);
+  if (varptr->param != newParam)
+    {
+      varptr->param = newParam;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  *gridID = varptr->gridID;
+  *zaxisID = varptr->zaxisID;
+  *timetype = varptr->timetype;
+}
+
+/*
+@Function  vlistInqVarGrid
+@Title     Get the Grid ID of a Variable
+
+@Prototype int vlistInqVarGrid(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarGrid} returns the grid ID of a Variable.
+
+@Result
+@func{vlistInqVarGrid} returns the grid ID of the Variable.
+
+@EndFunction
+*/
+int
+vlistInqVarGrid(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->gridID;
+}
+
+/*
+@Function  vlistInqVarZaxis
+@Title     Get the Zaxis ID of a Variable
+
+@Prototype int vlistInqVarZaxis(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarZaxis} returns the zaxis ID of a variable.
+
+@Result
+@func{vlistInqVarZaxis} returns the zaxis ID of the variable.
+
+@EndFunction
+*/
+int
+vlistInqVarZaxis(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->zaxisID;
+}
+
+/*
+@Function  vlistInqVarSubtype
+@Title     Get the Subtype ID of a Variable
+
+@Description
+The function @func{vlistInqVarSubtype} returns the subtype ID of a variable.
+
+@Result
+@func{vlistInqVarSubtype} returns the subtype ID of the variable.
+
+@EndFunction
+*/
+int
+vlistInqVarSubtype(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->subtypeID;
+}
+
+/*
+@Function  vlistInqVarParam
+@Title     Get the parameter number of a Variable
+
+@Prototype int vlistInqVarParam(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarParam} returns the parameter number of a variable.
+
+@Result
+@func{vlistInqVarParam} returns the parameter number of the variable.
+
+@EndFunction
+*/
+int
+vlistInqVarParam(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->param;
+}
+
+/*
+@Function  vlistInqVarCode
+@Title     Get the Code number of a Variable
+
+@Prototype int vlistInqVarCode(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarCode} returns the code number of a variable.
+
+@Result
+@func{vlistInqVarCode} returns the code number of the variable.
+
+@EndFunction
+*/
+int
+vlistInqVarCode(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  int pdis, pcat, pnum;
+  cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+  int code = pnum;
+  if (pdis != 255) code = -varID - 1;  // GRIB2 Parameter
+
+  int tableID = varptr->tableID;
+  if (code < 0 && tableID != -1)
+    {
+      char name[CDI_MAX_NAME];
+      int length = CDI_MAX_NAME;
+      (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length);
+
+      if (name[0]) tableInqParCode(tableID, name, &code);
+    }
+
+  return code;
+}
+
+/*
+@Function  vlistInqVarName
+@Title     Get the name of a Variable
+
+@Prototype void vlistInqVarName(int vlistID, int varID, char *name)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+    @Item  name     Returned variable name. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{vlistInqVarName} returns the name of a variable.
+
+@Result
+@func{vlistInqVarName} returns the name of the variable to the parameter name if available,
+otherwise the result is an empty string.
+
+@EndFunction
+*/
+void
+vlistInqVarName(int vlistID, int varID, char *name)
+{
+  int length = CDI_MAX_NAME;
+  if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length))
+    {
+      var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+      int pdis, pcat, pnum;
+      cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+      if (pdis == 255)
+        {
+          int code = pnum;
+          int tableID = varptr->tableID;
+          tableInqEntry(tableID, code, -1, name, NULL, NULL);
+          if (!name[0]) snprintf(name, 8, "var%d", code);
+        }
+      else
+        {
+          snprintf(name, CDI_MAX_NAME, "param%d.%d.%d", pnum, pcat, pdis);
+        }
+    }
+}
+
+/*
+@Function vlistCopyVarName
+@Tatle    Get the name of a Variable in a safe way
+
+@Prototype char* vlistCopyVarName(int vlistId, int varId)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Return A pointer to a malloc'ed string. Must be cleaned up with Free().
+
+@Description
+This is the buffer overflow immune version of vlistInqVarName().
+The memory for the returned string is allocated to fit the string via Malloc().
+
+@EndFunction
+*/
+char *
+vlistCopyVarName(int vlistID, int varID)
+{
+  // If a name is set in the variable description, use that.
+  char name[CDI_MAX_NAME];
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length);
+  if (name[0]) return strdup(name);
+
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  // Otherwise we check if we should use the table of parameter descriptions.
+  int discipline, category, number;
+  cdiDecodeParam(varptr->param, &number, &category, &discipline);
+  char *result = NULL;
+  if (discipline == 255)
+    {
+      tableInqEntry(varptr->tableID, number, -1, name, NULL, NULL);
+      if (name[0])
+        result = strdup(name);
+      else
+        {
+          // No luck, fall back to outputting a name of the format "var<num>".
+          size_t len = 3 + 3 * sizeof(int) * CHAR_BIT / 8 + 2;
+          result = (char *) Malloc(len);
+          snprintf(result, len, "var%d", number);
+        }
+    }
+  else
+    {
+      size_t len = 5 + 2 + 3 * (3 * sizeof(int) * CHAR_BIT + 1) + 1;
+      result = (char *) Malloc(len);
+      snprintf(result, len, "param%d.%d.%d", number, category, discipline);
+    }
+  // Finally, we fall back to outputting a name of the format "param<num>.<cat>.<dis>".
+  return result;
+}
+
+/*
+@Function  vlistInqVarLongname
+@Title     Get the longname of a Variable
+
+@Prototype void vlistInqVarLongname(int vlistID, int varID, char *longname)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+    @Item  longname Long name of the variable. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{vlistInqVarLongname} returns the longname of a variable if available,
+otherwise the result is an empty string.
+
+@Result
+@func{vlistInqVarLongname} returns the longname of the variable to the parameter longname.
+
+@EndFunction
+*/
+void
+vlistInqVarLongname(int vlistID, int varID, char *longname)
+{
+  int length = CDI_MAX_NAME;
+  if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length))
+    {
+      var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+      int pdis, pcat, pnum;
+      cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+      if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, longname, NULL);
+    }
+}
+
+/*
+@Function  vlistInqVarStdname
+@Title     Get the standard name of a Variable
+
+@Prototype void vlistInqVarStdname(int vlistID, int varID, char *stdname)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+    @Item  stdname  Standard name of the variable. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{vlistInqVarStdname} returns the standard name of a variable if available,
+otherwise the result is an empty string.
+
+@Result
+@func{vlistInqVarStdname} returns the standard name of the variable to the parameter stdname.
+
+@EndFunction
+*/
+void
+vlistInqVarStdname(int vlistID, int varID, char *stdname)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length);
+}
+
+// obsolete function
+int
+vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID)
+{
+  static bool printInfo = true;
+  if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiInqKeyInt");
+  int typeOfGeneratingProcess = 0;
+  cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess);
+  return typeOfGeneratingProcess;
+}
+
+// obsolete function
+void
+vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess)
+{
+  static bool printInfo = true;
+  if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt");
+  cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, typeOfGeneratingProcess);
+}
+
+// obsolete function
+void
+vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate)
+{
+  static bool printInfo = true;
+  if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt");
+  cdiDefKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, productDefinitionTemplate);
+}
+
+/*
+@Function  vlistInqVarUnits
+@Title     Get the units of a Variable
+
+@Prototype void vlistInqVarUnits(int vlistID, int varID, char *units)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+    @Item  units    Units of the variable. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{vlistInqVarUnits} returns the units of a variable if available,
+otherwise the result is an empty string.
+
+@Result
+@func{vlistInqVarUnits} returns the units of the variable to the parameter units.
+
+@EndFunction
+*/
+void
+vlistInqVarUnits(int vlistID, int varID, char *units)
+{
+  int length = CDI_MAX_NAME;
+  if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length))
+    {
+      var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+      int pdis, pcat, pnum;
+      cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+      if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, NULL, units);
+    }
+}
+
+// used in MPIOM !
+int
+vlistInqVarID(int vlistID, int code)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int varID = 0; varID < vlistptr->nvars; ++varID)
+    {
+      int param = vlistptr->vars[varID].param;
+      int pdis, pcat, pnum;
+      cdiDecodeParam(param, &pnum, &pcat, &pdis);
+      if (pnum == code) return varID;
+    }
+
+  return CDI_UNDEFID;
+}
+
+SizeType
+vlistInqVarSize(int vlistID, int varID)
+{
+  int zaxisID, gridID, timetype;
+  vlistInqVar(vlistID, varID, &gridID, &zaxisID, &timetype);
+
+  SizeType nlevs = (SizeType) zaxisInqSize(zaxisID);
+  SizeType gridsize = gridInqSize(gridID);
+
+  return gridsize * nlevs;
+}
+
+/*
+@Function  vlistInqVarDatatype
+@Title     Get the data type of a Variable
+
+@Prototype int vlistInqVarDatatype(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarDatatype} returns the data type of a variable.
+
+@Result
+@func{vlistInqVarDatatype} returns an identifier to the data type of the variable.
+The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16}, @func{CDI_DATATYPE_PACK24},
+@func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64}, @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and
+@func{CDI_DATATYPE_INT32}.
+
+@EndFunction
+*/
+int
+vlistInqVarDatatype(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->datatype;
+}
+
+int
+vlistInqVarNumber(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return (varptr->datatype == CDI_DATATYPE_CPX32 || varptr->datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL;
+}
+
+static bool
+check_range(double value, double lowerBound, double upperBound)
+{
+  return (value >= lowerBound && value <= upperBound);
+}
+
+/*
+@Function  vlistDefVarDatatype
+@Title     Define the data type of a Variable
+
+@Prototype void vlistDefVarDatatype(int vlistID, int varID, int datatype)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  datatype The data type identifier.
+                    The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16},
+                    @func{CDI_DATATYPE_PACK24}, @func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64},
+                    @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and @func{CDI_DATATYPE_INT32}.
+
+@Description
+The function @func{vlistDefVarDatatype} defines the data type of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarDatatype(int vlistID, int varID, int datatype)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->datatype != datatype)
+    {
+      varptr->datatype = datatype;
+
+      if (!varptr->missvalused)
+        {
+          double missval = varptr->missval;
+          bool missvalIsDefault = DBL_IS_EQUAL(missval, CDI_Default_Missval);
+          if (missvalIsDefault)
+            {
+              // clang-format off
+              switch (datatype)
+                {
+                case CDI_DATATYPE_INT8:   varptr->missval = -SCHAR_MAX; break;
+                case CDI_DATATYPE_UINT8:  varptr->missval =  UCHAR_MAX; break;
+                case CDI_DATATYPE_INT16:  varptr->missval = -SHRT_MAX;  break;
+                case CDI_DATATYPE_UINT16: varptr->missval =  USHRT_MAX; break;
+                case CDI_DATATYPE_INT32:  varptr->missval = -INT_MAX;   break;
+                case CDI_DATATYPE_UINT32: varptr->missval =  UINT_MAX;  break;
+                case CDI_DATATYPE_FLT32:  varptr->missval =  (float) CDI_Default_Missval;  break;
+                }
+              // clang-format on
+            }
+          else
+            {
+              // clang-format off
+              switch (datatype)
+                {
+                case CDI_DATATYPE_INT8:   varptr->missval = check_range(missval, -SCHAR_MAX, SCHAR_MAX) ? missval : -SCHAR_MAX; break;
+                case CDI_DATATYPE_UINT8:  varptr->missval = check_range(missval,          0, UCHAR_MAX) ? missval :  UCHAR_MAX; break;
+                case CDI_DATATYPE_INT16:  varptr->missval = check_range(missval,  -SHRT_MAX,  SHRT_MAX) ? missval : -SHRT_MAX;  break;
+                case CDI_DATATYPE_UINT16: varptr->missval = check_range(missval,          0, USHRT_MAX) ? missval :  USHRT_MAX; break;
+                case CDI_DATATYPE_INT32:  varptr->missval = check_range(missval,   -INT_MAX,   INT_MAX) ? missval : -INT_MAX;   break;
+                case CDI_DATATYPE_UINT32: varptr->missval = check_range(missval,          0,  UINT_MAX) ? missval :  UINT_MAX;  break;
+                case CDI_DATATYPE_FLT32:  varptr->missval = check_range(missval,   -FLT_MAX,   FLT_MAX) ? missval :  CDI_Default_Missval;  break;
+                }
+              // clang-format on
+            }
+        }
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+vlistDefVarInstitut(int vlistID, int varID, int instID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  if (varptr->instID != instID)
+    {
+      varptr->instID = instID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarInstitut(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->instID;
+}
+
+void
+vlistDefVarModel(int vlistID, int varID, int modelID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  if (varptr->modelID != modelID)
+    {
+      varptr->modelID = modelID;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarModel(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->modelID;
+}
+
+void
+vlistDefVarTable(int vlistID, int varID, int tableID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->tableID != tableID)
+    {
+      varptr->tableID = tableID;
+      int tablenum = tableInqNum(tableID);
+      int pnum, pcat, pdis;
+      cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis);
+      varptr->param = cdiEncodeParam(pnum, tablenum, pdis);
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarTable(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->tableID;
+}
+
+/*
+@Function  vlistDefVarName
+@Title     Define the name of a Variable
+
+@Prototype void vlistDefVarName(int vlistID, int varID, const char *name)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  name     Name of the variable.
+
+@Description
+The function @func{vlistDefVarName} defines the name of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarName(int vlistID, int varID, const char *name)
+{
+  (void) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name);
+}
+
+/*
+@Function  vlistDefVarLongname
+@Title     Define the long name of a Variable
+
+@Prototype void vlistDefVarLongname(int vlistID, int varID, const char *longname)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  longname Long name of the variable.
+
+@Description
+The function @func{vlistDefVarLongname} defines the long name of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarLongname(int vlistID, int varID, const char *longname)
+{
+  if (longname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname);
+}
+
+/*
+@Function  vlistDefVarStdname
+@Title     Define the standard name of a Variable
+
+@Prototype void vlistDefVarStdname(int vlistID, int varID, const char *stdname)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  stdname  Standard name of the variable.
+
+@Description
+The function @func{vlistDefVarStdname} defines the standard name of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarStdname(int vlistID, int varID, const char *stdname)
+{
+  if (stdname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname);
+}
+
+/*
+@Function  vlistDefVarUnits
+@Title     Define the units of a Variable
+
+@Prototype void vlistDefVarUnits(int vlistID, int varID, const char *units)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  units    Units of the variable.
+
+@Description
+The function @func{vlistDefVarUnits} defines the units of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarUnits(int vlistID, int varID, const char *units)
+{
+  if (units) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units);
+}
+
+/*
+@Function  vlistInqVarMissval
+@Title     Get the missing value of a Variable
+
+@Prototype double vlistInqVarMissval(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarMissval} returns the missing value of a variable.
+
+@Result
+@func{vlistInqVarMissval} returns the missing value of the variable.
+
+@EndFunction
+*/
+double
+vlistInqVarMissval(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->missval;
+}
+
+/*
+@Function  vlistDefVarMissval
+@Title     Define the missing value of a Variable
+
+@Prototype void vlistDefVarMissval(int vlistID, int varID, double missval)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate}.
+    @Item  varID    Variable identifier.
+    @Item  missval  Missing value.
+
+@Description
+The function @func{vlistDefVarMissval} defines the missing value of a variable.
+
+@EndFunction
+*/
+void
+vlistDefVarMissval(int vlistID, int varID, double missval)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  varptr->missval = missval;
+  varptr->missvalused = true;
+}
+
+int
+vlistInqVarValidrange(int vlistID, int varID, double *validrange)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (validrange != NULL && varptr->lvalidrange)
+    {
+      validrange[0] = varptr->validrange[0];
+      validrange[1] = varptr->validrange[1];
+    }
+
+  return (int) varptr->lvalidrange;
+}
+
+void
+vlistDefVarValidrange(int vlistID, int varID, const double *validrange)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  varptr->validrange[0] = validrange[0];
+  varptr->validrange[1] = validrange[1];
+  varptr->lvalidrange = true;
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+void
+vlistDefVarTimetype(int vlistID, int varID, int timetype)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  if (varptr->timetype != timetype)
+    {
+      varptr->timetype = timetype;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarTimetype(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->timetype;
+}
+
+void
+vlistDefVarTsteptype(int vlistID, int varID, int tsteptype)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  if (varptr->tsteptype != tsteptype)
+    {
+      varptr->tsteptype = tsteptype;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+/*
+@Function  vlistInqVarTsteptype
+@Title     Get the timestep type of a Variable
+
+@Prototype int vlistInqVarTsteptype(int vlistID, int varID)
+@Parameter
+    @Item  vlistID  Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}.
+    @Item  varID    Variable identifier.
+
+@Description
+The function @func{vlistInqVarTsteptype} returns the timestep type of a Variable.
+
+@Result
+@func{vlistInqVarTsteptype} returns the timestep type of the Variable,
+one of the set of predefined CDI timestep types.
+The valid CDI timestep types are @func{TSTEP_INSTANT},
+@func{TSTEP_ACCUM}, @func{TSTEP_AVG}, @func{TSTEP_MAX}, @func{TSTEP_MIN} and @func{TSTEP_SD}.
+
+@EndFunction
+*/
+int
+vlistInqVarTsteptype(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->tsteptype;
+}
+
+int
+vlistInqVarMissvalUsed(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return (int) varptr->missvalused;
+}
+
+void
+vlistDefFlag(int vlistID, int varID, int levID, int flag)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID);
+
+  levinfo_t li = DEFAULT_LEVINFO(levID);
+  if (varptr->levinfo)
+    ;
+  else if (flag != li.flag)
+    cdiVlistCreateVarLevInfo(vlistptr, varID);
+  else
+    return;
+
+  varptr->levinfo[levID].flag = flag;
+  varptr->flag = 0;
+
+  int nlevs = zaxisInqSize(varptr->zaxisID);
+  for (int levelID = 0; levelID < nlevs; ++levelID)
+    {
+      if (varptr->levinfo[levelID].flag)
+        {
+          varptr->flag = 1;
+          break;
+        }
+    }
+
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+int
+vlistInqFlag(int vlistID, int varID, int levID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->levinfo) return varptr->levinfo[levID].flag;
+
+  levinfo_t li = DEFAULT_LEVINFO(levID);
+  return li.flag;
+}
+
+int
+vlistFindVar(int vlistID, int fvarID)
+{
+  int varID;
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (varID = 0; varID < vlistptr->nvars; ++varID)
+    {
+      if (vlistptr->vars[varID].fvarID == fvarID) break;
+    }
+
+  if (varID == vlistptr->nvars)
+    {
+      varID = -1;
+      Warning("varID not found for fvarID %d in vlistID %d!", fvarID, vlistID);
+    }
+
+  return varID;
+}
+
+int
+vlistFindLevel(int vlistID, int fvarID, int flevelID)
+{
+  int levelID = -1;
+  int varID = vlistFindVar(vlistID, fvarID);
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varID != -1)
+    {
+      int nlevs = zaxisInqSize(varptr->zaxisID);
+      for (levelID = 0; levelID < nlevs; ++levelID)
+        {
+          if (varptr->levinfo[levelID].flevelID == flevelID) break;
+        }
+
+      if (levelID == nlevs)
+        {
+          levelID = -1;
+          Warning("levelID not found for fvarID %d and levelID %d in vlistID %d!", fvarID, flevelID, vlistID);
+        }
+    }
+
+  return levelID;
+}
+
+int
+vlistMergedVar(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->mvarID;
+}
+
+int
+vlistMergedLevel(int vlistID, int varID, int levelID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->levinfo) return varptr->levinfo[levelID].mlevelID;
+
+  levinfo_t li = DEFAULT_LEVINFO(levelID);
+  return li.mlevelID;
+}
+
+void
+vlistDefIndex(int vlistID, int varID, int levelID, int index)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID);
+
+  levinfo_t li = DEFAULT_LEVINFO(levelID);
+  if (varptr->levinfo)
+    ;
+  else if (index != li.index)
+    cdiVlistCreateVarLevInfo(vlistptr, varID);
+  else
+    return;
+
+  varptr->levinfo[levelID].index = index;
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+int
+vlistInqIndex(int vlistID, int varID, int levelID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->levinfo) return varptr->levinfo[levelID].index;
+
+  levinfo_t li = DEFAULT_LEVINFO(levelID);
+  return li.index;
+}
+
+void
+vlistChangeVarZaxis(int vlistID, int varID, int zaxisID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID);
+
+  int nlevs1 = zaxisInqSize(varptr->zaxisID);
+  int nlevs2 = zaxisInqSize(zaxisID);
+
+  if (nlevs1 != nlevs2) Error("Number of levels must not change!");
+
+  int nvars = vlistptr->nvars;
+  int found = 0;
+  int oldZaxisID = varptr->zaxisID;
+  for (int i = 0; i < varID; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID);
+  for (int i = varID + 1; i < nvars; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID);
+
+  if (found)
+    {
+      int nzaxis = vlistptr->nzaxis;
+      for (int i = 0; i < nzaxis; ++i)
+        if (vlistptr->zaxisIDs[i] == oldZaxisID) vlistptr->zaxisIDs[i] = zaxisID;
+    }
+  else
+    vlistAdd2ZaxisIDs(vlistptr, zaxisID);
+
+  varptr->zaxisID = zaxisID;
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+void
+vlistChangeVarGrid(int vlistID, int varID, int gridID)
+{
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID);
+
+  int nvars = vlistptr->nvars;
+  int index;
+  for (index = 0; index < nvars; index++)
+    if (index != varID)
+      if (vlistptr->vars[index].gridID == vlistptr->vars[varID].gridID) break;
+
+  if (index == nvars)
+    {
+      for (index = 0; index < vlistptr->ngrids; index++)
+        if (vlistptr->gridIDs[index] == vlistptr->vars[varID].gridID) vlistptr->gridIDs[index] = gridID;
+    }
+  else
+    vlistAdd2GridIDs(vlistptr, gridID);
+
+  varptr->gridID = gridID;
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+void
+vlistDefVarCompType(int vlistID, int varID, int comptype)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->comptype != comptype)
+    {
+      varptr->comptype = comptype;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarCompType(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->comptype;
+}
+
+void
+vlistDefVarCompLevel(int vlistID, int varID, int complevel)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (varptr->complevel != complevel)
+    {
+      varptr->complevel = complevel;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarCompLevel(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->complevel;
+}
+
+void
+vlistDefVarNSB(int vlistID, int varID, int nsb)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  if (varptr->nsb != nsb)
+    {
+      varptr->nsb = nsb;
+      reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+vlistInqVarNSB(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return varptr->nsb;
+}
+
+static int
+vlistEncodeXyz(const int dimorder[3])
+{
+  return (short) (dimorder[0] * 100 + dimorder[1] * 10 + dimorder[2]);
+}
+
+static void
+vlistDecodeXyz(int xyz, int outDimorder[3])
+{
+  outDimorder[0] = xyz / 100, xyz = xyz % 100;
+  outDimorder[1] = xyz / 10;
+  outDimorder[2] = xyz % 10;
+}
+
+static const short xyzStorVals[] = { 123, 132, 213, 231, 312, 321 };
+enum
+{
+  numXYZStorVals = sizeof(xyzStorVals) / sizeof(xyzStorVals[0])
+};
+
+void
+vlistDefVarXYZ(int vlistID, int varID, int xyz)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+
+  if (xyz == 3) xyz = 321;
+
+  // check xyz dimension order
+  {
+    int dimorder[3];
+    vlistDecodeXyz(xyz, dimorder);
+    int dimx = 0, dimy = 0, dimz = 0;
+    for (int id = 0; id < 3; ++id)
+      {
+        switch (dimorder[id])
+          {
+          case 1: dimx++; break;
+          case 2: dimy++; break;
+          case 3: dimz++; break;
+          default: dimorder[id] = 0; break;  // Ensure that we assign a valid dimension to this position.
+          }
+      }
+    if (dimz > 1 || dimy > 1 || dimx > 1)
+      xyz = 321;  // ZYX
+    else
+      {
+        // clang-format off
+        if (dimz == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 3; break; }
+        if (dimy == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 2; break; }
+        if (dimx == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 1; break; }
+        // clang-format on
+        xyz = vlistEncodeXyz(dimorder);
+      }
+  }
+
+  assert(xyz == 123 || xyz == 312 || xyz == 231 || xyz == 321 || xyz == 132 || xyz == 213);
+
+  for (size_t i = 0; i < numXYZStorVals; ++i)
+    if (xyz == xyzStorVals[i])
+      {
+        xyz = (int) i;
+        break;
+      }
+  varptr->xyz = (signed char) xyz;
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+}
+
+void
+vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3])
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  vlistDecodeXyz(xyzStorVals[varptr->xyz], outDimorder);
+}
+
+int
+vlistInqVarXYZ(int vlistID, int varID)
+{
+  var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID);
+  return xyzStorVals[varptr->xyz];
+}
+
+int
+vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB)
+{
+  xassert(a && b && varIDA >= 0 && varIDA < a->nvars && varIDB >= 0 && varIDB < b->nvars);
+  var_t *pva = a->vars + varIDA, *pvb = b->vars + varIDB;
+#define FCMP(f) ((pva->f) != (pvb->f))
+#define FCMPFLT(f) (IS_NOT_EQUAL((pva->f), (pvb->f)))
+#define FCMPSTR(fs) ((pva->fs) != (pvb->fs) && strcmp((pva->fs), (pvb->fs)))
+#define FCMP2(f) (namespaceResHDecode(pva->f).idx != namespaceResHDecode(pvb->f).idx)
+  int diff = (int) FCMP(fvarID) | FCMP(mvarID) | FCMP(flag) | FCMP(param) | FCMP(datatype) | FCMP(timetype) | FCMP(tsteptype)
+             | FCMP(xyz) | FCMP2(gridID) | FCMP2(zaxisID) | FCMP2(instID) | FCMP2(modelID) | FCMP2(tableID) | FCMP(missvalused)
+             | FCMPFLT(missval) | FCMP(comptype) | FCMP(complevel) | FCMP(lvalidrange) | FCMPFLT(validrange[0])
+             | FCMPFLT(validrange[1]);
+#undef FCMP
+#undef FCMPFLT
+#undef FCMPSTR
+#undef FCMP2
+  if ((diff |= ((pva->levinfo == NULL) ^ (pvb->levinfo == NULL)))) return 1;
+
+  if (pva->levinfo)
+    {
+      int zaxisID = pva->zaxisID;
+      size_t nlevs = (size_t) zaxisInqSize(zaxisID);
+      diff |= (memcmp(pva->levinfo, pvb->levinfo, sizeof(levinfo_t) * nlevs) != 0);
+      if (diff) return 1;
+    }
+
+  size_t natts = a->vars[varIDA].atts.nelems;
+  if (natts != b->vars[varIDB].atts.nelems) return 1;
+  for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->vars[varIDA].atts, &b->vars[varIDB].atts, (int) attID);
+
+  size_t nkeys = a->vars[varIDA].keys.nelems;
+  if (nkeys != b->vars[varIDB].keys.nelems) return 1;
+  for (size_t keyID = 0; keyID < nkeys; ++keyID) diff |= cdi_key_compare(&a->vars[varIDA].keys, &b->vars[varIDB].keys, (int) keyID);
+
+  return diff;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+
+enum
+{
+  VLISTVAR_PACK_INT_IDX_FLAG,
+  VLISTVAR_PACK_INT_IDX_GRIDID,
+  VLISTVAR_PACK_INT_IDX_ZAXISID,
+  VLISTVAR_PACK_INT_IDX_TIMETYPE,
+  VLISTVAR_PACK_INT_IDX_DATATYPE,
+  VLISTVAR_PACK_INT_IDX_PARAM,
+  VLISTVAR_PACK_INT_IDX_INSTID,
+  VLISTVAR_PACK_INT_IDX_MODELID,
+  VLISTVAR_PACK_INT_IDX_TABLEID,
+  VLISTVAR_PACK_INT_IDX_MISSVALUSED,
+  VLISTVAR_PACK_INT_IDX_COMPTYPE,
+  VLISTVAR_PACK_INT_IDX_COMPLEVEL,
+  VLISTVAR_PACK_INT_IDX_NLEVS,
+  vlistvarNint
+};
+
+enum
+{
+  VLIST_VAR_PACK_DBL_MISSVAL,
+  vlistvar_ndbls,
+};
+
+int
+vlistVarGetPackSize(vlist_t *p, int varID, void *context)
+{
+  var_t *var = p->vars + varID;
+  int varsize
+      = serializeGetSize(vlistvarNint, CDI_DATATYPE_INT, context) + serializeGetSize(vlistvar_ndbls, CDI_DATATYPE_FLT64, context);
+
+  if (var->levinfo) varsize += serializeGetSize(4 * zaxisInqSize(var->zaxisID), CDI_DATATYPE_INT, context);
+  varsize += serializeKeysGetPackSize(&var->keys, context);
+  varsize += cdiAttsGetSize(p, varID, context);
+
+  return varsize;
+}
+
+void
+vlistVarPack(vlist_t *p, int varID, char *buf, int size, int *position, void *context)
+{
+  var_t *var = p->vars + varID;
+  int nlevs;
+  {
+    int tempbuf[vlistvarNint];
+    tempbuf[VLISTVAR_PACK_INT_IDX_FLAG] = var->flag;
+    tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID] = var->gridID;
+    tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID] = var->zaxisID;
+    tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE] = var->timetype;
+    tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE] = var->datatype;
+    tempbuf[VLISTVAR_PACK_INT_IDX_PARAM] = var->param;
+    tempbuf[VLISTVAR_PACK_INT_IDX_INSTID] = var->instID;
+    tempbuf[VLISTVAR_PACK_INT_IDX_MODELID] = var->modelID;
+    tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID] = var->tableID;
+    tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED] = (int) var->missvalused;
+    tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE] = var->comptype;
+    tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL] = var->complevel;
+    nlevs = var->levinfo ? zaxisInqSize(var->zaxisID) : 0;
+    tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS] = nlevs;
+    serializePack(tempbuf, vlistvarNint, CDI_DATATYPE_INT, buf, size, position, context);
+  }
+  {
+    double dtempbuf[vlistvar_ndbls];
+    dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL] = var->missval;
+    serializePack(dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, buf, size, position, context);
+  }
+  if (nlevs)
+    {
+      int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int));
+      for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flag;
+      serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context);
+      for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].index;
+      serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context);
+      for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].mlevelID;
+      serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context);
+      for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flevelID;
+      Free(levbuf);
+    }
+
+  serializeKeysPack(&var->keys, buf, size, position, context);
+
+  cdiAttsPack(p, varID, buf, size, position, context);
+}
+
+void
+vlistVarUnpack(int vlistID, char *buf, int size, int *position, int originNamespace, void *context)
+{
+#define adaptKey(key) (namespaceAdaptKey((key), originNamespace))
+  double dtempbuf[vlistvar_ndbls];
+  int tempbuf[vlistvarNint];
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  serializeUnpack(buf, size, position, tempbuf, vlistvarNint, CDI_DATATYPE_INT, context);
+  serializeUnpack(buf, size, position, dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, context);
+
+  /* ------------------------------------------- */
+  /* NOTE: Tile sets  currently not supported!!! */
+  /* ------------------------------------------- */
+
+  int newvar = vlistDefVar(vlistID, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID]),
+                           adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID]), tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE]);
+  vlistDefVarDatatype(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE]);
+  vlistDefVarInstitut(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_INSTID]));
+  vlistDefVarModel(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_MODELID]));
+  vlistDefVarTable(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID]);
+  // FIXME: changing the table might change the param code
+  vlistDefVarParam(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_PARAM]);
+  if (tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED]) vlistDefVarMissval(vlistID, newvar, dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL]);
+  vlistDefVarCompType(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE]);
+  vlistDefVarCompLevel(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL]);
+  const int nlevs = tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS];
+  var_t *var = vlistptr->vars + newvar;
+  if (nlevs)
+    {
+      int i, flagSetLev = 0;
+      cdiVlistCreateVarLevInfo(vlistptr, newvar);
+
+      int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int));
+      serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context);
+      for (i = 0; i < nlevs; ++i) vlistDefFlag(vlistID, newvar, i, levbuf[i]);
+      for (i = 0; i < nlevs; ++i)
+        if (levbuf[i] == tempbuf[0]) flagSetLev = i;
+      vlistDefFlag(vlistID, newvar, flagSetLev, levbuf[flagSetLev]);
+      serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context);
+      for (i = 0; i < nlevs; ++i) vlistDefIndex(vlistID, newvar, i, levbuf[i]);
+      serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context);
+      for (i = 0; i < nlevs; ++i) var->levinfo[i].mlevelID = levbuf[i];
+      serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context);
+      for (i = 0; i < nlevs; ++i) var->levinfo[i].flevelID = levbuf[i];
+      Free(levbuf);
+    }
+
+  serializeKeysUnpack(buf, size, position, &var->keys, context);
+
+  cdiAttsUnpack(vlistID, newvar, buf, size, position, context);
+#undef adaptKey
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+#ifdef HAVE_CONFIG_H
+#endif
+
+
+/* vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API */
+void
+vlistDefVarIntKey(int vlistID, int varID, const char *name, int value)
+{
+#ifdef HAVE_LIBGRIB_API
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  if (vlistptr == NULL) Error("Internal error!");
+  int idx;
+
+  if (vlistptr->immutable)
+    Error("vlistDefVarIntKey() was called on an immutable vlist object (vlistID = %d)\n"
+          "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n"
+          "or use the stream-internal vlist by calling streamInqVlist().",
+          vlistID);
+
+  for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++)
+    if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword)
+        && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int))
+      break;
+
+  if (idx < vlistptr->vars[varID].opt_grib_nentries)
+    {
+      vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].update = true;
+    }
+  else
+    {
+      resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1);
+      vlistptr->vars[varID].opt_grib_nentries += 1;
+      idx = vlistptr->vars[varID].opt_grib_nentries - 1;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_int;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].update = true;
+      if (name)
+        vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name);
+      else
+        Error("Internal error, name undefined!");
+    }
+
+  if (CDI_Debug)
+    {
+      Message("define additional GRIB2 key \"%s\" (integer): %d", name, value);
+      Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries);
+      for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++)
+        if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)
+          Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
+                  vlistptr->vars[varID].opt_grib_kvpair[idx].int_val);
+        else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)
+          Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
+                  vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val);
+        else
+          Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword);
+    }
+
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+#else
+  (void) vlistID;
+  (void) varID;
+  (void) name;
+  (void) value;
+#endif
+}
+
+/* vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API */
+void
+vlistDefVarDblKey(int vlistID, int varID, const char *name, double value)
+{
+#ifdef HAVE_LIBGRIB_API
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+  if (vlistptr == NULL) Error("Internal error!");
+  int idx;
+
+  if (vlistptr->immutable)
+    Error("vlistDefVarDblKey() was called on an immutable vlist object (vlistID = %d)\n"
+          "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n"
+          "or use the stream-internal vlist by calling streamInqVlist().",
+          vlistID);
+
+  for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++)
+    if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword)
+        && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double))
+      break;
+
+  if (idx < vlistptr->vars[varID].opt_grib_nentries)
+    {
+      vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].update = true;
+    }
+  else
+    {
+      resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1);
+      vlistptr->vars[varID].opt_grib_nentries += 1;
+      idx = vlistptr->vars[varID].opt_grib_nentries - 1;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_double;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value;
+      vlistptr->vars[varID].opt_grib_kvpair[idx].update = true;
+      if (name)
+        vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name);
+      else
+        Error("Internal error, name undefined!");
+    }
+
+  if (CDI_Debug)
+    {
+      Message("define additional GRIB2 key \"%s\" (double): %d", name, value);
+      Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries);
+      for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++)
+        if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)
+          Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
+                  vlistptr->vars[varID].opt_grib_kvpair[idx].int_val);
+        else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)
+          Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword,
+                  vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val);
+        else
+          Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword);
+    }
+
+  reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE);
+#else
+  (void) vlistID;
+  (void) varID;
+  (void) name;
+  (void) value;
+#endif
+}
+
+/* cdiClearAdditionalKeys: Clears the list of additional GRIB keys. */
+void
+cdiClearAdditionalKeys(void)
+{
+#ifdef HAVE_LIBGRIB_API
+  for (int i = 0; i < cdiNAdditionalGRIBKeys; ++i) free(cdiAdditionalGRIBKeys[i]);
+  cdiNAdditionalGRIBKeys = 0;
+#endif
+}
+
+/* cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened. */
+void
+cdiDefAdditionalKey(const char *name)
+{
+#ifdef HAVE_LIBGRIB_API
+  int idx = cdiNAdditionalGRIBKeys;
+  cdiNAdditionalGRIBKeys++;
+  if (idx >= MAX_OPT_GRIB_ENTRIES) Error("Too many additional keywords!");
+  if (name)
+    cdiAdditionalGRIBKeys[idx] = strdup(name);
+  else
+    Error("Internal error!");
+#else
+  (void) name;
+#endif
+}
+
+/* vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise. */
+int
+vlistHasVarKey(int vlistID, int varID, const char *name)
+{
+#ifdef HAVE_LIBGRIB_API
+  /* check if the GRIB key was previously read and is stored */
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i)
+    {
+      if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword)) return 1;
+    }
+#else
+  (void) vlistID;
+  (void) varID;
+  (void) name;
+#endif
+  return 0;
+}
+
+/* vlistInqVarDblKey: raw access to GRIB meta-data */
+double
+vlistInqVarDblKey(int vlistID, int varID, const char *name)
+{
+  double value = 0;
+#ifdef HAVE_LIBGRIB_API
+  /* check if the GRIB key was previously read and is stored in "opt_grib_dbl_val" */
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i)
+    {
+      int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID);
+      if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword)
+          && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double)
+          && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub))
+        return vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val;
+    }
+#else
+  (void) vlistID;
+  (void) varID;
+  (void) name;
+#endif
+  return value;
+}
+
+/* vlistInqVarIntKey: raw access to GRIB meta-data */
+int
+vlistInqVarIntKey(int vlistID, int varID, const char *name)
+{
+  long value = 0;
+#ifdef HAVE_LIBGRIB_API
+  /* check if the GRIB key was previously read and is stored in "opt_grib_int_val" */
+  vlist_t *vlistptr = vlist_to_pointer(vlistID);
+
+  for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i)
+    {
+      int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID);
+      if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword)
+          && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int)
+          && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub))
+        return vlistptr->vars[varID].opt_grib_kvpair[i].int_val;
+    }
+
+#else
+  (void) vlistID;
+  (void) varID;
+  (void) name;
+#endif
+  return (int) value;
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+/* DO NOT REMOVE the config.h include file under any circumstances,
+ * it's very much needed on some platforms */
+#if defined(HAVE_CONFIG_H)
+#endif
+/* DO NOT REMOVE the above config.h include file under any
+ * circumstances as long as it's the autoconf configuration header
+ * used to build this package. When it's missing on some platforms,
+ * some poor person has to do long, tedious debugging sessions, where
+ * struct offsets almost imperceptibly change from one file to the
+ * next to find out what happened */
+
+#include <string.h>
+#include <math.h>
+#include <float.h>
+
+
+
+#define LevelUp 1
+#define LevelDown 2
+
+// clang-format off
+static const struct
+{
+  unsigned char positive;   // 1: up;  2: down
+  const char *name;
+  const char *longname;
+  const char *stdname;
+  const char *units;
+}
+ZaxistypeEntry[] = {
+  { /*  0 */ 0, "sfc",               "surface",                     "",               ""},
+  { /*  1 */ 0, "lev",               "generic",                     "",               ""},
+  { /*  2 */ 2, "lev",               "hybrid",                      "",               "level"},
+  { /*  3 */ 2, "lev",               "hybrid_half",                 "",               "level"},
+  { /*  4 */ 2, "plev",              "pressure",                    "air_pressure",   "Pa"},
+  { /*  5 */ 1, "height",            "height",                      "height",         "m"},
+  { /*  6 */ 2, "depth",             "depth_below_sea",             "depth",          "m"},
+  { /*  7 */ 2, "depth",             "depth_below_land",            "",               "cm"},
+  { /*  8 */ 0, "lev",               "isentropic",                  "",               "K"},
+  { /*  9 */ 0, "lev",               "trajectory",                  "",               ""},
+  { /* 10 */ 1, "alt",               "height_above_mean_sea_level", "altitude",       "m"},
+  { /* 11 */ 0, "lev",               "sigma",                       "",               "level"},
+  { /* 12 */ 0, "lev",               "meansea",                     "",               "level"},
+  { /* 13 */ 0, "toa",               "top_of_atmosphere",           "",               ""},
+  { /* 14 */ 0, "seabottom",         "sea_bottom",                  "",               ""},
+  { /* 15 */ 0, "atmosphere",        "atmosphere",                  "",               ""},
+  { /* 16 */ 0, "cloudbase",         "cloud_base",                  "",               ""},
+  { /* 17 */ 0, "cloudtop",          "cloud_top",                   "",               ""},
+  { /* 18 */ 0, "isotherm0",         "isotherm_zero",               "",               ""},
+  { /* 19 */ 0, "snow",              "snow",                        "",               ""},
+  { /* 20 */ 0, "lakebottom",        "lake_bottom",                 "",               ""},
+  { /* 21 */ 0, "sedimentbottom",    "sediment_bottom",             "",               ""},
+  { /* 22 */ 0, "sedimentbottomta",  "sediment_bottom_ta",          "",               ""},
+  { /* 23 */ 0, "sedimentbottomtw",  "sediment_bottom_tw",          "",               ""},
+  { /* 24 */ 0, "mixlayer",          "mix_layer",                   "",               ""},
+  { /* 25 */ 0, "height",            "generalized_height",          "height",         ""},
+  { /* 26 */ 0, "character",         "area_type",                   "",               ""},
+  { /* 27 */ 0, "tropopause",        "tropopause",                  "",               ""},
+};
+// clang-format on
+
+enum
+{
+  CDI_NumZaxistype = sizeof(ZaxistypeEntry) / sizeof(ZaxistypeEntry[0]),
+};
+
+static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2);
+static void zaxisDestroyP(void *zaxisptr);
+static void zaxisPrintP(void *zaxisptr, FILE *fp);
+static int zaxisGetPackSize(void *zaxisptr, void *context);
+static void zaxisPack(void *zaxisptr, void *buffer, int size, int *pos, void *context);
+static int zaxisTxCode(void *zaxisptr);
+
+static const resOps zaxisOps
+    = { (int (*)(void *, void *)) zaxisCompareP, zaxisDestroyP, zaxisPrintP, zaxisGetPackSize, zaxisPack, zaxisTxCode };
+
+const resOps *
+getZaxisOps(void)
+{
+  return &zaxisOps;
+}
+
+void
+zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName, const char **outStdName,
+                        const char **outUnit)
+{
+  if (zaxisType < 0 || zaxisType >= CDI_NumZaxistype)
+    {
+      if (outPositive) *outPositive = 0;
+      if (outName) *outName = NULL;
+      if (outLongName) *outLongName = NULL;
+      if (outStdName) *outStdName = NULL;
+      if (outUnit) *outUnit = NULL;
+    }
+  else
+    {
+      if (outPositive) *outPositive = ZaxistypeEntry[zaxisType].positive;
+      if (outName) *outName = ZaxistypeEntry[zaxisType].name;
+      if (outLongName && zaxisType != ZAXIS_GENERIC) *outLongName = ZaxistypeEntry[zaxisType].longname;
+      if (outStdName) *outStdName = ZaxistypeEntry[zaxisType].stdname;
+      if (outUnit) *outUnit = ZaxistypeEntry[zaxisType].units;
+    }
+}
+
+zaxis_t *
+zaxis_to_pointer(int id)
+{
+  return (zaxis_t *) reshGetVal(id, &zaxisOps);
+}
+
+static void
+zaxis_init(zaxis_t *zaxisptr)
+{
+  zaxisptr->self = CDI_UNDEFID;
+  zaxisptr->vals = NULL;
+#ifndef USE_MPI
+  zaxisptr->cvals = NULL;
+  zaxisptr->clength = 0;
+#endif
+  zaxisptr->ubounds = NULL;
+  zaxisptr->lbounds = NULL;
+  zaxisptr->weights = NULL;
+  zaxisptr->type = CDI_UNDEFID;
+  zaxisptr->positive = 0;
+  zaxisptr->scalar = 0;
+  zaxisptr->direction = 0;
+  zaxisptr->size = 0;
+  zaxisptr->vctsize = 0;
+  zaxisptr->vct = NULL;
+
+  cdiInitKeys(&zaxisptr->keys);
+  zaxisptr->atts.nalloc = MAX_ATTRIBUTES;
+  zaxisptr->atts.nelems = 0;
+
+  cdiDefVarKeyInt(&zaxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64);
+}
+
+static zaxis_t *
+zaxisNewEntry(int id)
+{
+  zaxis_t *zaxisptr = (zaxis_t *) Malloc(sizeof(zaxis_t));
+  zaxis_init(zaxisptr);
+
+  if (id == CDI_UNDEFID)
+    zaxisptr->self = reshPut(zaxisptr, &zaxisOps);
+  else
+    {
+      zaxisptr->self = id;
+      reshReplace(id, zaxisptr, &zaxisOps);
+    }
+
+  return zaxisptr;
+}
+
+static void
+zaxisInit(void)
+{
+  static bool zaxisInitialized = false;
+  if (zaxisInitialized) return;
+  zaxisInitialized = true;
+}
+
+static void
+zaxis_copy(zaxis_t *zaxisptr2, zaxis_t *zaxisptr1)
+{
+  int zaxisID2 = zaxisptr2->self;
+  memcpy(zaxisptr2, zaxisptr1, sizeof(zaxis_t));
+  zaxisptr2->self = zaxisID2;
+  cdiInitKeys(&zaxisptr2->keys);
+  cdiCopyVarKeys(&zaxisptr1->keys, &zaxisptr2->keys);
+}
+
+unsigned
+cdiZaxisCount(void)
+{
+  return reshCountType(&zaxisOps);
+}
+
+static int
+zaxisCreate_(int zaxistype, int size, int id)
+{
+  zaxis_t *zaxisptr = zaxisNewEntry(id);
+
+  xassert(size >= 0);
+  zaxisptr->type = zaxistype;
+  zaxisptr->size = size;
+
+  int zaxisID = zaxisptr->self;
+
+  if (zaxistype >= 0 && zaxistype < CDI_NumZaxistype)
+    {
+      cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ZaxistypeEntry[zaxistype].name);
+      if (zaxistype != ZAXIS_GENERIC) zaxisDefLongname(zaxisID, ZaxistypeEntry[zaxistype].longname);
+      cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ZaxistypeEntry[zaxistype].units);
+
+      const char *stdname = ZaxistypeEntry[zaxistype].stdname;
+      if (*stdname) cdiDefVarKeyBytes(&zaxisptr->keys, CDI_KEY_STDNAME, (const unsigned char *) stdname, (int) strlen(stdname) + 1);
+
+      zaxisptr->positive = ZaxistypeEntry[zaxistype].positive;
+    }
+  else
+    {
+      Error("Internal problem! zaxistype=%d out of range (min=0/max=%d)!", zaxistype, CDI_NumZaxistype - 1);
+    }
+
+  return zaxisID;
+}
+
+/*
+@Function  zaxisCreate
+@Title     Create a vertical Z-axis
+
+@Prototype int zaxisCreate(int zaxistype, int size)
+@Parameter
+    @Item  zaxistype  The type of the Z-axis, one of the set of predefined CDI Z-axis types.
+                      The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE},
+                      @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT},
+                      @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA},
+                      @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE},
+                      @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW},
+                      @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA},
+                      @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER},
+                      @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}.
+    @Item  size       Number of levels.
+
+@Description
+The function @func{zaxisCreate} creates a vertical Z-axis.
+
+@Result
+@func{zaxisCreate} returns an identifier to the Z-axis.
+
+@Example
+Here is an example using @func{zaxisCreate} to create a pressure level Z-axis:
+
+@Source
+   ...
+#define  nlev    5
+   ...
+double levs[nlev] = {101300, 92500, 85000, 50000, 20000};
+int zaxisID;
+   ...
+zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev);
+zaxisDefLevels(zaxisID, levs);
+   ...
+@EndSource
+@EndFunction
+*/
+int
+zaxisCreate(int zaxistype, int size)
+{
+  if (CDI_Debug) Message("zaxistype: %d size: %d ", zaxistype, size);
+
+  xassert(size);
+  zaxisInit();
+
+  return zaxisCreate_(zaxistype, size, CDI_UNDEFID);
+}
+
+static void
+zaxisDestroyKernel(zaxis_t *zaxisptr)
+{
+  xassert(zaxisptr);
+
+  if (zaxisptr->vals) Free(zaxisptr->vals);
+#ifndef USE_MPI
+  if (zaxisptr->cvals)
+    {
+      for (int i = 0; i < zaxisptr->size; i++) Free(zaxisptr->cvals[i]);
+      Free(zaxisptr->cvals);
+    }
+#endif
+  if (zaxisptr->lbounds) Free(zaxisptr->lbounds);
+  if (zaxisptr->ubounds) Free(zaxisptr->ubounds);
+  if (zaxisptr->weights) Free(zaxisptr->weights);
+  if (zaxisptr->vct) Free(zaxisptr->vct);
+
+  int zaxisID = zaxisptr->self;
+  cdiDeleteKeys(zaxisID, CDI_GLOBAL);
+  cdiDeleteAtts(zaxisID, CDI_GLOBAL);
+
+  Free(zaxisptr);
+}
+
+/*
+@Function  zaxisDestroy
+@Title     Destroy a vertical Z-axis
+
+@Prototype void zaxisDestroy(int zaxisID)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+
+@EndFunction
+*/
+void
+zaxisDestroy(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  zaxisDestroyKernel(zaxisptr);
+  reshRemove(zaxisID, &zaxisOps);
+}
+
+static void
+zaxisDestroyP(void *zaxisptr)
+{
+  zaxisDestroyKernel((zaxis_t *) zaxisptr);
+}
+
+const char *
+zaxisNamePtr(int zaxistype)
+{
+  const char *name = (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) ? ZaxistypeEntry[zaxistype].longname
+                                                                      : ZaxistypeEntry[ZAXIS_GENERIC].longname;
+  return name;
+}
+
+void
+zaxisName(int zaxistype, char *zaxisname)
+{
+  strcpy(zaxisname, zaxisNamePtr(zaxistype));
+}
+
+// obsolete function
+void
+zaxisDefLtype(int zaxisID, int ltype)
+{
+  static bool printInfo = true;
+  if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt");
+
+  (void) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype);
+}
+
+/*
+@Function  zaxisDefName
+@Title     Define the name of a Z-axis
+
+@Prototype void zaxisDefName(int zaxisID, const char *name)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  name     Name of the Z-axis.
+
+@Description
+The function @func{zaxisDefName} defines the name of a Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefName(int zaxisID, const char *name)
+{
+  (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name);
+}
+
+/*
+@Function  zaxisDefLongname
+@Title     Define the longname of a Z-axis
+
+@Prototype void zaxisDefLongname(int zaxisID, const char *longname)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  longname Longname of the Z-axis.
+
+@Description
+The function @func{zaxisDefLongname} defines the longname of a Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefLongname(int zaxisID, const char *longname)
+{
+  (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname);
+}
+
+/*
+@Function  zaxisDefUnits
+@Title     Define the units of a Z-axis
+
+@Prototype void zaxisDefUnits(int zaxisID, const char *units)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  units    Units of the Z-axis.
+
+@Description
+The function @func{zaxisDefUnits} defines the units of a Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefUnits(int zaxisID, const char *units)
+{
+  (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units);
+}
+
+/*
+@Function  zaxisInqName
+@Title     Get the name of a Z-axis
+
+@Prototype void zaxisInqName(int zaxisID, char *name)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item  name     Name of the Z-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{zaxisInqName} returns the name of a Z-axis.
+
+@Result
+@func{zaxisInqName} returns the name of the Z-axis to the parameter name.
+
+@EndFunction
+*/
+void
+zaxisInqName(int zaxisID, char *name)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name, &length);
+}
+
+const char *
+zaxisInqNamePtr(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME);
+}
+
+/*
+@Function  zaxisInqLongname
+@Title     Get the longname of a Z-axis
+
+@Prototype void zaxisInqLongname(int zaxisID, char *longname)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item  longname Longname of the Z-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{zaxisInqLongname} returns the longname of a Z-axis.
+
+@Result
+@func{zaxisInqLongname} returns the longname of the Z-axis to the parameter longname.
+
+@EndFunction
+*/
+void
+zaxisInqLongname(int zaxisID, char *longname)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname, &length);
+}
+
+/*
+@Function  zaxisInqUnits
+@Title     Get the units of a Z-axis
+
+@Prototype void zaxisInqUnits(int zaxisID, char *units)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item  units    Units of the Z-axis. The caller must allocate space for the
+                    returned string. The maximum possible length, in characters, of
+                    the string is given by the predefined constant @func{CDI_MAX_NAME}.
+
+@Description
+The function @func{zaxisInqUnits} returns the units of a Z-axis.
+
+@Result
+@func{zaxisInqUnits} returns the units of the Z-axis to the parameter units.
+
+@EndFunction
+*/
+void
+zaxisInqUnits(int zaxisID, char *units)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length);
+}
+
+void
+zaxisInqStdname(int zaxisID, char *stdname)
+{
+  int length = CDI_MAX_NAME;
+  (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, stdname, &length);
+}
+
+void
+zaxisDefDatatype(int zaxisID, int datatype)
+{
+  cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype);
+}
+
+int
+zaxisInqDatatype(int zaxisID)
+{
+  int datatype = 0;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+  return datatype;
+}
+
+void
+zaxisDefPositive(int zaxisID, int positive)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  if (zaxisptr->positive != (unsigned) positive)
+    {
+      zaxisptr->positive = (unsigned) positive;
+      reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+int
+zaxisInqPositive(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return (int) zaxisptr->positive;
+}
+
+void
+zaxisDefScalar(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  zaxisptr->scalar = 1;
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+int
+zaxisInqScalar(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->scalar;
+}
+
+/*
+@Function  zaxisDefLevels
+@Title     Define the levels of a Z-axis
+
+@Prototype void zaxisDefLevels(int zaxisID, const double *levels)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  levels   All levels of the Z-axis.
+
+@Description
+The function @func{zaxisDefLevels} defines the levels of a Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefLevels(int zaxisID, const double *levels)
+{
+  if (levels)
+    {
+      zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+      const size_t size = (size_t) zaxisptr->size;
+      xassert(size);
+
+      if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc(size * sizeof(double));
+
+      double *vals = zaxisptr->vals;
+
+      for (size_t ilev = 0; ilev < size; ++ilev) vals[ilev] = levels[ilev];
+
+      reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+    }
+}
+
+void
+zaxisDefCvals(int zaxisID, const char **cvals, int clen)
+{
+#ifndef USE_MPI
+  if (cvals && clen)
+    {
+      zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+      const size_t size = (size_t) zaxisptr->size;
+      xassert(size);
+
+      zaxisptr->clength = clen;
+      if (size) zaxisptr->cvals = (char **) Malloc(size * sizeof(char *));
+
+      for (size_t ilev = 0; ilev < size; ++ilev)
+        {
+          zaxisptr->cvals[ilev] = (char *) Malloc(clen);
+          memcpy(zaxisptr->cvals[ilev], cvals[ilev], (size_t) clen);
+        }
+      reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+    }
+#else
+  (void) zaxisID;
+  (void) cvals;
+  (void) clen;
+  Error("This function was disabled!");
+#endif
+}
+
+/*
+@Function  zaxisDefLevel
+@Title     Define one level of a Z-axis
+
+@Prototype void zaxisDefLevel(int zaxisID, int levelID, double level)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  levelID  Level identifier.
+    @Item  level    Level.
+
+@Description
+The function @func{zaxisDefLevel} defines one level of a Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefLevel(int zaxisID, int levelID, double level)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  int size = zaxisptr->size;
+  xassert(size);
+  xassert(levelID >= 0 && levelID < size);
+
+  if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc((size_t) size * sizeof(double));
+
+  if (levelID >= 0 && levelID < size) zaxisptr->vals[levelID] = level;
+
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+void
+zaxisDefNlevRef(int zaxisID, int nlev)
+{
+  cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, nlev);
+}
+
+int
+zaxisInqNlevRef(int zaxisID)
+{
+  int nlev = 0;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev);
+  return nlev;
+}
+
+/*
+@Function  zaxisDefNumber
+@Title     Define the reference number for a generalized Z-axis
+
+@Prototype void zaxisDefNumber(int zaxisID, int number)
+@Parameter
+    @Item  zaxisID     Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  number      Reference number for a generalized Z-axis.
+
+@Description
+The function @func{zaxisDefNumber} defines the reference number for a generalized Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefNumber(int zaxisID, int number)
+{
+  cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, number);
+}
+
+/*
+@Function  zaxisInqNumber
+@Title     Get the reference number to a generalized Z-axis
+
+@Prototype int zaxisInqNumber(int zaxisID)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+
+@Description
+The function @func{zaxisInqNumber} returns the reference number to a generalized Z-axis.
+
+@Result
+@func{zaxisInqNumber} returns the reference number to a generalized Z-axis.
+@EndFunction
+*/
+int
+zaxisInqNumber(int zaxisID)
+{
+  int referenceNumber = 0;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &referenceNumber);
+  return referenceNumber;
+}
+
+/*
+@Function  zaxisDefUUID
+@Title     Define the UUID for a genralized Z-axis
+
+@Prototype void zaxisDefUUID(int zaxisID, const char *uuid)
+@Parameter
+    @Item  zaxisID     Z-axis ID, from a previous call to @fref{zaxisCreate}.
+    @Item  uuid        UUID for a generalized Z-axis.
+
+@Description
+The function @func{zaxisDefUUID} defines the UUID for a generalized  Z-axis.
+
+@EndFunction
+*/
+void
+zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE])
+{
+  cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE);
+
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+/*
+@Function  zaxisInqUUID
+@Title     Get the uuid to a generalized Z-axis
+
+@Prototype void zaxisInqUUID(int zaxisID, char *uuid)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item uuid A user supplied buffer of at least 16 bytes.
+
+@Description
+The function @func{zaxisInqUUID} returns the UUID to a generalized Z-axis.
+
+@Result
+@func{zaxisInqUUID} returns the UUID to a generalized Z-axis to the parameter uuid.
+@EndFunction
+*/
+void
+zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE])
+{
+  memset(uuid, 0, CDI_UUID_SIZE);
+  int length = CDI_UUID_SIZE;
+  cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length);
+}
+
+/*
+@Function  zaxisInqLevel
+@Title     Get one level of a Z-axis
+
+@Prototype double zaxisInqLevel(int zaxisID, int levelID)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item  levelID  Level index (range: 0 to nlevel-1).
+
+@Description
+The function @func{zaxisInqLevel} returns one level of a Z-axis.
+
+@Result
+@func{zaxisInqLevel} returns the level of a Z-axis.
+@EndFunction
+*/
+double
+zaxisInqLevel(int zaxisID, int levelID)
+{
+  double level = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->vals && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->vals[levelID];
+
+  return level;
+}
+
+double
+zaxisInqLbound(int zaxisID, int levelID)
+{
+  double level = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->lbounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->lbounds[levelID];
+
+  return level;
+}
+
+double
+zaxisInqUbound(int zaxisID, int levelID)
+{
+  double level = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->ubounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->ubounds[levelID];
+
+  return level;
+}
+
+const double *
+zaxisInqLevelsPtr(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->vals;
+}
+
+#ifndef USE_MPI
+char **
+zaxisInqCValsPtr(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->cvals;
+}
+#endif
+
+/*
+@Function  zaxisInqLevels
+@Title     Get all levels of a Z-axis
+
+@Prototype void zaxisInqLevels(int zaxisID, double *levels)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+    @Item  levels   Pointer to the location into which the levels are read.
+                    The caller must allocate space for the returned values.
+
+@Description
+The function @func{zaxisInqLevels} returns all levels of a Z-axis.
+
+@Result
+@func{zaxisInqLevels} saves all levels to the parameter @func{levels}.
+@EndFunction
+*/
+int
+zaxisInqLevels(int zaxisID, double *levels)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  int size = 0;
+  if (zaxisptr->vals)
+    {
+      size = zaxisptr->size;
+
+      if (levels)
+        for (int i = 0; i < size; i++) levels[i] = zaxisptr->vals[i];
+    }
+
+  return size;
+}
+
+int
+zaxisInqCLen(int zaxisID)
+{
+  int clen = 0;
+#ifndef USE_MPI
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->cvals && zaxisptr->clength) clen = zaxisptr->clength;
+#else
+  (void) zaxisID;
+#endif
+
+  return clen;
+}
+
+int
+zaxisInqCVals(int zaxisID, char ***clevels)
+{
+  int size = 0;
+#ifndef USE_MPI
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->cvals)
+    {
+      size = zaxisptr->size;
+      const size_t clen = zaxisptr->clength;
+      if (size && clen)
+        {
+          (*clevels) = (char **) Malloc(size * sizeof(char *));
+          for (int i = 0; i < size; i++)
+            {
+              (*clevels)[i] = (char *) Malloc(clen * sizeof(char));
+              memcpy((*clevels)[i], zaxisptr->cvals[i], clen * sizeof(char));
+            }
+        }
+    }
+#else
+  (void) zaxisID;
+  (void) clevels;
+#endif
+
+  return size;
+}
+
+int
+zaxisInqLbounds(int zaxisID, double *lbounds)
+{
+  int size = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->lbounds)
+    {
+      size = zaxisptr->size;
+
+      if (lbounds)
+        for (int i = 0; i < size; i++) lbounds[i] = zaxisptr->lbounds[i];
+    }
+
+  return size;
+}
+
+int
+zaxisInqUbounds(int zaxisID, double *ubounds)
+{
+  int size = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->ubounds)
+    {
+      size = zaxisptr->size;
+
+      if (ubounds)
+        for (int i = 0; i < size; i++) ubounds[i] = zaxisptr->ubounds[i];
+    }
+
+  return size;
+}
+
+int
+zaxisInqWeights(int zaxisID, double *weights)
+{
+  int size = 0;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->weights)
+    {
+      size = zaxisptr->size;
+
+      if (weights)
+        for (int i = 0; i < size; i++) weights[i] = zaxisptr->weights[i];
+    }
+
+  return size;
+}
+
+int
+zaxisInqLevelID(int zaxisID, double level)
+{
+  int levelID = CDI_UNDEFID;
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  if (zaxisptr->vals)
+    {
+      int size = zaxisptr->size;
+      for (int i = 0; i < size; i++)
+        if (fabs(level - zaxisptr->vals[i]) < DBL_EPSILON)
+          {
+            levelID = i;
+            break;
+          }
+    }
+
+  return levelID;
+}
+
+/*
+@Function  zaxisInqType
+@Title     Get the type of a Z-axis
+
+@Prototype int zaxisInqType(int zaxisID)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+
+@Description
+The function @func{zaxisInqType} returns the type of a Z-axis.
+
+@Result
+@func{zaxisInqType} returns the type of the Z-axis,
+one of the set of predefined CDI Z-axis types.
+The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE},
+@func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT},
+@func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA},
+@func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE},
+@func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW},
+@func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA},
+@func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER},
+@func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}.
+
+@EndFunction
+*/
+int
+zaxisInqType(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->type;
+}
+
+/*
+@Function  zaxisInqSize
+@Title     Get the size of a Z-axis
+
+@Prototype int zaxisInqSize(int zaxisID)
+@Parameter
+    @Item  zaxisID  Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}.
+
+@Description
+The function @func{zaxisInqSize} returns the size of a Z-axis.
+
+@Result
+@func{zaxisInqSize} returns the number of levels of a Z-axis.
+
+@EndFunction
+*/
+int
+zaxisInqSize(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->size;
+}
+
+void
+cdiCheckZaxis(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  if (zaxisInqType(zaxisID) == ZAXIS_GENERIC && zaxisptr->vals)
+    {
+      int size = zaxisptr->size;
+      if (size > 1)
+        {
+          /* check direction */
+          if (!zaxisptr->direction)
+            {
+              int ups = 0, downs = 0;
+              for (int i = 1; i < size; i++)
+                {
+                  ups += (zaxisptr->vals[i] > zaxisptr->vals[i - 1]);
+                  downs += (zaxisptr->vals[i] < zaxisptr->vals[i - 1]);
+                }
+              if (ups == size - 1)
+                {
+                  zaxisptr->direction = LevelUp;
+                }
+              else if (downs == size - 1)
+                {
+                  zaxisptr->direction = LevelDown;
+                }
+              else /* !zaxisptr->direction */
+                {
+                  Warning("Direction undefined for zaxisID %d", zaxisID);
+                }
+            }
+        }
+    }
+}
+
+void
+zaxisDefVct(int zaxisID, int size, const double *vct)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  if (zaxisptr->vct == 0 || zaxisptr->vctsize != size)
+    {
+      zaxisptr->vctsize = size;
+      zaxisptr->vct = (double *) Realloc(zaxisptr->vct, (size_t) size * sizeof(double));
+    }
+
+  if (vct) memcpy(zaxisptr->vct, vct, (size_t) size * sizeof(double));
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+void
+zaxisInqVct(int zaxisID, double *vct)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  memcpy(vct, zaxisptr->vct, (size_t) zaxisptr->vctsize * sizeof(double));
+}
+
+int
+zaxisInqVctSize(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->vctsize;
+}
+
+const double *
+zaxisInqVctPtr(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  return zaxisptr->vct;
+}
+
+void
+zaxisDefLbounds(int zaxisID, const double *lbounds)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  const size_t size = (size_t) zaxisptr->size;
+
+  if (CDI_Debug)
+    if (zaxisptr->lbounds) Warning("Lower bounds already defined for zaxisID = %d", zaxisID);
+
+  if (zaxisptr->lbounds == NULL) zaxisptr->lbounds = (double *) Malloc(size * sizeof(double));
+
+  if (lbounds) memcpy(zaxisptr->lbounds, lbounds, size * sizeof(double));
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+void
+zaxisDefUbounds(int zaxisID, const double *ubounds)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  const size_t size = (size_t) zaxisptr->size;
+
+  if (CDI_Debug)
+    if (zaxisptr->ubounds) Warning("Upper bounds already defined for zaxisID = %d", zaxisID);
+
+  if (zaxisptr->ubounds == NULL) zaxisptr->ubounds = (double *) Malloc(size * sizeof(double));
+
+  if (ubounds) memcpy(zaxisptr->ubounds, ubounds, size * sizeof(double));
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+void
+zaxisDefWeights(int zaxisID, const double *weights)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  const size_t size = (size_t) zaxisptr->size;
+
+  if (CDI_Debug)
+    if (zaxisptr->weights != NULL) Warning("Weights already defined for zaxisID = %d", zaxisID);
+
+  if (zaxisptr->weights == NULL) zaxisptr->weights = (double *) Malloc(size * sizeof(double));
+
+  memcpy(zaxisptr->weights, weights, size * sizeof(double));
+  reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE);
+}
+
+void
+zaxisChangeType(int zaxisID, int zaxistype)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+  zaxisptr->type = zaxistype;
+}
+
+void
+zaxisResize(int zaxisID, int size)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  xassert(size >= 0);
+
+  zaxisptr->size = size;
+
+  if (zaxisptr->vals) zaxisptr->vals = (double *) Realloc(zaxisptr->vals, (size_t) size * sizeof(double));
+}
+
+static inline void
+zaxisCopyKeyStr(zaxis_t *zaxisptr1, zaxis_t *zaxisptr2, int key)
+{
+  cdi_key_t *keyp = find_key(&zaxisptr1->keys, key);
+  if (keyp && keyp->type == KEY_BYTES)
+    cdiDefVarKeyBytes(&zaxisptr2->keys, key, (const unsigned char *) keyp->v.s, (int) keyp->length);
+}
+
+int
+zaxisDuplicate(int zaxisID)
+{
+  zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID);
+
+  int zaxistype = zaxisInqType(zaxisID);
+  int zaxissize = zaxisInqSize(zaxisID);
+
+  int zaxisIDnew = zaxisCreate(zaxistype, zaxissize);
+  zaxis_t *zaxisptrnew = zaxis_to_pointer(zaxisIDnew);
+
+  zaxis_copy(zaxisptrnew, zaxisptr);
+
+  zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_NAME);
+  zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_LONGNAME);
+  zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_UNITS);
+
+  if (zaxisptr->vals)
+    {
+      const size_t size = (size_t) zaxissize;
+      zaxisptrnew->vals = (double *) Malloc(size * sizeof(double));
+      memcpy(zaxisptrnew->vals, zaxisptr->vals, size * sizeof(double));
+    }
+
+  if (zaxisptr->lbounds)
+    {
+      const size_t size = (size_t) zaxissize;
+      zaxisptrnew->lbounds = (double *) Malloc(size * sizeof(double));
+      memcpy(zaxisptrnew->lbounds, zaxisptr->lbounds, size * sizeof(double));
+    }
+
+  if (zaxisptr->ubounds)
+    {
+      const size_t size = (size_t) zaxissize;
+      zaxisptrnew->ubounds = (double *) Malloc(size * sizeof(double));
+      memcpy(zaxisptrnew->ubounds, zaxisptr->ubounds, size * sizeof(double));
+    }
+
+  if (zaxisptr->vct)
+    {
+      const size_t size = (size_t) zaxisptr->vctsize;
+      if (size)
+        {
+          zaxisptrnew->vctsize = (int) size;
+          zaxisptrnew->vct = (double *) Malloc(size * sizeof(double));
+          memcpy(zaxisptrnew->vct, zaxisptr->vct, size * sizeof(double));
+        }
+    }
+
+  zaxisptrnew->atts.nelems = 0;
+  cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisIDnew, CDI_GLOBAL);
+
+  return zaxisIDnew;
+}
+
+static void
+zaxisPrintKernel(zaxis_t *zaxisptr, FILE *fp)
+{
+  xassert(zaxisptr);
+
+  int zaxisID = zaxisptr->self;
+  int datatype = CDI_UNDEFID;
+  cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype);
+
+  int type = zaxisptr->type;
+  int nlevels = zaxisptr->size;
+
+  int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7;
+
+  fprintf(fp, "zaxistype = %s\n", zaxisNamePtr(type));
+  fprintf(fp, "size      = %d\n", nlevels);
+  if (nlevels == 1)
+    {
+      const bool zscalar = (bool) zaxisptr->scalar;
+      if (zscalar) fprintf(fp, "scalar    = true\n");
+    }
+
+  const char *string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME);
+  if (string[0]) fprintf(fp, "name      = %s\n", string);
+  string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_LONGNAME);
+  if (string[0]) fprintf(fp, "longname  = %s\n", string);
+  string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_UNITS);
+  if (string[0]) fprintf(fp, "units     = %s\n", string);
+
+  if (zaxisptr->vals)
+    {
+      int nbyte0 = fprintf(fp, "levels    = ");
+      int nbyte = nbyte0;
+      for (int levelID = 0; levelID < nlevels; levelID++)
+        {
+          if (nbyte > 80)
+            {
+              fprintf(fp, "\n");
+              fprintf(fp, "%*s", nbyte0, "");
+              nbyte = nbyte0;
+            }
+          nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->vals[levelID]);
+        }
+      fprintf(fp, "\n");
+    }
+
+  if (zaxisptr->lbounds && zaxisptr->ubounds)
+    {
+      int nbyte0 = fprintf(fp, "lbounds   = ");
+      int nbyte = nbyte0;
+      for (int levelID = 0; levelID < nlevels; levelID++)
+        {
+          if (nbyte > 80)
+            {
+              fprintf(fp, "\n");
+              fprintf(fp, "%*s", nbyte0, "");
+              nbyte = nbyte0;
+            }
+          nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->lbounds[levelID]);
+        }
+      fprintf(fp, "\n");
+
+      nbyte0 = fprintf(fp, "ubounds   = ");
+      nbyte = nbyte0;
+      for (int levelID = 0; levelID < nlevels; levelID++)
+        {
+          if (nbyte > 80)
+            {
+              fprintf(fp, "\n");
+              fprintf(fp, "%*s", nbyte0, "");
+              nbyte = nbyte0;
+            }
+          nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->ubounds[levelID]);
+        }
+      fprintf(fp, "\n");
+    }
+
+  if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF)
+    {
+      int vctsize = zaxisptr->vctsize;
+      const double *vct = zaxisptr->vct;
+      fprintf(fp, "vctsize   = %d\n", vctsize);
+      if (vctsize)
+        {
+          int nbyte0 = fprintf(fp, "vct       = ");
+          int nbyte = nbyte0;
+          for (int i = 0; i < vctsize; i++)
+            {
+              if (nbyte > 70 || i == vctsize / 2)
+                {
+                  fprintf(fp, "\n%*s", nbyte0, "");
+                  nbyte = nbyte0;
+                }
+              nbyte += fprintf(fp, "%.15g ", vct[i]);
+            }
+          fprintf(fp, "\n");
+        }
+    }
+}
+
+static void
+zaxisPrintP(void *voidptr, FILE *fp)
+{
+  zaxis_t *zaxisptr = (zaxis_t *) voidptr;
+
+  xassert(zaxisptr);
+
+  zaxisPrintKernel(zaxisptr, fp);
+}
+
+static int
+zaxisCompareP(zaxis_t *z1, zaxis_t *z2)
+{
+  enum
+  {
+    differ = 1
+  };
+  int diff = 0;
+  xassert(z1 && z2);
+
+  diff |= (z1->type != z2->type)
+          | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE)
+             != cdiInqVarKeyInt(&z2->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE))
+          | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&z2->keys, CDI_KEY_DATATYPE))
+          | (z1->direction != z2->direction) | (z1->size != z2->size) | (z1->vctsize != z2->vctsize)
+          | (z1->positive != z2->positive);
+
+  if (diff) return differ;
+
+  int size = z1->size;
+  int anyPresent = 0;
+  int present = (z1->vals != NULL);
+  diff |= (present ^ (z2->vals != NULL));
+  anyPresent |= present;
+  if (!diff && present)
+    {
+      const double *p = z1->vals, *q = z2->vals;
+      for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]);
+    }
+
+  present = (z1->lbounds != NULL);
+  diff |= (present ^ (z2->lbounds != NULL));
+  anyPresent |= present;
+  if (!diff && present)
+    {
+      const double *p = z1->lbounds, *q = z2->lbounds;
+      for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]);
+    }
+
+  present = (z1->ubounds != NULL);
+  diff |= (present ^ (z2->ubounds != NULL));
+  anyPresent |= present;
+  if (!diff && present)
+    {
+      const double *p = z1->ubounds, *q = z2->ubounds;
+      for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]);
+    }
+
+  present = (z1->weights != NULL);
+  diff |= (present ^ (z2->weights != NULL));
+  anyPresent |= present;
+  if (!diff && present)
+    {
+      const double *p = z1->weights, *q = z2->weights;
+      for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]);
+    }
+
+  present = (z1->vct != NULL);
+  diff |= (present ^ (z2->vct != NULL));
+  if (!diff && present)
+    {
+      int vctsize = z1->vctsize;
+      xassert(vctsize);
+      const double *p = z1->vct, *q = z2->vct;
+      for (int i = 0; i < vctsize; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]);
+    }
+
+  if (anyPresent) xassert(size);
+
+  diff |= strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_NAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_NAME))
+          | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_LONGNAME))
+          | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_STDNAME))
+          | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_UNITS), cdiInqVarKeyString(&z2->keys, CDI_KEY_UNITS));
+
+  return diff != 0;
+}
+
+static int
+zaxisTxCode(void *zaxisPtr)
+{
+  (void) zaxisPtr;
+  return ZAXIS;
+}
+
+enum
+{
+  ZAXIS_PACK_INT_SELF,
+  ZAXIS_PACK_INT_TYPE,
+  ZAXIS_PACK_INT_SIZE,
+  ZAXIS_PACK_INT_DIRECTION,
+  ZAXIS_PACK_INT_VCTSIZE,
+  ZAXIS_PACK_INT_MEMBERMASK,
+  zaxisNint
+};
+
+enum
+{
+  vals = 1 << 0,
+  lbounds = 1 << 1,
+  ubounds = 1 << 2,
+  weights = 1 << 3,
+  vct = 1 << 4,
+};
+
+static int
+zaxisGetMemberMask(zaxis_t *zaxisP)
+{
+  int memberMask = 0;
+
+  if (zaxisP->vals) memberMask |= vals;
+  if (zaxisP->lbounds) memberMask |= lbounds;
+  if (zaxisP->ubounds) memberMask |= ubounds;
+  if (zaxisP->weights) memberMask |= weights;
+  if (zaxisP->vct) memberMask |= vct;
+
+  return memberMask;
+}
+
+static int
+zaxisGetPackSize(void *voidP, void *context)
+{
+  zaxis_t *zaxisP = (zaxis_t *) voidP;
+  int packBufferSize = serializeGetSize(zaxisNint, CDI_DATATYPE_INT, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  if (zaxisP->vals || zaxisP->lbounds || zaxisP->ubounds || zaxisP->weights) xassert(zaxisP->size);
+
+  if (zaxisP->vals)
+    packBufferSize
+        += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  if (zaxisP->lbounds)
+    packBufferSize
+        += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  if (zaxisP->ubounds)
+    packBufferSize
+        += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  if (zaxisP->weights)
+    packBufferSize
+        += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+
+  if (zaxisP->vct)
+    {
+      xassert(zaxisP->vctsize);
+      packBufferSize
+          += serializeGetSize(zaxisP->vctsize, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context);
+    }
+
+  packBufferSize += serializeKeysGetPackSize(&zaxisP->keys, context);
+
+  packBufferSize += serializeGetSize(1, CDI_DATATYPE_UINT, context);
+
+  return packBufferSize;
+}
+
+int
+zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id)
+{
+  int intBuffer[zaxisNint], memberMask;
+  uint32_t d;
+
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, zaxisNint, CDI_DATATYPE_INT, context);
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+
+  xassert(cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer) == d);
+
+  zaxisInit();
+
+  zaxis_t *zaxisP = zaxisNewEntry(force_id ? namespaceAdaptKey(intBuffer[ZAXIS_PACK_INT_SELF], originNamespace) : CDI_UNDEFID);
+
+  zaxisP->type = intBuffer[ZAXIS_PACK_INT_TYPE];
+  zaxisP->size = intBuffer[ZAXIS_PACK_INT_SIZE];
+  zaxisP->direction = intBuffer[ZAXIS_PACK_INT_DIRECTION];
+  zaxisP->vctsize = intBuffer[ZAXIS_PACK_INT_VCTSIZE];
+  memberMask = intBuffer[ZAXIS_PACK_INT_MEMBERMASK];
+
+  if (memberMask & vals)
+    {
+      int size = zaxisP->size;
+      xassert(size >= 0);
+
+      zaxisP->vals = (double *) Malloc((size_t) size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vals, size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->vals) == d);
+    }
+
+  if (memberMask & lbounds)
+    {
+      int size = zaxisP->size;
+      xassert(size >= 0);
+
+      zaxisP->lbounds = (double *) Malloc((size_t) size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->lbounds, size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->lbounds) == d);
+    }
+
+  if (memberMask & ubounds)
+    {
+      int size = zaxisP->size;
+      xassert(size >= 0);
+
+      zaxisP->ubounds = (double *) Malloc((size_t) size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->ubounds, size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->ubounds) == d);
+    }
+
+  if (memberMask & weights)
+    {
+      int size = zaxisP->size;
+      xassert(size >= 0);
+
+      zaxisP->weights = (double *) Malloc((size_t) size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->weights, size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->weights) == d);
+    }
+
+  if (memberMask & vct)
+    {
+      int size = zaxisP->vctsize;
+      xassert(size >= 0);
+
+      zaxisP->vct = (double *) Malloc((size_t) size * sizeof(double));
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vct, size, CDI_DATATYPE_FLT64, context);
+      serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context);
+      xassert(cdiCheckSum(CDI_DATATYPE_FLT64, size, zaxisP->vct) == d);
+    }
+
+  serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->keys, context);
+
+  serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->positive, 1, CDI_DATATYPE_UINT, context);
+
+  reshSetStatus(zaxisP->self, &zaxisOps, reshGetStatus(zaxisP->self, &zaxisOps) & ~RESH_SYNC_BIT);
+  return zaxisP->self;
+}
+
+static void
+zaxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context)
+{
+  zaxis_t *zaxisP = (zaxis_t *) voidP;
+  int intBuffer[zaxisNint];
+  int memberMask;
+  uint32_t d;
+
+  intBuffer[ZAXIS_PACK_INT_SELF] = zaxisP->self;
+  intBuffer[ZAXIS_PACK_INT_TYPE] = zaxisP->type;
+  intBuffer[ZAXIS_PACK_INT_SIZE] = zaxisP->size;
+  intBuffer[ZAXIS_PACK_INT_DIRECTION] = zaxisP->direction;
+  intBuffer[ZAXIS_PACK_INT_VCTSIZE] = zaxisP->vctsize;
+  intBuffer[ZAXIS_PACK_INT_MEMBERMASK] = memberMask = zaxisGetMemberMask(zaxisP);
+
+  serializePack(intBuffer, zaxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context);
+  d = cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer);
+  serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+
+  if (memberMask & vals)
+    {
+      xassert(zaxisP->size);
+      serializePack(zaxisP->vals, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->vals);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & lbounds)
+    {
+      xassert(zaxisP->size);
+      serializePack(zaxisP->lbounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->lbounds);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & ubounds)
+    {
+      xassert(zaxisP->size);
+
+      serializePack(zaxisP->ubounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->ubounds);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & weights)
+    {
+      xassert(zaxisP->size);
+
+      serializePack(zaxisP->weights, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->weights);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  if (memberMask & vct)
+    {
+      xassert(zaxisP->vctsize);
+
+      serializePack(zaxisP->vct, zaxisP->vctsize, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context);
+      d = cdiCheckSum(CDI_DATATYPE_FLT64, zaxisP->vctsize, zaxisP->vct);
+      serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context);
+    }
+
+  serializeKeysPack(&zaxisP->keys, packBuffer, packBufferSize, packBufferPos, context);
+
+  serializePack(&zaxisP->positive, 1, CDI_DATATYPE_UINT, packBuffer, packBufferSize, packBufferPos, context);
+}
+
+void
+cdiZaxisGetIndexList(unsigned nzaxis, int *zaxisResHs)
+{
+  reshGetResHListOfType(nzaxis, zaxisResHs, &zaxisOps);
+}
+
+/*
+ * Local Variables:
+ * c-file-style: "Java"
+ * c-basic-offset: 2
+ * indent-tabs-mode: nil
+ * show-trailing-whitespace: t
+ * require-trailing-newline: t
+ * End:
+ */
+
+
+
+
+
+
+
+
+static const char cdi_libvers[] = "2.4.3";
+
+
+
+
+const char *
+cdiLibraryVersion(void)
+{
+  return cdi_libvers;
+}
+#if defined (HAVE_CF_INTERFACE)
+#undef realloc
+#undef malloc
+#undef calloc
+#undef free
+#undef DOUBLE_PRECISION
+/* cfortran.h  4.4 */
+/* http://www-zeus.desy.de/~burow/cfortran/                   */
+/* Burkhard Burow  burow@desy.de                 1990 - 2002. */
+
+#ifndef __CFORTRAN_LOADED
+#define __CFORTRAN_LOADED
+
+// clang-format off
+
+/* 
+   THIS FILE IS PROPERTY OF BURKHARD BUROW. IF YOU ARE USING THIS FILE YOU
+   SHOULD ALSO HAVE ACCESS TO CFORTRAN.DOC WHICH PROVIDES TERMS FOR USING,
+   MODIFYING, COPYING AND DISTRIBUTING THE CFORTRAN.H PACKAGE.
+*/
+
+/* THIS PACKAGE, I.E. CFORTRAN.H, THIS DOCUMENT, AND THE CFORTRAN.H EXAMPLE
+PROGRAMS ARE PROPERTY OF THE AUTHOR WHO RESERVES ALL RIGHTS. THIS PACKAGE AND
+THE CODE IT PRODUCES MAY BE FREELY DISTRIBUTED WITHOUT FEES, SUBJECT
+(AT YOUR CHOICE) EITHER TO THE GNU LIBRARY GENERAL PUBLIC LICENSE
+AT http://www.gnu.org/licenses/lgpl.html OR TO THE FOLLOWING RESTRICTIONS:
+- YOU MUST ACCOMPANY ANY COPIES OR DISTRIBUTION WITH THIS (UNALTERED) NOTICE.
+- YOU MAY NOT RECEIVE MONEY FOR THE DISTRIBUTION OR FOR ITS MEDIA 
+  (E.G. TAPE, DISK, COMPUTER, PAPER.)
+- YOU MAY NOT PREVENT OTHERS FROM COPYING IT FREELY.
+- YOU MAY NOT DISTRIBUTE MODIFIED VERSIONS WITHOUT CLEARLY DOCUMENTING YOUR
+  CHANGES AND NOTIFYING THE AUTHOR.
+- YOU MAY NOT MISREPRESENTED THE ORIGIN OF THIS SOFTWARE, EITHER BY EXPLICIT
+  CLAIM OR BY OMISSION.
+
+THE INTENT OF THE ABOVE TERMS IS TO ENSURE THAT THE CFORTRAN.H PACKAGE NOT BE
+USED FOR PROFIT MAKING ACTIVITIES UNLESS SOME ROYALTY ARRANGEMENT IS ENTERED
+INTO WITH ITS AUTHOR.
+              
+THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST
+OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE AUTHOR IS NOT RESPONSIBLE
+FOR ANY SUPPORT OR SERVICE OF THE CFORTRAN.H PACKAGE.
+
+                                              Burkhard Burow 
+                                              burow@desy.de
+*/
+
+/* The following modifications were made by the authors of CFITSIO or by me. 
+ * They are flagged below with CFITSIO, the author's initials, or KMCCARTY.
+ * PDW = Peter Wilson
+ * DM  = Doug Mink
+ * LEB = Lee E Brotzman
+ * MR  = Martin Reinecke
+ * WDP = William D Pence
+ * BR  = Bastien ROUCARIES
+ * -- Kevin McCarty, for Debian (19 Dec. 2005) */
+
+/*******
+   Modifications:
+      Oct 1997: Changed symbol name extname to appendus (PDW/HSTX)
+                (Conflicted with a common variable name in FTOOLS)
+      Nov 1997: If g77Fortran defined, also define f2cFortran (PDW/HSTX)
+      Feb 1998: Let VMS see the NUM_ELEMS code. Lets programs treat
+                single strings as vectors with single elements
+      Nov 1999: If macintoxh defined, also define f2cfortran (for Mac OS-X)
+      Apr 2000: If WIN32 defined, also define PowerStationFortran and
+                VISUAL_CPLUSPLUS (Visual C++)
+      Jun 2000: If __GNUC__ and linux defined, also define f2cFortran
+                (linux/gcc environment detection)
+      Apr 2002: If __CYGWIN__ is defined, also define f2cFortran
+      Nov 2002: If __APPLE__ defined, also define f2cfortran (for Mac OS-X)
+
+      Nov 2003: If __INTEL_COMPILER or INTEL_COMPILER defined, also define
+                f2cFortran (KMCCARTY)
+      Dec 2005: If f2cFortran is defined, enforce REAL functions in FORTRAN
+                returning "double" in C.  This was one of the items on
+		Burkhard's TODO list. (KMCCARTY)
+      Dec 2005: Modifications to support 8-byte integers. (MR)
+		USE AT YOUR OWN RISK!
+      Feb 2006  Added logic to typedef the symbol 'LONGLONG' to an appropriate
+                intrinsic 8-byte integer datatype  (WDP)
+      Apr 2006: Modifications to support gfortran (and g77 with -fno-f2c flag)
+                since by default it returns "float" for FORTRAN REAL function.
+                (KMCCARTY)
+      May 2008: Revert commenting out of "extern" in COMMON_BLOCK_DEF macro.
+		Add braces around do-nothing ";" in 3 empty while blocks to
+		get rid of compiler warnings.  Thanks to ROOT developers
+		Jacek Holeczek and Rene Brun for these suggestions. (KMCCARTY)
+      Aug 2008: If __GNUC__ is defined and no FORTRAN compiler is specified
+		via a #define or -D, default to gfortran behavior rather than
+		g77 behavior. (KMCCARTY)
+      Oct 2009: Add warning if guessing default fortran. Move g77 above guessing bloc
+ *******/
+
+/* 
+  Avoid symbols already used by compilers and system *.h:
+  __ - OSF1 zukal06 V3.0 347 alpha, cc -c -std1 cfortest.c
+
+*/
+
+/* 
+   Determine what 8-byte integer data type is available.
+  'long long' is now supported by most compilers, but older
+  MS Visual C++ compilers before V7.0 use '__int64' instead. (WDP)
+*/
+
+#ifndef LONGLONG_TYPE   /* this may have been previously defined */
+#if defined(_MSC_VER)   /* Microsoft Visual C++ */
+
+#if (_MSC_VER < 1300)   /* versions earlier than V7.0 do not have 'long long' */
+    typedef __int64 LONGLONG;
+#else                   /* newer versions do support 'long long' */
+    typedef long long LONGLONG; 
+#endif
+
+#else
+    typedef long long LONGLONG; 
+#endif
+
+#define LONGLONG_TYPE
+#endif  
+
+
+/* First prepare for the C compiler. */
+
+#ifndef ANSI_C_preprocessor /* i.e. user can override. */
+#ifdef __CF__KnR
+#define ANSI_C_preprocessor 0
+#else
+#ifdef __STDC__
+#define ANSI_C_preprocessor 1
+#else
+#define _cfleft             1
+#define _cfright 
+#define _cfleft_cfright     0
+#define ANSI_C_preprocessor _cfleft/**/_cfright
+#endif
+#endif
+#endif
+
+#if ANSI_C_preprocessor
+#define _0(A,B)   A##B
+#define  _(A,B)   _0(A,B)  /* see cat,xcat of K&R ANSI C p. 231 */
+#define _2(A,B)   A##B     /* K&R ANSI C p.230: .. identifier is not replaced */
+#define _3(A,B,C) _(A,_(B,C))
+#else                      /* if it turns up again during rescanning.         */
+#define  _(A,B)   A/**/B
+#define _2(A,B)   A/**/B
+#define _3(A,B,C) A/**/B/**/C
+#endif
+
+#if (defined(vax)&&defined(unix)) || (defined(__vax__)&&defined(__unix__))
+#define VAXUltrix
+#endif
+
+#include <stdio.h>     /* NULL [in all machines stdio.h]                      */
+#include <string.h>    /* strlen, memset, memcpy, memchr.                     */
+#if !( defined(VAXUltrix) || defined(sun) || (defined(apollo)&&!defined(__STDCPP__)) )
+#include <stdlib.h>    /* malloc,free                                         */
+#else
+#include <malloc.h>    /* Had to be removed for DomainOS h105 10.4 sys5.3 425t*/
+#ifdef apollo
+#define __CF__APOLLO67 /* __STDCPP__ is in Apollo 6.8 (i.e. ANSI) and onwards */
+#endif
+#endif
+
+#if !defined(__GNUC__) && !defined(__sun) && (defined(sun)||defined(VAXUltrix)||defined(lynx))
+#define __CF__KnR     /* Sun, LynxOS and VAX Ultrix cc only supports K&R.     */
+                      /* Manually define __CF__KnR for HP if desired/required.*/
+#endif                /*       i.e. We will generate Kernighan and Ritchie C. */
+/* Note that you may define __CF__KnR before #include cfortran.h, in order to
+generate K&R C instead of the default ANSI C. The differences are mainly in the
+function prototypes and declarations. All machines, except the Apollo, work
+with either style. The Apollo's argument promotion rules require ANSI or use of
+the obsolete std_$call which we have not implemented here. Hence on the Apollo,
+only C calling FORTRAN subroutines will work using K&R style.*/
+
+
+/* Remainder of cfortran.h depends on the Fortran compiler. */
+
+/* 11/29/2003 (KMCCARTY): add *INTEL_COMPILER symbols here */
+/* 04/05/2006 (KMCCARTY): add gFortran symbol here */
+#if defined(CLIPPERFortran) || defined(pgiFortran) || defined(__INTEL_COMPILER) || defined(INTEL_COMPILER) || defined(gFortran)
+#define f2cFortran
+#endif
+
+#if defined(g77Fortran)                        /* 11/03/97 PDW (CFITSIO) */
+#define f2cFortran
+#endif
+
+/* VAX/VMS does not let us \-split long #if lines. */ 
+/* Split #if into 2 because some HP-UX can't handle long #if */
+#if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran))
+#if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran))
+/* If no Fortran compiler is given, we choose one for the machines we know.   */
+#if defined(__GNUC__) || defined(WIN32) /* 10/2009 BR: warm if guess */
+#warning "Please specify the fortran compiler using -D flags. Try to guess the compiler used"
+#endif
+#if defined(lynx) || defined(VAXUltrix)
+#define f2cFortran    /* Lynx:      Only support f2c at the moment.
+                         VAXUltrix: f77 behaves like f2c.
+                           Support f2c or f77 with gcc, vcc with f2c. 
+                           f77 with vcc works, missing link magic for f77 I/O.*/
+#endif
+/* 04/13/00 DM (CFITSIO): Add these lines for NT */
+/*   with PowerStationFortran and and Visual C++ */
+#if defined(WIN32) && !defined(__CYGWIN__)
+#define PowerStationFortran   
+#define VISUAL_CPLUSPLUS
+#endif
+#if        defined(__CYGWIN__)                 /* 04/11/02 LEB (CFITSIO) */
+#define       f2cFortran 
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if        defined(__GNUC__) && defined(linux) /* 06/21/00 PDW (CFITSIO) */
+#define       f2cFortran 
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(macintosh)                         /* 11/1999 (CFITSIO) */
+#define f2cFortran
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(__APPLE__)                         /* 11/2002 (CFITSIO) */
+#define f2cFortran
+#define	      gFortran /* 8/26/08 (KMCCARTY) */
+#endif
+#if defined(__hpux)             /* 921107: Use __hpux instead of __hp9000s300 */
+#define       hpuxFortran       /*         Should also allow hp9000s7/800 use.*/
+#endif
+#if       defined(apollo)
+#define           apolloFortran /* __CF__APOLLO67 also defines some behavior. */
+#endif
+#if          defined(sun) || defined(__sun) 
+#define              sunFortran
+#endif
+#if       defined(_IBMR2)
+#define            IBMR2Fortran
+#endif
+#if        defined(_CRAY)
+#define             CRAYFortran /*       _CRAYT3E also defines some behavior. */
+#endif
+#if        defined(_SX)
+#define               SXFortran
+#endif
+#if        defined(__NEC__)
+#define               SXFortran
+#endif
+#if         defined(mips) || defined(__mips)
+#define             mipsFortran
+#endif
+#if          defined(vms) || defined(__vms)
+#define              vmsFortran
+#endif
+#if      defined(__alpha) && defined(__unix__)
+#define              DECFortran
+#endif
+#if   defined(__convex__)
+#define           CONVEXFortran
+#endif
+#if   defined(VISUAL_CPLUSPLUS)
+#define     PowerStationFortran
+#endif
+#endif /* ...Fortran */
+#endif /* ...Fortran */
+
+/* Split #if into 2 because some HP-UX can't handle long #if */
+#if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran))
+#if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran))
+/* If your compiler barfs on ' #error', replace # with the trigraph for #     */
+ #error "cfortran.h:  Can't find your environment among:\
+    - GNU gcc (gfortran) on Linux.                                       \
+    - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...)     \
+    - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000     \
+    - VAX   VMS CC 3.1 and FORTRAN 5.4.                                  \
+    - Alpha VMS DEC C 1.3 and DEC FORTRAN 6.0.                           \
+    - Alpha OSF DEC C and DEC Fortran for OSF/1 AXP Version 1.2          \
+    - Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7.            \
+    - CRAY                                                               \
+    - NEC SX-4 SUPER-UX                                                  \
+    - CONVEX                                                             \
+    - Sun                                                                \
+    - PowerStation Fortran with Visual C++                               \
+    - HP9000s300/s700/s800 Latest test with: HP-UX A.08.07 A 9000/730    \
+    - LynxOS: cc or gcc with f2c.                                        \
+    - VAXUltrix: vcc,cc or gcc with f2c. gcc or cc with f77.             \
+    -            f77 with vcc works; but missing link magic for f77 I/O. \
+    -            NO fort. None of gcc, cc or vcc generate required names.\
+    - f2c/g77:   Use #define    f2cFortran, or cc -Df2cFortran           \
+    - gfortran:  Use #define    gFortran,   or cc -DgFortran             \
+                 (also necessary for g77 with -fno-f2c option)           \
+    - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran          \
+    - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran \
+    - Absoft Pro Fortran: Use #define AbsoftProFortran \
+    - Portland Group Fortran: Use #define pgiFortran \
+    - Intel Fortran: Use #define INTEL_COMPILER"
+/* Compiler must throw us out at this point! */
+#endif
+#endif
+
+
+#if defined(VAXC) && !defined(__VAXC)
+#define OLD_VAXC
+#pragma nostandard                       /* Prevent %CC-I-PARAMNOTUSED.       */
+#endif
+
+/* Throughout cfortran.h we use: UN = Uppercase Name.  LN = Lowercase Name.   */
+
+/* "extname" changed to "appendus" below (CFITSIO) */
+#if defined(f2cFortran) || defined(NAGf90Fortran) || defined(DECFortran) || defined(mipsFortran) || defined(apolloFortran) || defined(sunFortran) || defined(CONVEXFortran) || defined(SXFortran) || defined(appendus)
+#define CFC_(UN,LN)            _(LN,_)      /* Lowercase FORTRAN symbols.     */
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)
+#else 
+#if defined(CRAYFortran) || defined(PowerStationFortran) || defined(AbsoftProFortran)
+#ifdef _CRAY          /* (UN), not UN, circumvents CRAY preprocessor bug.     */
+#define CFC_(UN,LN)            (UN)         /* Uppercase FORTRAN symbols.     */
+#else                 /* At least VISUAL_CPLUSPLUS barfs on (UN), so need UN. */
+#define CFC_(UN,LN)            UN           /* Uppercase FORTRAN symbols.     */
+#endif
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)  /* CRAY insists on arg.'s here.   */
+#else  /* For following machines one may wish to change the fcallsc default.  */
+#define CF_SAME_NAMESPACE
+#ifdef vmsFortran
+#define CFC_(UN,LN)            LN           /* Either case FORTRAN symbols.   */
+     /* BUT we usually use UN for C macro to FORTRAN routines, so use LN here,*/
+     /* because VAX/VMS doesn't do recursive macros.                          */
+#define orig_fcallsc(UN,LN)    UN
+#else      /* HP-UX without +ppu or IBMR2 without -qextname. NOT reccomended. */
+#define CFC_(UN,LN)            LN           /* Lowercase FORTRAN symbols.     */
+#define orig_fcallsc(UN,LN)    CFC_(UN,LN)
+#endif /*  vmsFortran */
+#endif /* CRAYFortran PowerStationFortran */
+#endif /* ....Fortran */
+
+#define fcallsc(UN,LN)               orig_fcallsc(UN,LN)
+#define preface_fcallsc(P,p,UN,LN)   CFC_(_(P,UN),_(p,LN))
+#define  append_fcallsc(P,p,UN,LN)   CFC_(_(UN,P),_(LN,p))
+
+#define C_FUNCTION(UN,LN)            fcallsc(UN,LN)      
+#define FORTRAN_FUNCTION(UN,LN)      CFC_(UN,LN)
+
+#ifndef COMMON_BLOCK
+#ifndef CONVEXFortran
+#ifndef CLIPPERFortran
+#if     !(defined(AbsoftUNIXFortran)||defined(AbsoftProFortran))
+#define COMMON_BLOCK(UN,LN)          CFC_(UN,LN)
+#else
+#define COMMON_BLOCK(UN,LN)          _(_C,LN)
+#endif  /* AbsoftUNIXFortran or AbsoftProFortran */
+#else
+#define COMMON_BLOCK(UN,LN)          _(LN,__)
+#endif  /* CLIPPERFortran */
+#else
+#define COMMON_BLOCK(UN,LN)          _3(_,LN,_)
+#endif  /* CONVEXFortran */
+#endif  /* COMMON_BLOCK */
+
+#ifndef DOUBLE_PRECISION
+#if defined(CRAYFortran) && !defined(_CRAYT3E)
+#define DOUBLE_PRECISION long double
+#else
+#define DOUBLE_PRECISION double
+#endif
+#endif
+
+#ifndef FORTRAN_REAL
+#if defined(CRAYFortran) &&  defined(_CRAYT3E)
+#define FORTRAN_REAL double
+#else
+#define FORTRAN_REAL float
+#endif
+#endif
+
+#ifdef CRAYFortran
+#ifdef _CRAY
+#include <fortran.h>
+#else
+#include "fortran.h"  /* i.e. if crosscompiling assume user has file. */
+#endif
+#define FLOATVVVVVVV_cfPP (FORTRAN_REAL *)   /* Used for C calls FORTRAN.     */
+/* CRAY's double==float but CRAY says pointers to doubles and floats are diff.*/
+#define VOIDP  (void *)  /* When FORTRAN calls C, we don't know if C routine 
+                            arg.'s have been declared float *, or double *.   */
+#else
+#define FLOATVVVVVVV_cfPP
+#define VOIDP
+#endif
+
+#ifdef vmsFortran
+#if    defined(vms) || defined(__vms)
+#include <descrip.h>
+#else
+#include "descrip.h"  /* i.e. if crosscompiling assume user has file. */
+#endif
+#endif
+
+#ifdef sunFortran
+#if defined(sun) || defined(__sun)
+#include <math.h>     /* Sun's FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT.  */
+#else
+#include "math.h"     /* i.e. if crosscompiling assume user has file. */
+#endif
+/* At least starting with the default C compiler SC3.0.1 of SunOS 5.3,
+ * FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT are not required and not in
+ * <math.h>, since sun C no longer promotes C float return values to doubles.
+ * Therefore, only use them if defined.
+ * Even if gcc is being used, assume that it exhibits the Sun C compiler
+ * behavior in order to be able to use *.o from the Sun C compiler.
+ * i.e. If FLOATFUNCTIONTYPE, etc. are in math.h, they required by gcc.
+ */
+#endif
+
+#ifndef apolloFortran
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) extern DEFINITION NAME
+#define CF_NULL_PROTO
+#else                                         /* HP doesn't understand #elif. */
+/* Without ANSI prototyping, Apollo promotes float functions to double.    */
+/* Note that VAX/VMS, IBM, Mips choke on 'type function(...);' prototypes. */
+#define CF_NULL_PROTO ...
+#ifndef __CF__APOLLO67
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) \
+ DEFINITION NAME __attribute((__section(NAME)))
+#else
+#define COMMON_BLOCK_DEF(DEFINITION, NAME) \
+ DEFINITION NAME #attribute[section(NAME)]
+#endif
+#endif
+
+#ifdef __cplusplus
+#undef  CF_NULL_PROTO
+#define CF_NULL_PROTO  ...
+#endif
+
+
+#ifndef USE_NEW_DELETE
+#ifdef __cplusplus
+#define USE_NEW_DELETE 1
+#else
+#define USE_NEW_DELETE 0
+#endif
+#endif
+#if USE_NEW_DELETE
+#define _cf_malloc(N) new char[N]
+#define _cf_free(P)   delete[] P
+#else
+#define _cf_malloc(N) (char *)malloc(N)
+#define _cf_free(P)   free(P)
+#endif
+
+#ifdef mipsFortran
+#define CF_DECLARE_GETARG         int f77argc; char **f77argv
+#define CF_SET_GETARG(ARGC,ARGV)  f77argc = ARGC; f77argv = ARGV
+#else
+#define CF_DECLARE_GETARG
+#define CF_SET_GETARG(ARGC,ARGV)
+#endif
+
+#ifdef OLD_VAXC                          /* Allow %CC-I-PARAMNOTUSED.         */
+#pragma standard                         
+#endif
+
+#define AcfCOMMA ,
+#define AcfCOLON ;
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES USED WITHIN CFORTRAN.H                          */
+
+#define _cfMIN(A,B) (A<B?A:B)
+
+/* 970211 - XIX.145:
+   firstindexlength  - better name is all_but_last_index_lengths
+   secondindexlength - better name is         last_index_length
+ */
+#define  firstindexlength(A) (sizeof(A[0])==1 ? 1 : (sizeof(A) / sizeof(A[0])) )
+#define secondindexlength(A) (sizeof(A[0])==1 ?      sizeof(A) : sizeof(A[0])  )
+
+/* Behavior of FORTRAN LOGICAL. All machines' LOGICAL is same size as C's int.
+Conversion is automatic except for arrays which require F2CLOGICALV/C2FLOGICALV.
+f2c, MIPS f77 [DECstation, SGI], VAX Ultrix f77,
+HP-UX f77                                        : as in C.
+VAX/VMS FORTRAN, VAX Ultrix fort,
+Absoft Unix Fortran, IBM RS/6000 xlf             : LS Bit = 0/1 = TRUE/FALSE.
+Apollo                                           : neg.   = TRUE, else FALSE. 
+[Apollo accepts -1 as TRUE for function values, but NOT all other neg. values.]
+[DECFortran for Ultrix RISC is also called f77 but is the same as VAX/VMS.]   
+[MIPS f77 treats .eqv./.neqv. as .eq./.ne. and hence requires LOGICAL_STRICT.]*/
+
+#if defined(NAGf90Fortran) || defined(f2cFortran) || defined(mipsFortran) || defined(PowerStationFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) || defined(SXFortran)
+/* SX/PowerStationFortran have 0 and 1 defined, others are neither T nor F.   */
+/* hpuxFortran800 has 0 and 0x01000000 defined. Others are unknown.           */
+#define LOGICAL_STRICT      /* Other Fortran have .eqv./.neqv. == .eq./.ne.   */
+#endif
+
+#define C2FLOGICALV(A,I) \
+ do {int __i; for(__i=0;__i<I;__i++) A[__i]=C2FLOGICAL(A[__i]); } while (0)
+#define F2CLOGICALV(A,I) \
+ do {int __i; for(__i=0;__i<I;__i++) A[__i]=F2CLOGICAL(A[__i]); } while (0)
+
+#if defined(apolloFortran)
+#define C2FLOGICAL(L) ((L)?-1:(L)&~((unsigned)1<<sizeof(int)*8-1))
+#define F2CLOGICAL(L) ((L)<0?(L):0) 
+#else
+#if defined(CRAYFortran)
+#define C2FLOGICAL(L) _btol(L)
+#define F2CLOGICAL(L) _ltob(&(L))     /* Strangely _ltob() expects a pointer. */
+#else
+#if defined(IBMR2Fortran) || defined(vmsFortran) || defined(DECFortran) || defined(AbsoftUNIXFortran)
+/* How come no AbsoftProFortran ? */
+#define C2FLOGICAL(L) ((L)?(L)|1:(L)&~(int)1)
+#define F2CLOGICAL(L) ((L)&1?(L):0)
+#else
+#if defined(CONVEXFortran)
+#define C2FLOGICAL(L) ((L) ? ~0 : 0 )
+#define F2CLOGICAL(L) (L)
+#else   /* others evaluate LOGICALs as for C. */
+#define C2FLOGICAL(L) (L)
+#define F2CLOGICAL(L) (L)
+#ifndef LOGICAL_STRICT
+#undef  C2FLOGICALV
+#undef  F2CLOGICALV
+#define C2FLOGICALV(A,I)
+#define F2CLOGICALV(A,I)
+#endif  /* LOGICAL_STRICT                     */
+#endif  /* CONVEXFortran || All Others        */
+#endif  /* IBMR2Fortran vmsFortran DECFortran AbsoftUNIXFortran */
+#endif  /* CRAYFortran                        */
+#endif  /* apolloFortran                      */
+
+/* 970514 - In addition to CRAY, there may be other machines
+            for which LOGICAL_STRICT makes no sense. */
+#if defined(LOGICAL_STRICT) && !defined(CRAYFortran)
+/* Force C2FLOGICAL to generate only the values for either .TRUE. or .FALSE.
+   SX/PowerStationFortran only have 0 and 1 defined.
+   Elsewhere, only needed if you want to do:
+     logical lvariable
+     if (lvariable .eq.  .true.) then       ! (1)
+   instead of
+     if (lvariable .eqv. .true.) then       ! (2)
+   - (1) may not even be FORTRAN/77 and that Apollo's f77 and IBM's xlf
+     refuse to compile (1), so you are probably well advised to stay away from 
+     (1) and from LOGICAL_STRICT.
+   - You pay a (slight) performance penalty for using LOGICAL_STRICT. */
+#undef  C2FLOGICAL
+#ifdef hpuxFortran800
+#define C2FLOGICAL(L) ((L)?0x01000000:0)
+#else
+#if defined(apolloFortran) || defined(vmsFortran) || defined(DECFortran)
+#define C2FLOGICAL(L) ((L)?-1:0) /* These machines use -1/0 for .true./.false.*/
+#else
+#define C2FLOGICAL(L) ((L)? 1:0) /* All others     use +1/0 for .true./.false.*/
+#endif
+#endif
+#endif /* LOGICAL_STRICT */
+
+/* Convert a vector of C strings into FORTRAN strings. */
+#ifndef __CF__KnR
+static char *c2fstrv(char* cstr, char *fstr, int elem_len, int sizeofcstr)
+#else
+static char *c2fstrv(      cstr,       fstr,     elem_len,     sizeofcstr)
+                     char* cstr; char *fstr; int elem_len; int sizeofcstr;
+#endif
+{ int i,j;
+/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
+   Useful size of string must be the same in both languages. */
+for (i=0; i<sizeofcstr/elem_len; i++) {
+  for (j=1; j<elem_len && *cstr; j++) *fstr++ = *cstr++;
+  cstr += 1+elem_len-j;
+  for (; j<elem_len; j++) *fstr++ = ' ';
+} /* 95109 - Seems to be returning the original fstr. */
+return fstr-sizeofcstr+sizeofcstr/elem_len; }
+
+/* Convert a vector of FORTRAN strings into C strings. */
+#ifndef __CF__KnR
+static char *f2cstrv(char *fstr, char* cstr, int elem_len, int sizeofcstr)
+#else
+static char *f2cstrv(      fstr,       cstr,     elem_len,     sizeofcstr)
+                     char *fstr; char* cstr; int elem_len; int sizeofcstr; 
+#endif
+{ int i,j;
+/* elem_len includes \0 for C strings. Fortran strings don't have term. \0.
+   Useful size of string must be the same in both languages. */
+cstr += sizeofcstr;
+fstr += sizeofcstr - sizeofcstr/elem_len;
+for (i=0; i<sizeofcstr/elem_len; i++) {
+  *--cstr = '\0';
+  for (j=1; j<elem_len; j++) *--cstr = *--fstr;
+} return cstr; }
+
+/* kill the trailing char t's in string s. */
+#ifndef __CF__KnR
+static char *kill_trailing(char *s, char t)
+#else
+static char *kill_trailing(      s,      t) char *s; char t;
+#endif
+{char *e; 
+e = s + strlen(s);
+if (e>s) {                           /* Need this to handle NULL string.*/
+  while (e>s && *--e==t) {;}         /* Don't follow t's past beginning. */
+  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
+} return s; }
+
+#ifndef __CF__KnR
+static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term);
+#endif
+/* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally 
+points to the terminating '\0' of s, but may actually point to anywhere in s.
+s's new '\0' will be placed at e or earlier in order to remove any trailing t's.
+If e<s string s is left unchanged. */ 
+#ifndef __CF__KnR
+static char *kill_trailingn(char *s, char t, char *e)
+#else
+static char *kill_trailingn(      s,      t,       e) char *s; char t; char *e;
+#endif
+{ 
+if (e==s) *e = '\0';                 /* Kill the string makes sense here.*/
+else if (e>s) {                      /* Watch out for neg. length string.*/
+  while (e>s && *--e==t){;}          /* Don't follow t's past beginning. */
+  e[*e==t?0:1] = '\0';               /* Handle s[0]=t correctly.       */
+}
+(void)num_elem;  /* to prevent not used warnings in gcc (added by TJ) */
+
+ return s; }
+
+/* Note the following assumes that any element which has t's to be chopped off,
+does indeed fill the entire element. */
+#ifndef __CF__KnR
+static char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t)
+#else
+static char *vkill_trailing(      cstr,     elem_len,     sizeofcstr,      t)
+                            char* cstr; int elem_len; int sizeofcstr; char t;
+#endif
+{ int i;
+for (i=0; i<sizeofcstr/elem_len; i++) /* elem_len includes \0 for C strings. */
+  kill_trailingn(cstr+elem_len*i,t,cstr+elem_len*(i+1)-1);
+return cstr; }
+
+#ifdef vmsFortran
+typedef struct dsc$descriptor_s fstring;
+#define DSC$DESCRIPTOR_A(DIMCT)  		                               \
+struct {                                                                       \
+  unsigned short dsc$w_length;	        unsigned char	 dsc$b_dtype;	       \
+  unsigned char	 dsc$b_class;	                 char	*dsc$a_pointer;	       \
+           char	 dsc$b_scale;	        unsigned char	 dsc$b_digits;         \
+  struct {                                                                     \
+    unsigned		       : 3;	  unsigned dsc$v_fl_binscale : 1;      \
+    unsigned dsc$v_fl_redim    : 1;       unsigned dsc$v_fl_column   : 1;      \
+    unsigned dsc$v_fl_coeff    : 1;       unsigned dsc$v_fl_bounds   : 1;      \
+  } dsc$b_aflags;	                                                       \
+  unsigned char	 dsc$b_dimct;	        unsigned long	 dsc$l_arsize;	       \
+           char	*dsc$a_a0;	                 long	 dsc$l_m [DIMCT];      \
+  struct {                                                                     \
+    long dsc$l_l;                         long dsc$l_u;                        \
+  } dsc$bounds [DIMCT];                                                        \
+}
+typedef DSC$DESCRIPTOR_A(1) fstringvector;
+/*typedef DSC$DESCRIPTOR_A(2) fstringarrarr;
+  typedef DSC$DESCRIPTOR_A(3) fstringarrarrarr;*/
+#define initfstr(F,C,ELEMNO,ELEMLEN)                                           \
+( (F).dsc$l_arsize=  ( (F).dsc$w_length                        =(ELEMLEN) )    \
+                    *( (F).dsc$l_m[0]=(F).dsc$bounds[0].dsc$l_u=(ELEMNO)  ),   \
+  (F).dsc$a_a0    =  ( (F).dsc$a_pointer=(C) ) - (F).dsc$w_length          ,(F))
+
+#endif      /* PDW: 2/10/98 (CFITSIO) -- Let VMS see NUM_ELEMS definitions */
+#define _NUM_ELEMS      -1
+#define _NUM_ELEM_ARG   -2
+#define NUM_ELEMS(A)    A,_NUM_ELEMS
+#define NUM_ELEM_ARG(B) *_2(A,B),_NUM_ELEM_ARG
+#define TERM_CHARS(A,B) A,B
+#ifndef __CF__KnR
+static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term)
+#else
+static int num_elem(      strv,          elem_len,     term_char,     num_term)
+                    char *strv; unsigned elem_len; int term_char; int num_term;
+#endif
+/* elem_len is the number of characters in each element of strv, the FORTRAN
+vector of strings. The last element of the vector must begin with at least
+num_term term_char characters, so that this routine can determine how 
+many elements are in the vector. */
+{
+unsigned num,i;
+if (num_term == _NUM_ELEMS || num_term == _NUM_ELEM_ARG) 
+  return term_char;
+if (num_term <=0) num_term = (int)elem_len;
+for (num=0; ; num++) {
+  for (i=0; i<(unsigned)num_term && *strv==term_char; i++,strv++){;}
+  if (i==(unsigned)num_term) break;
+  else strv += elem_len-i;
+}
+/* to prevent not used warnings in gcc (added by ROOT, changed by TJ
+ * because of unreachable warnings from clang) */
+(void)c2fstrv; (void)f2cstrv; (void)kill_trailing;
+(void)vkill_trailing; (void)num_elem;
+return (int)num;
+}
+/* #endif removed 2/10/98 (CFITSIO) */
+
+/*-------------------------------------------------------------------------*/
+
+/*           UTILITIES FOR C TO USE STRINGS IN FORTRAN COMMON BLOCKS       */
+
+/* C string TO Fortran Common Block STRing. */
+/* DIM is the number of DIMensions of the array in terms of strings, not
+   characters. e.g. char a[12] has DIM = 0, char a[12][4] has DIM = 1, etc. */
+#define C2FCBSTR(CSTR,FSTR,DIM)                                                \
+ c2fstrv((char *)CSTR, (char *)FSTR, sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,    \
+         sizeof(FSTR)+cfelementsof(FSTR,DIM))
+
+/* Fortran Common Block string TO C STRing. */
+#define FCB2CSTR(FSTR,CSTR,DIM)                                                \
+ vkill_trailing(f2cstrv((char *)FSTR, (char *)CSTR,                            \
+                        sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                 \
+                        sizeof(FSTR)+cfelementsof(FSTR,DIM)),                  \
+                sizeof(FSTR)/cfelementsof(FSTR,DIM)+1,                         \
+                sizeof(FSTR)+cfelementsof(FSTR,DIM), ' ')
+
+#define cfDEREFERENCE0
+#define cfDEREFERENCE1 *
+#define cfDEREFERENCE2 **
+#define cfDEREFERENCE3 ***
+#define cfDEREFERENCE4 ****
+#define cfDEREFERENCE5 *****
+#define cfelementsof(A,D) (sizeof(A)/sizeof(_(cfDEREFERENCE,D)(A)))
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR C TO CALL FORTRAN SUBROUTINES               */
+
+/* Define lookup tables for how to handle the various types of variables.  */
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#define ZTRINGV_NUM(I)       I
+#define ZTRINGV_ARGFP(I) (*(_2(A,I))) /* Undocumented. For PINT, etc. */
+#define ZTRINGV_ARGF(I) _2(A,I)
+#ifdef CFSUBASFUN
+#define ZTRINGV_ARGS(I) ZTRINGV_ARGF(I)
+#else
+#define ZTRINGV_ARGS(I) _2(B,I)
+#endif
+
+#define    PBYTE_cfVP(A,B) PINT_cfVP(A,B)
+#define  PDOUBLE_cfVP(A,B)
+#define   PFLOAT_cfVP(A,B)
+#ifdef ZTRINGV_ARGS_allows_Pvariables
+/* This allows Pvariables for ARGS. ARGF machinery is above ARGFP.
+ * B is not needed because the variable may be changed by the Fortran routine,
+ * but because B is the only way to access an arbitrary macro argument.       */
+#define     PINT_cfVP(A,B) int  B = (int)A;              /* For ZSTRINGV_ARGS */
+#else
+#define     PINT_cfVP(A,B)
+#endif
+#define PLOGICAL_cfVP(A,B) int *B;      /* Returning LOGICAL in FUNn and SUBn */
+#define    PLONG_cfVP(A,B) PINT_cfVP(A,B)
+#define   PSHORT_cfVP(A,B) PINT_cfVP(A,B)
+
+#define        VCF_INT_S(T,A,B) _(T,VVVVVVV_cfTYPE) B = A;
+#define        VCF_INT_F(T,A,B) _(T,_cfVCF)(A,B)
+/* _cfVCF table is directly mapped to _cfCCC table. */
+#define     BYTE_cfVCF(A,B)
+#define   DOUBLE_cfVCF(A,B)
+#if !defined(__CF__KnR)
+#define    FLOAT_cfVCF(A,B)
+#else
+#define    FLOAT_cfVCF(A,B) FORTRAN_REAL B = A;
+#endif
+#define      INT_cfVCF(A,B)
+#define  LOGICAL_cfVCF(A,B)
+#define     LONG_cfVCF(A,B)
+#define    SHORT_cfVCF(A,B)
+
+/* 980416
+   Cast (void (*)(CF_NULL_PROTO)) causes SunOS CC 4.2 occasionally to barf,
+   while the following equivalent typedef is fine.
+   For consistency use the typedef on all machines.
+ */
+typedef void (*cfCAST_FUNCTION)(CF_NULL_PROTO);
+
+#define VCF(TN,I)       _Icf4(4,V,TN,_(A,I),_(B,I),F)
+#define VVCF(TN,AI,BI)  _Icf4(4,V,TN,AI,BI,S)
+#define        INT_cfV(T,A,B,F) _(VCF_INT_,F)(T,A,B)
+#define       INTV_cfV(T,A,B,F)
+#define      INTVV_cfV(T,A,B,F)
+#define     INTVVV_cfV(T,A,B,F)
+#define    INTVVVV_cfV(T,A,B,F)
+#define   INTVVVVV_cfV(T,A,B,F)
+#define  INTVVVVVV_cfV(T,A,B,F)
+#define INTVVVVVVV_cfV(T,A,B,F)
+#define PINT_cfV(      T,A,B,F) _(T,_cfVP)(A,B)
+#define PVOID_cfV(     T,A,B,F)
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define    ROUTINE_cfV(T,A,B,F) void (*B)(CF_NULL_PROTO) = (cfCAST_FUNCTION)A;
+#else
+#define    ROUTINE_cfV(T,A,B,F)
+#endif
+#define     SIMPLE_cfV(T,A,B,F)
+#ifdef vmsFortran
+#define     STRING_cfV(T,A,B,F) static struct {fstring f; unsigned clen;} B =  \
+                                       {{0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL},0};
+#define    PSTRING_cfV(T,A,B,F) static fstring B={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,NULL};
+#define    STRINGV_cfV(T,A,B,F) static fstringvector B =                       \
+  {sizeof(A),DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,1,1,1},1,0,NULL,0,{1,0}};
+#define   PSTRINGV_cfV(T,A,B,F) static fstringvector B =                       \
+          {0,DSC$K_DTYPE_T,DSC$K_CLASS_A,NULL,0,0,{0,0,1,1,1},1,0,NULL,0,{1,0}};
+#else
+#define     STRING_cfV(T,A,B,F) struct {unsigned int clen, flen; char *nombre;} B;
+#define    STRINGV_cfV(T,A,B,F) struct {char *s, *fs; unsigned flen; char *nombre;} B;
+#define    PSTRING_cfV(T,A,B,F) int     B;
+#define   PSTRINGV_cfV(T,A,B,F) struct{char *fs; unsigned int sizeofA,flen;}B;
+#endif
+#define    ZTRINGV_cfV(T,A,B,F)  STRINGV_cfV(T,A,B,F)
+#define   PZTRINGV_cfV(T,A,B,F) PSTRINGV_cfV(T,A,B,F)
+
+/* Note that the actions of the A table were performed inside the AA table.
+   VAX Ultrix vcc, and HP-UX cc, didn't evaluate arguments to functions left to
+   right, so we had to split the original table into the current robust two. */
+#define ACF(NAME,TN,AI,I)      _(TN,_cfSTR)(4,A,NAME,I,AI,_(B,I),0)
+#define   DEFAULT_cfA(M,I,A,B)
+#define   LOGICAL_cfA(M,I,A,B) B=C2FLOGICAL(B);
+#define  PLOGICAL_cfA(M,I,A,B) A=C2FLOGICAL(A);
+#define    STRING_cfA(M,I,A,B)  STRING_cfC(M,I,A,B,sizeof(A))
+#define   PSTRING_cfA(M,I,A,B) PSTRING_cfC(M,I,A,B,sizeof(A))
+#ifdef vmsFortran
+#define  AATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ initfstr(B,_cf_malloc((sA)-(filA)),(filA),(silA)-1),                          \
+          c2fstrv(A,B.dsc$a_pointer,(silA),(sA));
+#define APATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ initfstr(B,A,(filA),(silA)-1),c2fstrv(A,A,(silA),(sA));
+#else
+#define  AATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+     (B.s=_cf_malloc((sA)-(filA)),B.fs=c2fstrv(A,B.s,(B.flen=(silA)-1)+1,(sA)));
+#define APATRINGV_cfA(    A,B, sA,filA,silA)                                   \
+ B.fs=c2fstrv(A,A,(B.flen=(silA)-1)+1,B.sizeofA=(sA));
+#endif
+#define   STRINGV_cfA(M,I,A,B)                                                 \
+    AATRINGV_cfA((char *)A,B,sizeof(A),firstindexlength(A),secondindexlength(A))
+#define  PSTRINGV_cfA(M,I,A,B)                                                 \
+   APATRINGV_cfA((char *)A,B,sizeof(A),firstindexlength(A),secondindexlength(A))
+#define   ZTRINGV_cfA(M,I,A,B)  AATRINGV_cfA( (char *)A,B,                     \
+                    (_3(M,_ELEMS_,I))*(( _3(M,_ELEMLEN_,I))+1),                \
+                              (_3(M,_ELEMS_,I)),(_3(M,_ELEMLEN_,I))+1)
+#define  PZTRINGV_cfA(M,I,A,B) APATRINGV_cfA( (char *)A,B,                     \
+                    (_3(M,_ELEMS_,I))*(( _3(M,_ELEMLEN_,I))+1),                \
+                              (_3(M,_ELEMS_,I)),(_3(M,_ELEMLEN_,I))+1)
+
+#define    PBYTE_cfAAP(A,B) &A
+#define  PDOUBLE_cfAAP(A,B) &A
+#define   PFLOAT_cfAAP(A,B) FLOATVVVVVVV_cfPP &A
+#define     PINT_cfAAP(A,B) &A
+#define PLOGICAL_cfAAP(A,B) B= &A         /* B used to keep a common W table. */
+#define    PLONG_cfAAP(A,B) &A
+#define   PSHORT_cfAAP(A,B) &A
+
+#define AACF(TN,AI,I,C) _SEP_(TN,C,cfCOMMA) _Icf(3,AA,TN,AI,_(B,I))
+#define        INT_cfAA(T,A,B) &B
+#define       INTV_cfAA(T,A,B) _(T,VVVVVV_cfPP) A
+#define      INTVV_cfAA(T,A,B) _(T,VVVVV_cfPP)  A[0]
+#define     INTVVV_cfAA(T,A,B) _(T,VVVV_cfPP)   A[0][0]
+#define    INTVVVV_cfAA(T,A,B) _(T,VVV_cfPP)    A[0][0][0]
+#define   INTVVVVV_cfAA(T,A,B) _(T,VV_cfPP)     A[0][0][0][0]
+#define  INTVVVVVV_cfAA(T,A,B) _(T,V_cfPP)      A[0][0][0][0][0]
+#define INTVVVVVVV_cfAA(T,A,B) _(T,_cfPP)       A[0][0][0][0][0][0]
+#define       PINT_cfAA(T,A,B) _(T,_cfAAP)(A,B)
+#define      PVOID_cfAA(T,A,B) (void *) A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfAA(T,A,B) &B
+#else
+#define    ROUTINE_cfAA(T,A,B) (cfCAST_FUNCTION)A
+#endif
+#define     STRING_cfAA(T,A,B)  STRING_cfCC(T,A,B)
+#define    PSTRING_cfAA(T,A,B) PSTRING_cfCC(T,A,B)
+#ifdef vmsFortran
+#define    STRINGV_cfAA(T,A,B) &B
+#else
+#ifdef CRAYFortran
+#define    STRINGV_cfAA(T,A,B) _cptofcd(B.fs,B.flen)
+#else
+#define    STRINGV_cfAA(T,A,B) B.fs
+#endif
+#endif
+#define   PSTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+#define    ZTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+#define   PZTRINGV_cfAA(T,A,B) STRINGV_cfAA(T,A,B)
+
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define JCF(TN,I)
+#define KCF(TN,I)
+#else
+#define JCF(TN,I)    _(TN,_cfSTR)(1,J,_(B,I), 0,0,0,0)
+#if defined(AbsoftUNIXFortran)
+#define  DEFAULT_cfJ(B) ,0
+#else
+#define  DEFAULT_cfJ(B)
+#endif
+#define  LOGICAL_cfJ(B) DEFAULT_cfJ(B)
+#define PLOGICAL_cfJ(B) DEFAULT_cfJ(B)
+#define   STRING_cfJ(B) ,B.flen
+#define  PSTRING_cfJ(B) ,B
+#define  STRINGV_cfJ(B) STRING_cfJ(B)
+#define PSTRINGV_cfJ(B) STRING_cfJ(B)
+#define  ZTRINGV_cfJ(B) STRING_cfJ(B)
+#define PZTRINGV_cfJ(B) STRING_cfJ(B)
+
+/* KCF is identical to DCF, except that KCF ZTRING is not empty. */
+#define KCF(TN,I)    _(TN,_cfSTR)(1,KK,_(B,I), 0,0,0,0)
+#if defined(AbsoftUNIXFortran)
+#define  DEFAULT_cfKK(B) , unsigned B
+#else
+#define  DEFAULT_cfKK(B)
+#endif
+#define  LOGICAL_cfKK(B) DEFAULT_cfKK(B)
+#define PLOGICAL_cfKK(B) DEFAULT_cfKK(B)
+#define   STRING_cfKK(B) , unsigned B
+#define  PSTRING_cfKK(B) STRING_cfKK(B)
+#define  STRINGV_cfKK(B) STRING_cfKK(B)
+#define PSTRINGV_cfKK(B) STRING_cfKK(B)
+#define  ZTRINGV_cfKK(B) STRING_cfKK(B)
+#define PZTRINGV_cfKK(B) STRING_cfKK(B)
+#endif
+
+#define WCF(TN,AN,I)      _(TN,_cfSTR)(2,W,AN,_(B,I), 0,0,0)
+#define  DEFAULT_cfW(A,B)
+#define  LOGICAL_cfW(A,B)
+#define PLOGICAL_cfW(A,B) *B=F2CLOGICAL(*B);
+#define   STRING_cfW(A,B) (B.nombre=A,B.nombre[B.clen]!='\0'?B.nombre[B.clen]='\0':0); /* A?="constnt"*/
+#define  PSTRING_cfW(A,B) kill_trailing(A,' ');
+#ifdef vmsFortran
+#define  STRINGV_cfW(A,B) _cf_free(B.dsc$a_pointer);
+#define PSTRINGV_cfW(A,B)                                                      \
+  vkill_trailing(f2cstrv((char*)A, (char*)A,                                   \
+                           B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0]),     \
+                   B.dsc$w_length+1, B.dsc$l_arsize+B.dsc$l_m[0], ' ');
+#else
+#define  STRINGV_cfW(A,B) _cf_free(B.s);
+#define PSTRINGV_cfW(A,B) vkill_trailing(                                      \
+         f2cstrv((char*)A,(char*)A,B.flen+1,B.sizeofA), B.flen+1,B.sizeofA,' ');
+#endif
+#define  ZTRINGV_cfW(A,B)      STRINGV_cfW(A,B)
+#define PZTRINGV_cfW(A,B)     PSTRINGV_cfW(A,B)
+
+#define   NCF(TN,I,C)       _SEP_(TN,C,cfCOMMA) _Icf(2,N,TN,_(A,I),0) 
+#define  NNCF(TN,I,C)        UUCF(TN,I,C)
+#define NNNCF(TN,I,C)       _SEP_(TN,C,cfCOLON) _Icf(2,N,TN,_(A,I),0) 
+#define        INT_cfN(T,A) _(T,VVVVVVV_cfTYPE) * A
+#define       INTV_cfN(T,A) _(T,VVVVVV_cfTYPE)  * A
+#define      INTVV_cfN(T,A) _(T,VVVVV_cfTYPE)   * A
+#define     INTVVV_cfN(T,A) _(T,VVVV_cfTYPE)    * A
+#define    INTVVVV_cfN(T,A) _(T,VVV_cfTYPE)     * A
+#define   INTVVVVV_cfN(T,A) _(T,VV_cfTYPE)      * A
+#define  INTVVVVVV_cfN(T,A) _(T,V_cfTYPE)       * A
+#define INTVVVVVVV_cfN(T,A) _(T,_cfTYPE)        * A
+#define       PINT_cfN(T,A) _(T,_cfTYPE)        * A
+#define      PVOID_cfN(T,A) void *                A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfN(T,A) void (**A)(CF_NULL_PROTO)
+#else
+#define    ROUTINE_cfN(T,A) void ( *A)(CF_NULL_PROTO)
+#endif
+#ifdef vmsFortran
+#define     STRING_cfN(T,A) fstring *             A
+#define    STRINGV_cfN(T,A) fstringvector *       A
+#else
+#ifdef CRAYFortran
+#define     STRING_cfN(T,A) _fcd                  A
+#define    STRINGV_cfN(T,A) _fcd                  A
+#else
+#define     STRING_cfN(T,A) char *                A
+#define    STRINGV_cfN(T,A) char *                A
+#endif
+#endif
+#define    PSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PNSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PPSTRING_cfN(T,A)   STRING_cfN(T,A) /* CRAY insists on arg.'s here. */
+#define   PSTRINGV_cfN(T,A)  STRINGV_cfN(T,A)
+#define    ZTRINGV_cfN(T,A)  STRINGV_cfN(T,A)
+#define   PZTRINGV_cfN(T,A) PSTRINGV_cfN(T,A)
+
+
+/* Apollo 6.7, CRAY, old Sun, VAX/Ultrix vcc/cc and new ultrix
+   can't hack more than 31 arg's.
+   e.g. ultrix >= 4.3 gives message:
+       zow35> cc -c -DDECFortran cfortest.c
+       cfe: Fatal: Out of memory: cfortest.c
+       zow35>
+   Old __hpux had the problem, but new 'HP-UX A.09.03 A 9000/735' is fine
+   if using -Aa, otherwise we have a problem.
+ */
+#ifndef MAX_PREPRO_ARGS
+#if !defined(__GNUC__) && (defined(VAXUltrix) || defined(__CF__APOLLO67) || (defined(sun)&&!defined(__sun)) || defined(_CRAY) || defined(__ultrix__) || (defined(__hpux)&&defined(__CF__KnR)))
+#define MAX_PREPRO_ARGS 31
+#else
+#define MAX_PREPRO_ARGS 99
+#endif
+#endif
+
+#if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+/* In addition to explicit Absoft stuff, only Absoft requires:
+   - DEFAULT coming from _cfSTR.
+     DEFAULT could have been called e.g. INT, but keep it for clarity.
+   - M term in CFARGT14 and CFARGT14FS.
+ */
+#define ABSOFT_cf1(T0) _(T0,_cfSTR)(0,ABSOFT1,0,0,0,0,0)
+#define ABSOFT_cf2(T0) _(T0,_cfSTR)(0,ABSOFT2,0,0,0,0,0)
+#define ABSOFT_cf3(T0) _(T0,_cfSTR)(0,ABSOFT3,0,0,0,0,0)
+#define DEFAULT_cfABSOFT1
+#define LOGICAL_cfABSOFT1
+#define  STRING_cfABSOFT1 ,MAX_LEN_FORTRAN_FUNCTION_STRING
+#define DEFAULT_cfABSOFT2
+#define LOGICAL_cfABSOFT2
+#define  STRING_cfABSOFT2 ,unsigned D0
+#define DEFAULT_cfABSOFT3
+#define LOGICAL_cfABSOFT3
+#define  STRING_cfABSOFT3 ,D0
+#else
+#define ABSOFT_cf1(T0)
+#define ABSOFT_cf2(T0)
+#define ABSOFT_cf3(T0)
+#endif
+
+/* _Z introduced to cicumvent IBM and HP silly preprocessor warning.
+   e.g. "Macro CFARGT14 invoked with a null argument."
+ */
+#define _Z
+
+#define  CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)                \
+ S(T1,1)   S(T2,2)   S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)       \
+ S(T8,8)   S(T9,9)   S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)
+#define  CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ S(T1,1)   S(T2,2)   S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)       \
+ S(T8,8)   S(T9,9)   S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)      \
+ S(TF,15)  S(TG,16)  S(TH,17)   S(TI,18)   S(TJ,19)   S(TK,20)   S(TL,21)      \
+ S(TM,22)  S(TN,23)  S(TO,24)   S(TP,25)   S(TQ,26)   S(TR,27)
+
+#define  CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)           \
+ F(T1,1,0) F(T2,2,1) F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)     \
+ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)    \
+ M       CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define  CFARGT27FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1)  \
+ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1)             \
+ M       CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+#if !(defined(PowerStationFortran)||defined(hpuxFortran800))
+/*  Old CFARGT14 -> CFARGT14FS as seen below, for Absoft cross-compile yields:
+      SunOS> cc -c -Xa -DAbsoftUNIXFortran c.c
+      "c.c", line 406: warning: argument mismatch
+    Haven't checked if this is ANSI C or a SunOS bug. SunOS -Xs works ok.
+    Behavior is most clearly seen in example:
+      #define A 1 , 2
+      #define  C(X,Y,Z) x=X. y=Y. z=Z.
+      #define  D(X,Y,Z) C(X,Y,Z)
+      D(x,A,z)
+    Output from preprocessor is: x = x . y = 1 . z = 2 .
+ #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+       CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+*/
+#define  CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)             \
+ F(T1,1,0) F(T2,2,1) F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)     \
+ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)    \
+ M       CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define  CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1)  \
+ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1)             \
+ M       CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+#define  CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+ F(T1,1,0)  F(T2,2,1)  F(T3,3,1)  F(T4,4,1)  F(T5,5,1)  F(T6,6,1)  F(T7,7,1)   \
+ F(T8,8,1)  F(T9,9,1)  F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1)  \
+ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1)             \
+ S(T1,1)    S(T2,2)    S(T3,3)    S(T4,4)    S(T5,5)    S(T6,6)    S(T7,7)     \
+ S(T8,8)    S(T9,9)    S(TA,10)   S(TB,11)   S(TC,12)   S(TD,13)   S(TE,14)    \
+ S(TF,15)   S(TG,16)   S(TH,17)   S(TI,18)   S(TJ,19)   S(TK,20)
+#define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1) F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) S(T1,1)      S(T2,2)       S(T3,3)       S(T4,4)       \
+ S(T5,5)       S(T6,6)       S(T7,7)      S(T8,8)       S(T9,9)       S(TA,10)      \
+ S(TB,11)      S(TC,12)      S(TD,13)     S(TE,14)
+#if MAX_PREPRO_ARGS>31
+#define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1)  F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1)  F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \
+ F(TJ,AJ,19,1) F(TK,AK,20,1) S(T1,1)       S(T2,2)       S(T3,3)       S(T4,4)       \
+ S(T5,5)       S(T6,6)       S(T7,7)       S(T8,8)       S(T9,9)       S(TA,10)      \
+ S(TB,11)      S(TC,12)      S(TD,13)      S(TE,14)      S(TF,15)      S(TG,16)      \
+ S(TH,17)      S(TI,18)      S(TJ,19)      S(TK,20)
+#define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+ F(T1,A1,1,0)  F(T2,A2,2,1)  F(T3,A3,3,1)  F(T4,A4,4,1)  F(T5,A5,5,1)  F(T6,A6,6,1)  \
+ F(T7,A7,7,1)  F(T8,A8,8,1)  F(T9,A9,9,1)  F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \
+ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \
+ F(TJ,AJ,19,1) F(TK,AK,20,1) F(TL,AL,21,1) F(TM,AM,22,1) F(TN,AN,23,1) F(TO,AO,24,1) \
+ F(TP,AP,25,1) F(TQ,AQ,26,1) F(TR,AR,27,1) S(T1,1)       S(T2,2)       S(T3,3)       \
+ S(T4,4)       S(T5,5)       S(T6,6)       S(T7,7)       S(T8,8)       S(T9,9)       \
+ S(TA,10)      S(TB,11)      S(TC,12)      S(TD,13)      S(TE,14)      S(TF,15)      \
+ S(TG,16)      S(TH,17)      S(TI,18)      S(TJ,19)      S(TK,20)      S(TL,21)      \
+ S(TM,22)      S(TN,23)      S(TO,24)      S(TP,25)      S(TQ,26)      S(TR,27)
+#endif
+#else
+#define  CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)             \
+ F(T1,1,0) S(T1,1) F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1) S(T5,5) F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14)
+#define  CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+ F(T1,1,0)  S(T1,1)  F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1)  S(T5,5)  F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1)  S(T9,9)  F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \
+ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) \
+ F(TL,21,1) S(TL,21) F(TM,22,1) S(TM,22) F(TN,23,1) S(TN,23) F(TO,24,1) S(TO,24) \
+ F(TP,25,1) S(TP,25) F(TQ,26,1) S(TQ,26) F(TR,27,1) S(TR,27)
+
+#define  CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+ F(T1,1,0)  S(T1,1)  F(T2,2,1)  S(T2,2)  F(T3,3,1)  S(T3,3)  F(T4,4,1)  S(T4,4)  \
+ F(T5,5,1)  S(T5,5)  F(T6,6,1)  S(T6,6)  F(T7,7,1)  S(T7,7)  F(T8,8,1)  S(T8,8)  \
+ F(T9,9,1)  S(T9,9)  F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \
+ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \
+ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20)
+#define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14)
+#if MAX_PREPRO_ARGS>31
+#define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15)          \
+ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18)          \
+ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20)                
+#define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+ F(T1,A1,1,0)  S(T1,1)  F(T2,A2,2,1)  S(T2,2)  F(T3,A3,3,1)  S(T3,3)           \
+ F(T4,A4,4,1)  S(T4,4)  F(T5,A5,5,1)  S(T5,5)  F(T6,A6,6,1)  S(T6,6)           \
+ F(T7,A7,7,1)  S(T7,7)  F(T8,A8,8,1)  S(T8,8)  F(T9,A9,9,1)  S(T9,9)           \
+ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12)          \
+ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15)          \
+ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18)          \
+ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) F(TL,AL,21,1) S(TL,21)          \
+ F(TM,AM,22,1) S(TM,22) F(TN,AN,23,1) S(TN,23) F(TO,AO,24,1) S(TO,24)          \
+ F(TP,AP,25,1) S(TP,25) F(TQ,AQ,26,1) S(TQ,26) F(TR,AR,27,1) S(TR,27)
+#endif
+#endif
+
+
+#define PROTOCCALLSFSUB1( UN,LN,T1) \
+        PROTOCCALLSFSUB14(UN,LN,T1,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB2( UN,LN,T1,T2) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB3( UN,LN,T1,T2,T3) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB4( UN,LN,T1,T2,T3,T4) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define PROTOCCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+
+#define PROTOCCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0)
+#define PROTOCCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0)
+
+#define PROTOCCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0)
+#define PROTOCCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0)
+
+
+#ifndef FCALLSC_QUALIFIER
+#ifdef VISUAL_CPLUSPLUS
+#define FCALLSC_QUALIFIER __stdcall
+#else
+#define FCALLSC_QUALIFIER
+#endif
+#endif
+
+#ifdef __cplusplus
+#define CFextern extern "C"
+#else
+#define CFextern extern
+#endif
+
+
+#ifdef CFSUBASFUN
+#define PROTOCCALLSFSUB0(UN,LN) \
+   PROTOCCALLSFFUN0( VOID,UN,LN)
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+   PROTOCCALLSFFUN14(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\
+   PROTOCCALLSFFUN20(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\
+   PROTOCCALLSFFUN27(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#else
+/* Note: Prevent compiler warnings, null #define PROTOCCALLSFSUB14/20 after 
+   #include-ing cfortran.h if calling the FORTRAN wrapper within the same 
+   source code where the wrapper is created. */
+#define PROTOCCALLSFSUB0(UN,LN)     _(VOID,_cfPU)(CFC_(UN,LN))();
+#ifndef __CF__KnR
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT14(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) );
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT20(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) );
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\
+ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT27(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) );
+#else
+#define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)     \
+         PROTOCCALLSFSUB0(UN,LN)
+#define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+         PROTOCCALLSFSUB0(UN,LN)
+#define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+         PROTOCCALLSFSUB0(UN,LN)
+#endif
+#endif
+
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+
+#define CCALLSFSUB1( UN,LN,T1,                        A1)         \
+        CCALLSFSUB5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0)
+#define CCALLSFSUB2( UN,LN,T1,T2,                     A1,A2)      \
+        CCALLSFSUB5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0)
+#define CCALLSFSUB3( UN,LN,T1,T2,T3,                  A1,A2,A3)   \
+        CCALLSFSUB5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0)
+#define CCALLSFSUB4( UN,LN,T1,T2,T3,T4,               A1,A2,A3,A4)\
+        CCALLSFSUB5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0)
+#define CCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5,            A1,A2,A3,A4,A5)          \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0)
+#define CCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6,         A1,A2,A3,A4,A5,A6)       \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0)
+#define CCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7,      A1,A2,A3,A4,A5,A6,A7)    \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0)
+#define CCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,   A1,A2,A3,A4,A5,A6,A7,A8) \
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0)
+#define CCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
+        CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0)
+#define CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0)
+#define CCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0)
+#define CCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0)
+#define CCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\
+        CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0)
+
+#ifdef __cplusplus
+#define CPPPROTOCLSFSUB0( UN,LN)
+#define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#else
+#define CPPPROTOCLSFSUB0(UN,LN) \
+        PROTOCCALLSFSUB0(UN,LN)
+#define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)     \
+        PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+        PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+        PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+#endif
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB0(UN,LN) CCALLSFFUN0(UN,LN)
+#define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)
+#else
+/* do{...}while(0) allows if(a==b) FORT(); else BORT(); */
+#define CCALLSFSUB0( UN,LN) do{CPPPROTOCLSFSUB0(UN,LN) CFC_(UN,LN)();}while(0)
+#define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5)  \
+   VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14)             \
+   CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)          \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)                           \
+   ACF(LN,T4,A4,4)  ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)          \
+   ACF(LN,T8,A8,8)  ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11)         \
+   ACF(LN,TC,AC,12) ACF(LN,TD,AD,13) ACF(LN,TE,AE,14)                          \
+   CFC_(UN,LN)( CFARGTA14(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) );\
+   WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)        \
+   WCF(T6,A6,6)  WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10)       \
+   WCF(TB,AB,11) WCF(TC,AC,12) WCF(TD,AD,13) WCF(TE,AE,14)      }while(0)
+#endif
+
+
+#if MAX_PREPRO_ARGS>31
+#define CCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,0,0,0,0,0)
+#define CCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,0,0,0,0)
+#define CCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,0,0,0)
+#define CCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,0,0)
+#define CCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ)\
+        CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,0)
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+        CCALLSFFUN20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK)
+#else
+#define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \
+        TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \
+do{VVCF(T1,A1,B1)  VVCF(T2,A2,B2)  VVCF(T3,A3,B3)  VVCF(T4,A4,B4)  VVCF(T5,A5,B5)   \
+   VVCF(T6,A6,B6)  VVCF(T7,A7,B7)  VVCF(T8,A8,B8)  VVCF(T9,A9,B9)  VVCF(TA,AA,B10)  \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15)  \
+   VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20)  \
+   CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)  \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)  ACF(LN,T4,A4,4)          \
+   ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)  ACF(LN,T8,A8,8)          \
+   ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12)         \
+   ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16)         \
+   ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20)         \
+   CFC_(UN,LN)( CFARGTA20(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) ); \
+ WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)  WCF(T6,A6,6)  \
+ WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \
+ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \
+ WCF(TJ,AJ,19) WCF(TK,AK,20) }while(0)
+#endif
+#endif         /* MAX_PREPRO_ARGS */
+
+#if MAX_PREPRO_ARGS>31
+#define CCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,0,0,0,0,0,0)
+#define CCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,0,0,0,0,0)
+#define CCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,0,0,0,0)
+#define CCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,0,0,0)
+#define CCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,0,0)
+#define CCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ)\
+        CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,0)
+
+#ifdef CFSUBASFUN
+#define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+        CCALLSFFUN27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR)
+#else
+#define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \
+                           A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \
+do{VVCF(T1,A1,B1)  VVCF(T2,A2,B2)  VVCF(T3,A3,B3)  VVCF(T4,A4,B4)  VVCF(T5,A5,B5)   \
+   VVCF(T6,A6,B6)  VVCF(T7,A7,B7)  VVCF(T8,A8,B8)  VVCF(T9,A9,B9)  VVCF(TA,AA,B10)  \
+   VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15)  \
+   VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20)  \
+   VVCF(TL,AL,B21) VVCF(TM,AM,B22) VVCF(TN,AN,B23) VVCF(TO,AO,B24) VVCF(TP,AP,B25)  \
+   VVCF(TQ,AQ,B26) VVCF(TR,AR,B27)                                                  \
+   CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+   ACF(LN,T1,A1,1)  ACF(LN,T2,A2,2)  ACF(LN,T3,A3,3)  ACF(LN,T4,A4,4)          \
+   ACF(LN,T5,A5,5)  ACF(LN,T6,A6,6)  ACF(LN,T7,A7,7)  ACF(LN,T8,A8,8)          \
+   ACF(LN,T9,A9,9)  ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12)         \
+   ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16)         \
+   ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20)         \
+   ACF(LN,TL,AL,21) ACF(LN,TM,AM,22) ACF(LN,TN,AN,23) ACF(LN,TO,AO,24)         \
+   ACF(LN,TP,AP,25) ACF(LN,TQ,AQ,26) ACF(LN,TR,AR,27)                          \
+   CFC_(UN,LN)( CFARGTA27(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,\
+                                   A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) ); \
+ WCF(T1,A1,1)  WCF(T2,A2,2)  WCF(T3,A3,3)  WCF(T4,A4,4)  WCF(T5,A5,5)  WCF(T6,A6,6)  \
+ WCF(T7,A7,7)  WCF(T8,A8,8)  WCF(T9,A9,9)  WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \
+ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \
+ WCF(TJ,AJ,19) WCF(TK,AK,20) WCF(TL,AL,21) WCF(TM,AM,22) WCF(TN,AN,23) WCF(TO,AO,24) \
+ WCF(TP,AP,25) WCF(TQ,AQ,26) WCF(TR,AR,27) }while(0)
+#endif
+#endif         /* MAX_PREPRO_ARGS */
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR C TO CALL FORTRAN FUNCTIONS                 */
+
+/*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN
+  function is called. Therefore, especially for creator's of C header files
+  for large FORTRAN libraries which include many functions, to reduce
+  compile time and object code size, it may be desirable to create
+  preprocessor directives to allow users to create code for only those
+  functions which they use.                                                */
+
+/* The following defines the maximum length string that a function can return.
+   Of course it may be undefine-d and re-define-d before individual
+   PROTOCCALLSFFUNn(..) as required. It would also be nice to have this derived
+   from the individual machines' limits.                                      */
+#define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE
+
+/* The following defines a character used by CFORTRAN.H to flag the end of a
+   string coming out of a FORTRAN routine.                                 */
+#define CFORTRAN_NON_CHAR 0x7F
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#define _SEP_(TN,C,cfCOMMA)     _(__SEP_,C)(TN,cfCOMMA)
+#define __SEP_0(TN,cfCOMMA)  
+#define __SEP_1(TN,cfCOMMA)     _Icf(2,SEP,TN,cfCOMMA,0)
+#define        INT_cfSEP(T,B) _(A,B)
+#define       INTV_cfSEP(T,B) INT_cfSEP(T,B)
+#define      INTVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define     INTVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define    INTVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   INTVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define  INTVVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define INTVVVVVVV_cfSEP(T,B) INT_cfSEP(T,B)
+#define       PINT_cfSEP(T,B) INT_cfSEP(T,B)
+#define      PVOID_cfSEP(T,B) INT_cfSEP(T,B)
+#define    ROUTINE_cfSEP(T,B) INT_cfSEP(T,B)
+#define     SIMPLE_cfSEP(T,B) INT_cfSEP(T,B)
+#define       VOID_cfSEP(T,B) INT_cfSEP(T,B)    /* For FORTRAN calls C subr.s.*/
+#define     STRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define    STRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define    PSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PSTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PNSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PPSTRING_cfSEP(T,B) INT_cfSEP(T,B)
+#define    ZTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+#define   PZTRINGV_cfSEP(T,B) INT_cfSEP(T,B)
+                         
+#if defined(SIGNED_BYTE) || !defined(UNSIGNED_BYTE)
+#ifdef OLD_VAXC
+#define INTEGER_BYTE               char    /* Old VAXC barfs on 'signed char' */
+#else
+#define INTEGER_BYTE        signed char    /* default */
+#endif
+#else
+#define INTEGER_BYTE        unsigned char
+#endif
+#define    BYTEVVVVVVV_cfTYPE INTEGER_BYTE
+#define  DOUBLEVVVVVVV_cfTYPE DOUBLE_PRECISION 
+#define   FLOATVVVVVVV_cfTYPE FORTRAN_REAL
+#define     INTVVVVVVV_cfTYPE int
+#define LOGICALVVVVVVV_cfTYPE int
+#define    LONGVVVVVVV_cfTYPE long
+#define LONGLONGVVVVVVV_cfTYPE LONGLONG   /* added by MR December 2005 */
+#define   SHORTVVVVVVV_cfTYPE short
+#define          PBYTE_cfTYPE INTEGER_BYTE
+#define        PDOUBLE_cfTYPE DOUBLE_PRECISION 
+#define         PFLOAT_cfTYPE FORTRAN_REAL
+#define           PINT_cfTYPE int
+#define       PLOGICAL_cfTYPE int
+#define          PLONG_cfTYPE long
+#define      PLONGLONG_cfTYPE LONGLONG  /* added by MR December 2005 */
+#define         PSHORT_cfTYPE short
+
+#define CFARGS0(A,T,V,W,X,Y,Z) _3(T,_cf,A)
+#define CFARGS1(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V)
+#define CFARGS2(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W)
+#define CFARGS3(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X)
+#define CFARGS4(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y)
+#define CFARGS5(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y,Z)
+
+#define  _Icf(N,T,I,X,Y)                 _(I,_cfINT)(N,T,I,X,Y,0)
+#define _Icf4(N,T,I,X,Y,Z)               _(I,_cfINT)(N,T,I,X,Y,Z)
+#define           BYTE_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define         DOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INT,B,X,Y,Z,0)
+#define          FLOAT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define            INT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define        LOGICAL_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define           LONG_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define       LONGLONG_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define          SHORT_cfINT(N,A,B,X,Y,Z)        DOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          PBYTE_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define        PDOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,PINT,B,X,Y,Z,0)
+#define         PFLOAT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define           PINT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define       PLOGICAL_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          PLONG_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define      PLONGLONG_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define         PSHORT_cfINT(N,A,B,X,Y,Z)       PDOUBLE_cfINT(N,A,B,X,Y,Z)
+#define          BYTEV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define         BYTEVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define        BYTEVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define       BYTEVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define      BYTEVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     BYTEVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    BYTEVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define        DOUBLEV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTV,B,X,Y,Z,0)
+#define       DOUBLEVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVV,B,X,Y,Z,0)
+#define      DOUBLEVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVV,B,X,Y,Z,0)
+#define     DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVV,B,X,Y,Z,0)
+#define    DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVV,B,X,Y,Z,0)
+#define   DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVV,B,X,Y,Z,0)
+#define  DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVVV,B,X,Y,Z,0)
+#define         FLOATV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define        FLOATVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define       FLOATVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define      FLOATVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define     FLOATVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    FLOATVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define   FLOATVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define           INTV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define          INTVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define         INTVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define        INTVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define       INTVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define      INTVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     INTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define       LOGICALV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define      LOGICALVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define     LOGICALVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define    LOGICALVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define   LOGICALVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define  LOGICALVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define LOGICALVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define          LONGV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define         LONGVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define        LONGVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define       LONGVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define      LONGVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define     LONGVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    LONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define      LONGLONGV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define     LONGLONGVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define    LONGLONGVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */
+#define         SHORTV_cfINT(N,A,B,X,Y,Z)       DOUBLEV_cfINT(N,A,B,X,Y,Z)
+#define        SHORTVV_cfINT(N,A,B,X,Y,Z)      DOUBLEVV_cfINT(N,A,B,X,Y,Z)
+#define       SHORTVVV_cfINT(N,A,B,X,Y,Z)     DOUBLEVVV_cfINT(N,A,B,X,Y,Z)
+#define      SHORTVVVV_cfINT(N,A,B,X,Y,Z)    DOUBLEVVVV_cfINT(N,A,B,X,Y,Z)
+#define     SHORTVVVVV_cfINT(N,A,B,X,Y,Z)   DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z)
+#define    SHORTVVVVVV_cfINT(N,A,B,X,Y,Z)  DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define   SHORTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z)
+#define          PVOID_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,B,B,X,Y,Z,0)
+#define        ROUTINE_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+/*CRAY coughs on the first,
+  i.e. the usual trouble of not being able to
+  define macros to macros with arguments. 
+  New ultrix is worse, it coughs on all such uses.
+ */
+/*#define       SIMPLE_cfINT                    PVOID_cfINT*/
+#define         SIMPLE_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define           VOID_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define         STRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        STRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        PSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PSTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PNSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PPSTRING_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define        ZTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define       PZTRINGV_cfINT(N,A,B,X,Y,Z)         PVOID_cfINT(N,A,B,X,Y,Z)
+#define           CF_0_cfINT(N,A,B,X,Y,Z)
+                         
+
+#define   UCF(TN,I,C)  _SEP_(TN,C,cfCOMMA) _Icf(2,U,TN,_(A,I),0)
+#define  UUCF(TN,I,C)  _SEP_(TN,C,cfCOMMA) _SEP_(TN,1,I) 
+#define UUUCF(TN,I,C)  _SEP_(TN,C,cfCOLON) _Icf(2,U,TN,_(A,I),0)
+#define        INT_cfU(T,A) _(T,VVVVVVV_cfTYPE)   A
+#define       INTV_cfU(T,A) _(T,VVVVVV_cfTYPE)  * A
+#define      INTVV_cfU(T,A) _(T,VVVVV_cfTYPE)   * A
+#define     INTVVV_cfU(T,A) _(T,VVVV_cfTYPE)    * A
+#define    INTVVVV_cfU(T,A) _(T,VVV_cfTYPE)     * A
+#define   INTVVVVV_cfU(T,A) _(T,VV_cfTYPE)      * A
+#define  INTVVVVVV_cfU(T,A) _(T,V_cfTYPE)       * A
+#define INTVVVVVVV_cfU(T,A) _(T,_cfTYPE)        * A
+#define       PINT_cfU(T,A) _(T,_cfTYPE)        * A
+#define      PVOID_cfU(T,A) void  *A 
+#define    ROUTINE_cfU(T,A) void (*A)(CF_NULL_PROTO) 
+#define       VOID_cfU(T,A) void   A    /* Needed for C calls FORTRAN sub.s.  */
+#define     STRING_cfU(T,A) char  *A    /*            via VOID and wrapper.   */
+#define    STRINGV_cfU(T,A) char  *A
+#define    PSTRING_cfU(T,A) char  *A
+#define   PSTRINGV_cfU(T,A) char  *A
+#define    ZTRINGV_cfU(T,A) char  *A
+#define   PZTRINGV_cfU(T,A) char  *A
+
+/* VOID breaks U into U and UU. */
+#define       INT_cfUU(T,A) _(T,VVVVVVV_cfTYPE) A
+#define      VOID_cfUU(T,A)             /* Needed for FORTRAN calls C sub.s.  */
+#define    STRING_cfUU(T,A) const char *A
+
+
+#define      BYTE_cfPU(A)   CFextern INTEGER_BYTE      FCALLSC_QUALIFIER A
+#define    DOUBLE_cfPU(A)   CFextern DOUBLE_PRECISION  FCALLSC_QUALIFIER A
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define     FLOAT_cfPU(A)   CFextern DOUBLE_PRECISION  FCALLSC_QUALIFIER A
+#else
+#define     FLOAT_cfPU(A)   CFextern FORTRAN_REAL      FCALLSC_QUALIFIER A
+#endif
+#else				   	                   
+#define     FLOAT_cfPU(A)   CFextern FLOATFUNCTIONTYPE FCALLSC_QUALIFIER A
+#endif				   	                   
+#define       INT_cfPU(A)   CFextern int   FCALLSC_QUALIFIER   A
+#define   LOGICAL_cfPU(A)   CFextern int   FCALLSC_QUALIFIER   A
+#define      LONG_cfPU(A)   CFextern long  FCALLSC_QUALIFIER   A
+#define     SHORT_cfPU(A)   CFextern short FCALLSC_QUALIFIER   A
+#define    STRING_cfPU(A)   CFextern void  FCALLSC_QUALIFIER   A
+#define      VOID_cfPU(A)   CFextern void  FCALLSC_QUALIFIER   A
+
+#define    BYTE_cfE INTEGER_BYTE     A0;
+#define  DOUBLE_cfE DOUBLE_PRECISION A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfE FORTRAN_REAL  A0;
+#else
+#define   FLOAT_cfE FORTRAN_REAL AA0;   FLOATFUNCTIONTYPE A0;
+#endif
+#define     INT_cfE int    A0;
+#define LOGICAL_cfE int    A0;
+#define    LONG_cfE long   A0;
+#define   SHORT_cfE short  A0;
+#define    VOID_cfE
+#ifdef vmsFortran
+#define  STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];        \
+                       static fstring A0 =                                     \
+             {MAX_LEN_FORTRAN_FUNCTION_STRING,DSC$K_DTYPE_T,DSC$K_CLASS_S,AA0};\
+               memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\
+                                    *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
+#else
+#ifdef CRAYFortran
+#define  STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];        \
+                   static _fcd A0; *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';\
+                memset(AA0,CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\
+                            A0 = _cptofcd(AA0,MAX_LEN_FORTRAN_FUNCTION_STRING);
+#else
+/* 'cc: SC3.0.1 13 Jul 1994' barfs on char A0[0x4FE+1]; 
+ * char A0[0x4FE +1]; char A0[1+0x4FE]; are both OK.     */
+#define STRING_cfE static char A0[1+MAX_LEN_FORTRAN_FUNCTION_STRING];          \
+                       memset(A0, CFORTRAN_NON_CHAR,                           \
+                              MAX_LEN_FORTRAN_FUNCTION_STRING);                \
+                       *(A0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';
+#endif
+#endif
+/* ESTRING must use static char. array which is guaranteed to exist after
+   function returns.                                                     */
+
+/* N.B.i) The diff. for 0 (Zero) and >=1 arguments.
+       ii)That the following create an unmatched bracket, i.e. '(', which
+          must of course be matched in the call.
+       iii)Commas must be handled very carefully                         */
+#define    INT_cfGZ(T,UN,LN) A0=CFC_(UN,LN)(
+#define   VOID_cfGZ(T,UN,LN)    CFC_(UN,LN)(
+#ifdef vmsFortran
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)(&A0
+#else
+#if defined(CRAYFortran) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)( A0
+#else
+#define STRING_cfGZ(T,UN,LN)    CFC_(UN,LN)( A0,MAX_LEN_FORTRAN_FUNCTION_STRING
+#endif
+#endif
+
+#define     INT_cfG(T,UN,LN)    INT_cfGZ(T,UN,LN)
+#define    VOID_cfG(T,UN,LN)   VOID_cfGZ(T,UN,LN)
+#define  STRING_cfG(T,UN,LN) STRING_cfGZ(T,UN,LN), /*, is only diff. from _cfG*/
+
+#define    BYTEVVVVVVV_cfPP
+#define     INTVVVVVVV_cfPP     /* These complement FLOATVVVVVVV_cfPP. */
+#define  DOUBLEVVVVVVV_cfPP
+#define LOGICALVVVVVVV_cfPP
+#define    LONGVVVVVVV_cfPP
+#define   SHORTVVVVVVV_cfPP
+#define          PBYTE_cfPP
+#define           PINT_cfPP
+#define        PDOUBLE_cfPP
+#define       PLOGICAL_cfPP
+#define          PLONG_cfPP
+#define         PSHORT_cfPP
+#define         PFLOAT_cfPP FLOATVVVVVVV_cfPP
+
+#define BCF(TN,AN,C)        _SEP_(TN,C,cfCOMMA) _Icf(2,B,TN,AN,0)
+#define        INT_cfB(T,A) (_(T,VVVVVVV_cfTYPE)) A
+#define       INTV_cfB(T,A)            A
+#define      INTVV_cfB(T,A)           (A)[0]
+#define     INTVVV_cfB(T,A)           (A)[0][0]
+#define    INTVVVV_cfB(T,A)           (A)[0][0][0]
+#define   INTVVVVV_cfB(T,A)           (A)[0][0][0][0]
+#define  INTVVVVVV_cfB(T,A)           (A)[0][0][0][0][0]
+#define INTVVVVVVV_cfB(T,A)           (A)[0][0][0][0][0][0]
+#define       PINT_cfB(T,A) _(T,_cfPP)&A
+#define     STRING_cfB(T,A) (char *)   A
+#define    STRINGV_cfB(T,A) (char *)   A
+#define    PSTRING_cfB(T,A) (char *)   A
+#define   PSTRINGV_cfB(T,A) (char *)   A
+#define      PVOID_cfB(T,A) (void *)   A
+#define    ROUTINE_cfB(T,A) (cfCAST_FUNCTION)A
+#define    ZTRINGV_cfB(T,A) (char *)   A
+#define   PZTRINGV_cfB(T,A) (char *)   A
+                                                              	
+#define SCF(TN,NAME,I,A)    _(TN,_cfSTR)(3,S,NAME,I,A,0,0)
+#define  DEFAULT_cfS(M,I,A)
+#define  LOGICAL_cfS(M,I,A)
+#define PLOGICAL_cfS(M,I,A)
+#define   STRING_cfS(M,I,A) ,sizeof(A)
+#define  STRINGV_cfS(M,I,A) ,( (unsigned)0xFFFF*firstindexlength(A) \
+                              +secondindexlength(A))
+#define  PSTRING_cfS(M,I,A) ,sizeof(A)
+#define PSTRINGV_cfS(M,I,A) STRINGV_cfS(M,I,A)
+#define  ZTRINGV_cfS(M,I,A)
+#define PZTRINGV_cfS(M,I,A)
+
+#define   HCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOMMA, H,_(C,I),0,0)
+#define  HHCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOMMA,HH,_(C,I),0,0)
+#define HHHCF(TN,I)         _(TN,_cfSTR)(3,H,cfCOLON, H,_(C,I),0,0)
+#define  H_CF_SPECIAL       unsigned
+#define HH_CF_SPECIAL
+#define  DEFAULT_cfH(M,I,A)
+#define  LOGICAL_cfH(S,U,B)
+#define PLOGICAL_cfH(S,U,B)
+#define   STRING_cfH(S,U,B) _(A,S) _(U,_CF_SPECIAL) B
+#define  STRINGV_cfH(S,U,B) STRING_cfH(S,U,B)
+#define  PSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PSTRINGV_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PNSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define PPSTRING_cfH(S,U,B) STRING_cfH(S,U,B)
+#define  ZTRINGV_cfH(S,U,B)
+#define PZTRINGV_cfH(S,U,B)
+
+/* Need VOID_cfSTR because Absoft forced function types go through _cfSTR. */
+/* No spaces inside expansion. They screws up macro catenation kludge.     */
+#define           VOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           BYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         DOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          FLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define            INT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        LOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,LOGICAL,A,B,C,D,E)
+#define           LONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define          SHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          BYTEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         BYTEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        BYTEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       BYTEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      BYTEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     BYTEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    BYTEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        DOUBLEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       DOUBLEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      DOUBLEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     DOUBLEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    DOUBLEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   DOUBLEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define  DOUBLEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         FLOATV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        FLOATVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       FLOATVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      FLOATVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     FLOATVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    FLOATVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   FLOATVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           INTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          INTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         INTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        INTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       INTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      INTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     INTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LOGICALV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LOGICALVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     LOGICALVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    LOGICALVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   LOGICALVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define  LOGICALVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define LOGICALVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          LONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         LONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        LONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       LONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     LONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    LONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      LONGLONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define     LONGLONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define    LONGLONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define         SHORTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        SHORTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       SHORTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      SHORTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define     SHORTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define    SHORTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define   SHORTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define          PBYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        PDOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         PFLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define           PINT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define       PLOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PLOGICAL,A,B,C,D,E)
+#define          PLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define      PLONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */
+#define         PSHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         STRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRING,A,B,C,D,E)
+#define        PSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRING,A,B,C,D,E)
+#define        STRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRINGV,A,B,C,D,E)
+#define       PSTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRINGV,A,B,C,D,E)
+#define       PNSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PNSTRING,A,B,C,D,E)
+#define       PPSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PPSTRING,A,B,C,D,E)
+#define          PVOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        ROUTINE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define         SIMPLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E)
+#define        ZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,ZTRINGV,A,B,C,D,E)
+#define       PZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PZTRINGV,A,B,C,D,E)
+#define           CF_0_cfSTR(N,T,A,B,C,D,E)
+
+/* See ACF table comments, which explain why CCF was split into two. */
+#define CCF(NAME,TN,I)     _(TN,_cfSTR)(5,C,NAME,I,_(A,I),_(B,I),_(C,I))
+#define  DEFAULT_cfC(M,I,A,B,C)
+#define  LOGICAL_cfC(M,I,A,B,C)  A=C2FLOGICAL( A);
+#define PLOGICAL_cfC(M,I,A,B,C) *A=C2FLOGICAL(*A);
+#ifdef vmsFortran
+#define   STRING_cfC(M,I,A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A,         \
+        C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.f.dsc$w_length=B.clen:     \
+          (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0'));
+      /* PSTRING_cfC to beware of array A which does not contain any \0.      */
+#define  PSTRING_cfC(M,I,A,B,C) (B.dsc$a_pointer=A, C==sizeof(char*) ?         \
+             B.dsc$w_length=strlen(A):  (A[C-1]='\0',B.dsc$w_length=strlen(A), \
+       (unsigned)memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1), B.dsc$w_length=C-1));
+#else
+#define   STRING_cfC(M,I,A,B,C) (B.nombre=A,B.clen=(unsigned)strlen(A),                             \
+                C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.flen=B.clen:       \
+                        (unsigned)(memset(B.nombre+B.clen,' ',C-B.clen-1),B.nombre[B.flen=C-1]='\0'));
+#define  PSTRING_cfC(M,I,A,B,C) (C==sizeof(char*)? B=strlen(A):                \
+                    (A[C-1]='\0',B=strlen(A),memset((A)+B,' ',C-B-1),B=C-1));
+#endif
+          /* For CRAYFortran for (P)STRINGV_cfC, B.fs is set, but irrelevant. */
+#define  STRINGV_cfC(M,I,A,B,C) \
+        AATRINGV_cfA(    A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF)
+#define PSTRINGV_cfC(M,I,A,B,C) \
+       APATRINGV_cfA(    A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF)
+#define  ZTRINGV_cfC(M,I,A,B,C) \
+        AATRINGV_cfA(    A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1),       \
+                              (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1   )
+#define PZTRINGV_cfC(M,I,A,B,C) \
+       APATRINGV_cfA(    A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1),       \
+                              (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1   )
+
+#define     BYTE_cfCCC(A,B) &A
+#define   DOUBLE_cfCCC(A,B) &A
+#if !defined(__CF__KnR)
+#define    FLOAT_cfCCC(A,B) &A
+                               /* Although the VAX doesn't, at least the      */
+#else                          /* HP and K&R mips promote float arg.'s of     */
+#define    FLOAT_cfCCC(A,B) &B /* unprototyped functions to double. Cannot    */
+#endif                         /* use A here to pass the argument to FORTRAN. */
+#define      INT_cfCCC(A,B) &A
+#define  LOGICAL_cfCCC(A,B) &A
+#define     LONG_cfCCC(A,B) &A
+#define    SHORT_cfCCC(A,B) &A
+#define    PBYTE_cfCCC(A,B)  A
+#define  PDOUBLE_cfCCC(A,B)  A
+#define   PFLOAT_cfCCC(A,B)  A
+#define     PINT_cfCCC(A,B)  A
+#define PLOGICAL_cfCCC(A,B)  B=A       /* B used to keep a common W table. */
+#define    PLONG_cfCCC(A,B)  A
+#define   PSHORT_cfCCC(A,B)  A
+
+#define CCCF(TN,I,M)           _SEP_(TN,M,cfCOMMA) _Icf(3,CC,TN,_(A,I),_(B,I))
+#define        INT_cfCC(T,A,B) _(T,_cfCCC)(A,B) 
+#define       INTV_cfCC(T,A,B)  A
+#define      INTVV_cfCC(T,A,B)  A
+#define     INTVVV_cfCC(T,A,B)  A
+#define    INTVVVV_cfCC(T,A,B)  A
+#define   INTVVVVV_cfCC(T,A,B)  A
+#define  INTVVVVVV_cfCC(T,A,B)  A
+#define INTVVVVVVV_cfCC(T,A,B)  A
+#define       PINT_cfCC(T,A,B) _(T,_cfCCC)(A,B) 
+#define      PVOID_cfCC(T,A,B)  A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define    ROUTINE_cfCC(T,A,B) &A
+#else
+#define    ROUTINE_cfCC(T,A,B)  A
+#endif
+#define     SIMPLE_cfCC(T,A,B)  A
+#ifdef vmsFortran
+#define     STRING_cfCC(T,A,B) &B.f
+#define    STRINGV_cfCC(T,A,B) &B
+#define    PSTRING_cfCC(T,A,B) &B
+#define   PSTRINGV_cfCC(T,A,B) &B
+#else
+#ifdef CRAYFortran
+#define     STRING_cfCC(T,A,B) _cptofcd(A,B.flen)
+#define    STRINGV_cfCC(T,A,B) _cptofcd(B.s,B.flen)
+#define    PSTRING_cfCC(T,A,B) _cptofcd(A,B)
+#define   PSTRINGV_cfCC(T,A,B) _cptofcd(A,B.flen)
+#else
+#define     STRING_cfCC(T,A,B)  A
+#define    STRINGV_cfCC(T,A,B)  B.fs
+#define    PSTRING_cfCC(T,A,B)  A
+#define   PSTRINGV_cfCC(T,A,B)  B.fs
+#endif
+#endif
+#define    ZTRINGV_cfCC(T,A,B)   STRINGV_cfCC(T,A,B)
+#define   PZTRINGV_cfCC(T,A,B)  PSTRINGV_cfCC(T,A,B)
+
+#define    BYTE_cfX  return A0;
+#define  DOUBLE_cfX  return A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfX  return A0;
+#else
+#define   FLOAT_cfX  ASSIGNFLOAT(AA0,A0); return AA0;
+#endif
+#define     INT_cfX  return A0;
+#define LOGICAL_cfX  return F2CLOGICAL(A0);
+#define    LONG_cfX  return A0;
+#define   SHORT_cfX  return A0;
+#define    VOID_cfX  return   ;
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define  STRING_cfX  return kill_trailing(                                     \
+                                      kill_trailing(AA0,CFORTRAN_NON_CHAR),' ');
+#else
+#define  STRING_cfX  return kill_trailing(                                     \
+                                      kill_trailing( A0,CFORTRAN_NON_CHAR),' ');
+#endif
+
+#define CFFUN(NAME) _(__cf__,NAME)
+
+/* Note that we don't use LN here, but we keep it for consistency. */
+#define CCALLSFFUN0(UN,LN) CFFUN(UN)()
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+#define CCALLSFFUN1( UN,LN,T1,                        A1)         \
+        CCALLSFFUN5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0)
+#define CCALLSFFUN2( UN,LN,T1,T2,                     A1,A2)      \
+        CCALLSFFUN5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0)
+#define CCALLSFFUN3( UN,LN,T1,T2,T3,                  A1,A2,A3)   \
+        CCALLSFFUN5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0)
+#define CCALLSFFUN4( UN,LN,T1,T2,T3,T4,               A1,A2,A3,A4)\
+        CCALLSFFUN5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0)
+#define CCALLSFFUN5( UN,LN,T1,T2,T3,T4,T5,            A1,A2,A3,A4,A5)          \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0)
+#define CCALLSFFUN6( UN,LN,T1,T2,T3,T4,T5,T6,         A1,A2,A3,A4,A5,A6)       \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0)
+#define CCALLSFFUN7( UN,LN,T1,T2,T3,T4,T5,T6,T7,      A1,A2,A3,A4,A5,A6,A7)    \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0)
+#define CCALLSFFUN8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,   A1,A2,A3,A4,A5,A6,A7,A8) \
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0)
+#define CCALLSFFUN9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\
+        CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0)
+#define CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0)
+#define CCALLSFFUN11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0)
+#define CCALLSFFUN12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0)
+#define CCALLSFFUN13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\
+        CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0)
+
+#define CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\
+((CFFUN(UN)(  BCF(T1,A1,0) BCF(T2,A2,1) BCF(T3,A3,1) BCF(T4,A4,1) BCF(T5,A5,1) \
+              BCF(T6,A6,1) BCF(T7,A7,1) BCF(T8,A8,1) BCF(T9,A9,1) BCF(TA,AA,1) \
+              BCF(TB,AB,1) BCF(TC,AC,1) BCF(TD,AD,1) BCF(TE,AE,1)              \
+           SCF(T1,LN,1,A1)  SCF(T2,LN,2,A2)  SCF(T3,LN,3,A3)  SCF(T4,LN,4,A4)  \
+           SCF(T5,LN,5,A5)  SCF(T6,LN,6,A6)  SCF(T7,LN,7,A7)  SCF(T8,LN,8,A8)  \
+           SCF(T9,LN,9,A9)  SCF(TA,LN,10,AA) SCF(TB,LN,11,AB) SCF(TC,LN,12,AC) \
+           SCF(TD,LN,13,AD) SCF(TE,LN,14,AE))))
+
+/*  N.B. Create a separate function instead of using (call function, function
+value here) because in order to create the variables needed for the input
+arg.'s which may be const.'s one has to do the creation within {}, but these
+can never be placed within ()'s. Therefore one must create wrapper functions.
+gcc, on the other hand may be able to avoid the wrapper functions. */
+
+/* Prototypes are needed to correctly handle the value returned correctly. N.B.
+Can only have prototype arg.'s with difficulty, a la G... table since FORTRAN
+functions returning strings have extra arg.'s. Don't bother, since this only
+causes a compiler warning to come up when one uses FCALLSCFUNn and CCALLSFFUNn
+for the same function in the same source code. Something done by the experts in
+debugging only.*/    
+
+#define PROTOCCALLSFFUN0(F,UN,LN)                                              \
+_(F,_cfPU)( CFC_(UN,LN))(CF_NULL_PROTO);                                       \
+static _Icf(2,U,F,CFFUN(UN),0)() {_(F,_cfE) _Icf(3,GZ,F,UN,LN) ABSOFT_cf1(F));_(F,_cfX)}
+
+#define PROTOCCALLSFFUN1( T0,UN,LN,T1)                                         \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN2( T0,UN,LN,T1,T2)                                      \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN3( T0,UN,LN,T1,T2,T3)                                   \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,CF_0,CF_0)
+#define PROTOCCALLSFFUN4( T0,UN,LN,T1,T2,T3,T4)                                \
+        PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,T4,CF_0)
+#define PROTOCCALLSFFUN5( T0,UN,LN,T1,T2,T3,T4,T5)                             \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN6( T0,UN,LN,T1,T2,T3,T4,T5,T6)                          \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN7( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7)                       \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN8( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8)                    \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0)
+#define PROTOCCALLSFFUN9( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9)                 \
+        PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0)
+#define PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA)              \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN11(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB)           \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define PROTOCCALLSFFUN12(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC)        \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define PROTOCCALLSFFUN13(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD)     \
+        PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+/* HP/UX 9.01 cc requires the blank between '_Icf(3,G,T0,UN,LN) CCCF(T1,1,0)' */
+
+#ifndef __CF__KnR
+#define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  \
+ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)(     \
+   CFARGT14FS(UCF,HCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )          \
+{       CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    _(T0,_cfE) \
+ CCF(LN,T1,1)  CCF(LN,T2,2)  CCF(LN,T3,3)  CCF(LN,T4,4)  CCF(LN,T5,5)          \
+ CCF(LN,T6,6)  CCF(LN,T7,7)  CCF(LN,T8,8)  CCF(LN,T9,9)  CCF(LN,TA,10)         \
+ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14)    _Icf(3,G,T0,UN,LN) \
+ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \
+ WCF(T1,A1,1)   WCF(T2,A2,2)   WCF(T3,A3,3)   WCF(T4,A4,4)  WCF(T5,A5,5)       \
+ WCF(T6,A6,6)   WCF(T7,A7,7)   WCF(T8,A8,8)   WCF(T9,A9,9)  WCF(TA,A10,10)     \
+ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)}
+#else
+#define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  \
+ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)(     \
+   CFARGT14FS(UUCF,HHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )        \
+ CFARGT14FS(UUUCF,HHHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ;        \
+{       CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    _(T0,_cfE) \
+ CCF(LN,T1,1)  CCF(LN,T2,2)  CCF(LN,T3,3)  CCF(LN,T4,4)  CCF(LN,T5,5)          \
+ CCF(LN,T6,6)  CCF(LN,T7,7)  CCF(LN,T8,8)  CCF(LN,T9,9)  CCF(LN,TA,10)         \
+ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14)    _Icf(3,G,T0,UN,LN) \
+ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \
+ WCF(T1,A1,1)   WCF(T2,A2,2)   WCF(T3,A3,3)   WCF(T4,A4,4)   WCF(T5,A5,5)      \
+ WCF(T6,A6,6)   WCF(T7,A7,7)   WCF(T8,A8,8)   WCF(T9,A9,9)   WCF(TA,A10,10)    \
+ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)}
+#endif
+
+/*-------------------------------------------------------------------------*/
+
+/*               UTILITIES FOR FORTRAN TO CALL C ROUTINES                  */
+
+#ifdef OLD_VAXC                                /* Prevent %CC-I-PARAMNOTUSED. */
+#pragma nostandard
+#endif
+
+#if defined(vmsFortran) || defined(CRAYFortran)
+#define   DCF(TN,I)
+#define  DDCF(TN,I)
+#define DDDCF(TN,I)
+#else
+#define   DCF(TN,I)          HCF(TN,I)
+#define  DDCF(TN,I)         HHCF(TN,I)
+#define DDDCF(TN,I)        HHHCF(TN,I)
+#endif
+
+#define QCF(TN,I)       _(TN,_cfSTR)(1,Q,_(B,I), 0,0,0,0)
+#define  DEFAULT_cfQ(B)
+#define  LOGICAL_cfQ(B)
+#define PLOGICAL_cfQ(B)
+#define  STRINGV_cfQ(B) char *B; unsigned int _(B,N);
+#define   STRING_cfQ(B) char *B=NULL;
+#define  PSTRING_cfQ(B) char *B=NULL;
+#define PSTRINGV_cfQ(B) STRINGV_cfQ(B)
+#define PNSTRING_cfQ(B) char *B=NULL;
+#define PPSTRING_cfQ(B)
+
+#ifdef     __sgi   /* Else SGI gives warning 182 contrary to its C LRM A.17.7 */
+#define ROUTINE_orig    *(void**)& 
+#else
+#define ROUTINE_orig     (void *)  
+#endif
+
+#define ROUTINE_1     ROUTINE_orig   
+#define ROUTINE_2     ROUTINE_orig   
+#define ROUTINE_3     ROUTINE_orig   
+#define ROUTINE_4     ROUTINE_orig   
+#define ROUTINE_5     ROUTINE_orig   
+#define ROUTINE_6     ROUTINE_orig   
+#define ROUTINE_7     ROUTINE_orig   
+#define ROUTINE_8     ROUTINE_orig   
+#define ROUTINE_9     ROUTINE_orig   
+#define ROUTINE_10    ROUTINE_orig   
+#define ROUTINE_11    ROUTINE_orig   
+#define ROUTINE_12    ROUTINE_orig   
+#define ROUTINE_13    ROUTINE_orig   
+#define ROUTINE_14    ROUTINE_orig   
+#define ROUTINE_15    ROUTINE_orig   
+#define ROUTINE_16    ROUTINE_orig   
+#define ROUTINE_17    ROUTINE_orig   
+#define ROUTINE_18    ROUTINE_orig   
+#define ROUTINE_19    ROUTINE_orig   
+#define ROUTINE_20    ROUTINE_orig   
+#define ROUTINE_21    ROUTINE_orig   
+#define ROUTINE_22    ROUTINE_orig   
+#define ROUTINE_23    ROUTINE_orig   
+#define ROUTINE_24    ROUTINE_orig   
+#define ROUTINE_25    ROUTINE_orig   
+#define ROUTINE_26    ROUTINE_orig   
+#define ROUTINE_27    ROUTINE_orig   
+
+#define TCF(NAME,TN,I,M)              _SEP_(TN,M,cfCOMMA) _(TN,_cfT)(NAME,I,_(A,I),_(B,I),_(C,I))
+#define           BYTE_cfT(M,I,A,B,D) *A
+#define         DOUBLE_cfT(M,I,A,B,D) *A
+#define          FLOAT_cfT(M,I,A,B,D) *A
+#define            INT_cfT(M,I,A,B,D) *A
+#define        LOGICAL_cfT(M,I,A,B,D)  F2CLOGICAL(*A)
+#define           LONG_cfT(M,I,A,B,D) *A
+#define       LONGLONG_cfT(M,I,A,B,D) *A /* added by MR December 2005 */
+#define          SHORT_cfT(M,I,A,B,D) *A
+#define          BYTEV_cfT(M,I,A,B,D)  A
+#define        DOUBLEV_cfT(M,I,A,B,D)  A
+#define         FLOATV_cfT(M,I,A,B,D)  VOIDP A
+#define           INTV_cfT(M,I,A,B,D)  A
+#define       LOGICALV_cfT(M,I,A,B,D)  A
+#define          LONGV_cfT(M,I,A,B,D)  A
+#define      LONGLONGV_cfT(M,I,A,B,D)  A /* added by MR December 2005 */
+#define         SHORTV_cfT(M,I,A,B,D)  A
+#define         BYTEVV_cfT(M,I,A,B,D)  (void *)A /* We have to cast to void *,*/
+#define        BYTEVVV_cfT(M,I,A,B,D)  (void *)A /* since we don't know the   */
+#define       BYTEVVVV_cfT(M,I,A,B,D)  (void *)A /* dimensions of the array.  */
+#define      BYTEVVVVV_cfT(M,I,A,B,D)  (void *)A /* i.e. Unfortunately, can't */
+#define     BYTEVVVVVV_cfT(M,I,A,B,D)  (void *)A /* check that the type       */
+#define    BYTEVVVVVVV_cfT(M,I,A,B,D)  (void *)A /* matches the prototype.    */
+#define       DOUBLEVV_cfT(M,I,A,B,D)  (void *)A
+#define      DOUBLEVVV_cfT(M,I,A,B,D)  (void *)A
+#define     DOUBLEVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    DOUBLEVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   DOUBLEVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define  DOUBLEVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define        FLOATVV_cfT(M,I,A,B,D)  (void *)A
+#define       FLOATVVV_cfT(M,I,A,B,D)  (void *)A
+#define      FLOATVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     FLOATVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    FLOATVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   FLOATVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define          INTVV_cfT(M,I,A,B,D)  (void *)A  
+#define         INTVVV_cfT(M,I,A,B,D)  (void *)A  
+#define        INTVVVV_cfT(M,I,A,B,D)  (void *)A  
+#define       INTVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      INTVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     INTVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      LOGICALVV_cfT(M,I,A,B,D)  (void *)A
+#define     LOGICALVVV_cfT(M,I,A,B,D)  (void *)A
+#define    LOGICALVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   LOGICALVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define  LOGICALVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define LOGICALVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define         LONGVV_cfT(M,I,A,B,D)  (void *)A
+#define        LONGVVV_cfT(M,I,A,B,D)  (void *)A
+#define       LONGVVVV_cfT(M,I,A,B,D)  (void *)A
+#define      LONGVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     LONGVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    LONGVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     LONGLONGVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define    LONGLONGVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define   LONGLONGVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define  LONGLONGVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define LONGLONGVVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define LONGLONGVVVVVVV_cfT(M,I,A,B,D)  (void *)A /* added by MR December 2005 */
+#define        SHORTVV_cfT(M,I,A,B,D)  (void *)A
+#define       SHORTVVV_cfT(M,I,A,B,D)  (void *)A
+#define      SHORTVVVV_cfT(M,I,A,B,D)  (void *)A
+#define     SHORTVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define    SHORTVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define   SHORTVVVVVVV_cfT(M,I,A,B,D)  (void *)A
+#define          PBYTE_cfT(M,I,A,B,D)  A
+#define        PDOUBLE_cfT(M,I,A,B,D)  A
+#define         PFLOAT_cfT(M,I,A,B,D)  VOIDP A
+#define           PINT_cfT(M,I,A,B,D)  A
+#define       PLOGICAL_cfT(M,I,A,B,D)  ((*A=F2CLOGICAL(*A)),A)
+#define          PLONG_cfT(M,I,A,B,D)  A
+#define      PLONGLONG_cfT(M,I,A,B,D)  A /* added by MR December 2005 */
+#define         PSHORT_cfT(M,I,A,B,D)  A
+#define          PVOID_cfT(M,I,A,B,D)  A
+#if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran)
+#define        ROUTINE_cfT(M,I,A,B,D)  _(ROUTINE_,I)  (*A)
+#else
+#define        ROUTINE_cfT(M,I,A,B,D)  _(ROUTINE_,I)    A
+#endif
+/* A == pointer to the characters
+   D == length of the string, or of an element in an array of strings
+   E == number of elements in an array of strings                             */
+#define TTSTR(    A,B,D)                                                       \
+           ((B=_cf_malloc(D+1))[D]='\0', memcpy(B,A,D), kill_trailing(B,' '))
+#define TTTTSTR(  A,B,D)   (!(D<4||A[0]||A[1]||A[2]||A[3]))?NULL:              \
+                            memchr(A,'\0',D)                 ?A   : TTSTR(A,B,D)
+#define TTTTSTRV( A,B,D,E) (_(B,N)=E,B=_cf_malloc(_(B,N)*(D+1)), (void *)      \
+  vkill_trailing(f2cstrv(A,B,D+1, _(B,N)*(D+1)), D+1,_(B,N)*(D+1),' '))
+#ifdef vmsFortran
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(A->dsc$a_pointer, B,           \
+                                             A->dsc$w_length , A->dsc$l_m[0])
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define       PPSTRING_cfT(M,I,A,B,D)           A->dsc$a_pointer
+#else
+#ifdef CRAYFortran
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( _fcdtocp(A),B,_fcdlen(A))
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(_fcdtocp(A),B,_fcdlen(A),      \
+                              num_elem(_fcdtocp(A),_fcdlen(A),_3(M,_STRV_A,I)))
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( _fcdtocp(A),B,_fcdlen(A))
+#define       PPSTRING_cfT(M,I,A,B,D)           _fcdtocp(A)
+#else
+#define         STRING_cfT(M,I,A,B,D)  TTTTSTR( A,B,D)
+#define        STRINGV_cfT(M,I,A,B,D)  TTTTSTRV(A,B,D, num_elem(A,D,_3(M,_STRV_A,I)))
+#define        PSTRING_cfT(M,I,A,B,D)    TTSTR( A,B,D)
+#define       PPSTRING_cfT(M,I,A,B,D)           ((void)D, A)
+#endif
+#endif
+#define       PNSTRING_cfT(M,I,A,B,D)    STRING_cfT(M,I,A,B,D)
+#define       PSTRINGV_cfT(M,I,A,B,D)   STRINGV_cfT(M,I,A,B,D)
+#define           CF_0_cfT(M,I,A,B,D)
+
+#define RCF(TN,I)           _(TN,_cfSTR)(3,R,_(A,I),_(B,I),_(C,I),0,0)
+#define  DEFAULT_cfR(A,B,D)
+#define  LOGICAL_cfR(A,B,D)
+#define PLOGICAL_cfR(A,B,D) *A=C2FLOGICAL(*A);
+#define   STRING_cfR(A,B,D) if (B) _cf_free(B);
+#define  STRINGV_cfR(A,B,D) _cf_free(B);
+/* A and D as defined above for TSTRING(V) */
+#define RRRRPSTR( A,B,D)    if (B) memcpy(A,B, _cfMIN(strlen(B),D)),           \
+                  (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), _cf_free(B);
+#define RRRRPSTRV(A,B,D)    c2fstrv(B,A,D+1,(D+1)*_(B,N)), _cf_free(B);
+#ifdef vmsFortran
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( A->dsc$a_pointer,B,A->dsc$w_length)
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A->dsc$a_pointer,B,A->dsc$w_length)
+#else
+#ifdef CRAYFortran
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( _fcdtocp(A),B,_fcdlen(A))
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(_fcdtocp(A),B,_fcdlen(A))
+#else
+#define  PSTRING_cfR(A,B,D) RRRRPSTR( A,B,D)
+#define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A,B,D)
+#endif
+#endif
+#define PNSTRING_cfR(A,B,D) PSTRING_cfR(A,B,D)
+#define PPSTRING_cfR(A,B,D)
+
+#define    BYTE_cfFZ(UN,LN) INTEGER_BYTE     FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define  DOUBLE_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define     INT_cfFZ(UN,LN) int   FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define LOGICAL_cfFZ(UN,LN) int   FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define    LONG_cfFZ(UN,LN) long  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define LONGLONG_cfFZ(UN,LN) LONGLONG FCALLSC_QUALIFIER fcallsc(UN,LN)( /* added by MR December 2005 */
+#define   SHORT_cfFZ(UN,LN) short FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#define    VOID_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#ifndef __CF__KnR
+/* The void is req'd by the Apollo, to make this an ANSI function declaration.
+   The Apollo promotes K&R float functions to double. */
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(void
+#else
+#define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(void
+#endif
+#ifdef vmsFortran
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(fstring *AS
+#else
+#ifdef CRAYFortran
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(_fcd     AS
+#else
+#if  defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(char    *AS
+#else
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(char    *AS, unsigned D0
+#endif
+#endif
+#endif
+#else
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define   FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION  FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#else
+#define   FLOAT_cfFZ(UN,LN) FORTRAN_REAL      FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#else
+#define   FLOAT_cfFZ(UN,LN) FLOATFUNCTIONTYPE FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#if defined(vmsFortran) || defined(CRAYFortran) || defined(AbsoftUNIXFortran)
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(AS
+#else
+#define  STRING_cfFZ(UN,LN) void  FCALLSC_QUALIFIER fcallsc(UN,LN)(AS, D0
+#endif
+#endif
+
+#define    BYTE_cfF(UN,LN)     BYTE_cfFZ(UN,LN)
+#define  DOUBLE_cfF(UN,LN)   DOUBLE_cfFZ(UN,LN)
+#ifndef __CF_KnR
+#if defined (f2cFortran) && ! defined (gFortran)
+/* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */
+#define   FLOAT_cfF(UN,LN)  DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#else
+#define   FLOAT_cfF(UN,LN)  FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(
+#endif
+#else
+#define   FLOAT_cfF(UN,LN)    FLOAT_cfFZ(UN,LN)
+#endif
+#define     INT_cfF(UN,LN)      INT_cfFZ(UN,LN)
+#define LOGICAL_cfF(UN,LN)  LOGICAL_cfFZ(UN,LN)
+#define    LONG_cfF(UN,LN)     LONG_cfFZ(UN,LN)
+#define LONGLONG_cfF(UN,LN) LONGLONG_cfFZ(UN,LN) /* added by MR December 2005 */
+#define   SHORT_cfF(UN,LN)    SHORT_cfFZ(UN,LN)
+#define    VOID_cfF(UN,LN)     VOID_cfFZ(UN,LN)
+#define  STRING_cfF(UN,LN)   STRING_cfFZ(UN,LN),
+
+#define     INT_cfFF
+#define    VOID_cfFF
+#ifdef vmsFortran
+#define  STRING_cfFF           fstring *AS; 
+#else
+#ifdef CRAYFortran
+#define  STRING_cfFF           _fcd     AS;
+#else
+#define  STRING_cfFF           char    *AS; unsigned D0;
+#endif
+#endif
+
+#define     INT_cfL            A0=
+#define  STRING_cfL            A0=
+#define    VOID_cfL                        
+
+#define    INT_cfK
+#define   VOID_cfK
+/* KSTRING copies the string into the position provided by the caller. */
+#ifdef vmsFortran
+#define STRING_cfK                                                             \
+ memcpy(AS->dsc$a_pointer,A0,_cfMIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))));\
+ AS->dsc$w_length>(A0==NULL?0:strlen(A0))?                                     \
+  memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ',                        \
+         AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0;
+#else
+#ifdef CRAYFortran
+#define STRING_cfK                                                             \
+ memcpy(_fcdtocp(AS),A0, _cfMIN(_fcdlen(AS),(A0==NULL?0:strlen(A0))) );        \
+ _fcdlen(AS)>(A0==NULL?0:strlen(A0))?                                          \
+  memset(_fcdtocp(AS)+(A0==NULL?0:strlen(A0)),' ',                             \
+         _fcdlen(AS)-(A0==NULL?0:strlen(A0))):0;
+#else
+#define STRING_cfK         memcpy(AS,A0, _cfMIN(D0,(A0==NULL?0:strlen(A0))) ); \
+                 D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \
+                                            ' ', D0-(A0==NULL?0:strlen(A0))):0;
+#endif
+#endif
+
+/* Note that K.. and I.. can't be combined since K.. has to access data before
+R.., in order for functions returning strings which are also passed in as
+arguments to work correctly. Note that R.. frees and hence may corrupt the
+string. */
+#define    BYTE_cfI  return A0;
+#define  DOUBLE_cfI  return A0;
+#if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT))
+#define   FLOAT_cfI  return A0;
+#else
+#define   FLOAT_cfI  RETURNFLOAT(A0);
+#endif
+#define     INT_cfI  return A0;
+#ifdef hpuxFortran800
+/* Incredibly, functions must return true as 1, elsewhere .true.==0x01000000. */
+#define LOGICAL_cfI  return ((A0)?1:0);
+#else
+#define LOGICAL_cfI  return C2FLOGICAL(A0);
+#endif
+#define    LONG_cfI  return A0;
+#define LONGLONG_cfI  return A0; /* added by MR December 2005 */
+#define   SHORT_cfI  return A0;
+#define  STRING_cfI  return   ;
+#define    VOID_cfI  return   ;
+
+#ifdef OLD_VAXC                                  /* Allow %CC-I-PARAMNOTUSED. */
+#pragma standard
+#endif
+
+#define FCALLSCSUB0( CN,UN,LN)             FCALLSCFUN0(VOID,CN,UN,LN)
+#define FCALLSCSUB1( CN,UN,LN,T1)          FCALLSCFUN1(VOID,CN,UN,LN,T1)
+#define FCALLSCSUB2( CN,UN,LN,T1,T2)       FCALLSCFUN2(VOID,CN,UN,LN,T1,T2)
+#define FCALLSCSUB3( CN,UN,LN,T1,T2,T3)    FCALLSCFUN3(VOID,CN,UN,LN,T1,T2,T3)
+#define FCALLSCSUB4( CN,UN,LN,T1,T2,T3,T4) \
+    FCALLSCFUN4(VOID,CN,UN,LN,T1,T2,T3,T4)
+#define FCALLSCSUB5( CN,UN,LN,T1,T2,T3,T4,T5) \
+    FCALLSCFUN5(VOID,CN,UN,LN,T1,T2,T3,T4,T5)
+#define FCALLSCSUB6( CN,UN,LN,T1,T2,T3,T4,T5,T6) \
+    FCALLSCFUN6(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6)       
+#define FCALLSCSUB7( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+    FCALLSCFUN7(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7)
+#define FCALLSCSUB8( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+    FCALLSCFUN8(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8)
+#define FCALLSCSUB9( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+    FCALLSCFUN9(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9)
+#define FCALLSCSUB10(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+   FCALLSCFUN10(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA)
+#define FCALLSCSUB11(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+   FCALLSCFUN11(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB)
+#define FCALLSCSUB12(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+   FCALLSCFUN12(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC)
+#define FCALLSCSUB13(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+   FCALLSCFUN13(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD)
+#define FCALLSCSUB14(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \
+   FCALLSCFUN14(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)
+#define FCALLSCSUB15(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+   FCALLSCFUN15(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF)
+#define FCALLSCSUB16(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+   FCALLSCFUN16(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG)
+#define FCALLSCSUB17(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+   FCALLSCFUN17(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH)
+#define FCALLSCSUB18(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+   FCALLSCFUN18(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI)
+#define FCALLSCSUB19(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+   FCALLSCFUN19(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ)
+#define FCALLSCSUB20(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+   FCALLSCFUN20(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)
+#define FCALLSCSUB21(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+   FCALLSCFUN21(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL)
+#define FCALLSCSUB22(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+   FCALLSCFUN22(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM)
+#define FCALLSCSUB23(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+   FCALLSCFUN23(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN)
+#define FCALLSCSUB24(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+   FCALLSCFUN24(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO)
+#define FCALLSCSUB25(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+   FCALLSCFUN25(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP)
+#define FCALLSCSUB26(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+   FCALLSCFUN26(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ)
+#define FCALLSCSUB27(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \
+   FCALLSCFUN27(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)
+
+
+#define FCALLSCFUN1( T0,CN,UN,LN,T1) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN2( T0,CN,UN,LN,T1,T2) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,CF_0,CF_0,CF_0)
+#define FCALLSCFUN3( T0,CN,UN,LN,T1,T2,T3) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,CF_0,CF_0)
+#define FCALLSCFUN4( T0,CN,UN,LN,T1,T2,T3,T4) \
+        FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,T4,CF_0)
+#define FCALLSCFUN5( T0,CN,UN,LN,T1,T2,T3,T4,T5) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN6( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN7( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0)
+#define FCALLSCFUN8( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0)
+#define FCALLSCFUN9( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \
+        FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0)
+#define FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN11(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0)
+#define FCALLSCFUN12(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0)
+#define FCALLSCFUN13(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \
+        FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0)
+
+
+#define FCALLSCFUN15(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN16(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN17(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0)
+#define FCALLSCFUN18(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0)
+#define FCALLSCFUN19(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \
+        FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0)
+#define FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN21(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN22(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN23(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0)
+#define FCALLSCFUN24(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0)
+#define FCALLSCFUN25(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0)
+#define FCALLSCFUN26(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \
+        FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0)
+
+
+#ifndef __CF__KnR
+#define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf2(T0))   \
+        {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)}
+
+#define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT14(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) )  \
+ {                 CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(    TCF(LN,T1,1,0)  TCF(LN,T2,2,1) \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1) TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1) \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) );                          _Icf(0,K,T0,0,0) \
+                   CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  _(T0,_cfI) }
+
+#define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)   \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT27(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ) \
+ {                 CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)   \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(     TCF(LN,T1,1,0)  TCF(LN,T2,2,1)  \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1)  TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1)  \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1)  TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \
+    TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \
+    TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \
+                   CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  _(T0,_cfI) }
+
+#else
+#define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf3(T0)) _Icf(0,FF,T0,0,0)\
+        {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)}
+
+#define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT14(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)) _Icf(0,FF,T0,0,0) \
+       CFARGT14FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE);   \
+ {                 CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)    \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(  TCF(LN,T1,1,0) TCF(LN,T2,2,1) \
+    TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \
+    TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) );                          _Icf(0,K,T0,0,0) \
+                   CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)  _(T0,_cfI)}
+
+#define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  \
+                                 CFextern _(T0,_cfF)(UN,LN)                    \
+ CFARGT27(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)) _Icf(0,FF,T0,0,0) \
+       CFARGT27FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR); \
+ {                 CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  \
+  _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0)      CN(     TCF(LN,T1,1,0)  TCF(LN,T2,2,1)  \
+    TCF(LN,T3,3,1)  TCF(LN,T4,4,1)  TCF(LN,T5,5,1)  TCF(LN,T6,6,1)  TCF(LN,T7,7,1)  \
+    TCF(LN,T8,8,1)  TCF(LN,T9,9,1)  TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \
+    TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \
+    TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \
+    TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \
+                   CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)  _(T0,_cfI)}
+
+#endif
+
+// clang-format on
+
+#endif /* __CFORTRAN_LOADED */
+#endif
+// Automatically generated by make_fint.c, don't edit!
+
+// clang-format off
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef CDI_H_
+#include "cdi.h"
+#endif
+
+#ifdef HAVE_CF_INTERFACE
+
+#include <limits.h>
+#include <assert.h>
+
+#ifndef __CFORTRAN_LOADED
+#  if defined __clang__
+#    pragma GCC diagnostic push
+#    pragma GCC diagnostic ignored "-Wreserved-id-macro"
+#  endif
+#  include "cfortran.h"
+#  if defined __clang__
+#    pragma GCC diagnostic pop
+#  endif
+#endif
+/* These functions are meant to be called from Fortran and don't
+ * need an interface declaration in a C header. */
+#ifdef __clang__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wmissing-prototypes"
+#endif
+
+#ifdef CDI_H_
+
+static inline
+int SizeType_c2f(SizeType value_SizeType)
+{
+  assert(value_SizeType < INT_MAX);
+  return (int) value_SizeType;
+}
+
+#endif
+
+/*  Start of fortran interface for the following routines (make_fint.c)  */
+
+
+/*  Byte order  */
+
+
+/*  Error identifier  */
+
+
+/*  File types  */
+
+
+/*  Compatibility defines for release 1.8.3 (obsolete defines)  */
+
+
+/*  Protocols (in filename/URI)  */
+
+
+/*  Compress types  */
+
+
+/*  external data types  */
+
+
+/*  Compatibility defines for release 1.8.3 (obsolete defines)  */
+
+
+/*  internal data types  */
+
+
+/*  Chunk types  */
+
+
+/*  GRID types  */
+
+
+/*  ZAXIS types  */
+
+
+/*  SUBTYPE types  */
+
+
+/*  Data structure defining a key-value search, possibly with multiple
+   key-value pairs in combination.
+
+   Currently, only multiple pairs combined by AND are supported.  */
+
+
+/*  TIME types  */
+
+
+/*  TSTEP types  */
+
+
+/*  TAXIS types  */
+
+
+/*  TUNIT types  */
+
+
+/*  CALENDAR types  */
+
+
+/*  number of unsigned char needed to store UUID  */
+
+
+/*  Structs that are used to return data to the user  */
+
+
+/*  Opaque types  */
+
+
+/*  CDI control routines  */
+
+FCALLSCSUB0 (cdiReset, CDIRESET, cdireset)
+FCALLSCFUN1 (STRING, cdiStringError, CDISTRINGERROR, cdistringerror, INT)
+FCALLSCSUB1 (cdiDebug, CDIDEBUG, cdidebug, INT)
+FCALLSCFUN0 (STRING, cdiLibraryVersion, CDILIBRARYVERSION, cdilibraryversion)
+FCALLSCSUB0 (cdiPrintVersion, CDIPRINTVERSION, cdiprintversion)
+FCALLSCFUN1 (INT, cdiHaveFiletype, CDIHAVEFILETYPE, cdihavefiletype, INT)
+FCALLSCSUB1 (cdiDefMissval, CDIDEFMISSVAL, cdidefmissval, DOUBLE)
+FCALLSCFUN0 (DOUBLE, cdiInqMissval, CDIINQMISSVAL, cdiinqmissval)
+FCALLSCSUB2 (cdiDefGlobal, CDIDEFGLOBAL, cdidefglobal, STRING, INT)
+FCALLSCFUN0 (INT, namespaceNew, NAMESPACENEW, namespacenew)
+FCALLSCSUB1 (namespaceSetActive, NAMESPACESETACTIVE, namespacesetactive, INT)
+FCALLSCFUN0 (INT, namespaceGetActive, NAMESPACEGETACTIVE, namespacegetactive)
+FCALLSCSUB1 (namespaceDelete, NAMESPACEDELETE, namespacedelete, INT)
+
+/*  CDI converter routines  */
+
+
+/*  parameter  */
+
+FCALLSCSUB3 (cdiParamToString, CDIPARAMTOSTRING, cdiparamtostring, INT, PSTRING, INT)
+FCALLSCSUB4 (cdiDecodeParam, CDIDECODEPARAM, cdidecodeparam, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeParam, CDIENCODEPARAM, cdiencodeparam, INT, INT, INT)
+
+/*  date format:  YYYYMMDD  */
+
+
+/*  time format:    hhmmss  */
+
+FCALLSCSUB4 (cdiDecodeDate, CDIDECODEDATE, cdidecodedate, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeDate, CDIENCODEDATE, cdiencodedate, INT, INT, INT)
+FCALLSCSUB4 (cdiDecodeTime, CDIDECODETIME, cdidecodetime, INT, PINT, PINT, PINT)
+FCALLSCFUN3 (INT, cdiEncodeTime, CDIENCODETIME, cdiencodetime, INT, INT, INT)
+
+/*  STREAM control routines  */
+
+FCALLSCFUN2 (INT, cdiGetFiletype, CDIGETFILETYPE, cdigetfiletype, STRING, PINT)
+FCALLSCFUN1 (INT, streamOpenRead, STREAMOPENREAD, streamopenread, STRING)
+FCALLSCFUN2 (INT, streamOpenWrite, STREAMOPENWRITE, streamopenwrite, STRING, INT)
+FCALLSCFUN1 (INT, streamOpenAppend, STREAMOPENAPPEND, streamopenappend, STRING)
+FCALLSCSUB1 (streamClose, STREAMCLOSE, streamclose, INT)
+FCALLSCSUB1 (streamSync, STREAMSYNC, streamsync, INT)
+FCALLSCSUB2 (streamDefMaxSteps, STREAMDEFMAXSTEPS, streamdefmaxsteps, INT, INT)
+FCALLSCSUB2 (streamDefNumWorker, STREAMDEFNUMWORKER, streamdefnumworker, INT, INT)
+FCALLSCFUN1 (INT, streamInqNumSteps, STREAMINQNUMSTEPS, streaminqnumsteps, INT)
+FCALLSCSUB2 (streamDefVlist, STREAMDEFVLIST, streamdefvlist, INT, INT)
+FCALLSCFUN1 (INT, streamInqVlist, STREAMINQVLIST, streaminqvlist, INT)
+FCALLSCFUN1 (INT, streamInqFiletype, STREAMINQFILETYPE, streaminqfiletype, INT)
+FCALLSCSUB2 (streamDefByteorder, STREAMDEFBYTEORDER, streamdefbyteorder, INT, INT)
+FCALLSCFUN1 (INT, streamInqByteorder, STREAMINQBYTEORDER, streaminqbyteorder, INT)
+FCALLSCSUB2 (streamDefShuffle, STREAMDEFSHUFFLE, streamdefshuffle, INT, INT)
+FCALLSCSUB2 (streamDefFilter, STREAMDEFFILTER, streamdeffilter, INT, STRING)
+FCALLSCSUB2 (streamDefCompType, STREAMDEFCOMPTYPE, streamdefcomptype, INT, INT)
+FCALLSCFUN1 (INT, streamInqCompType, STREAMINQCOMPTYPE, streaminqcomptype, INT)
+FCALLSCSUB2 (streamDefCompLevel, STREAMDEFCOMPLEVEL, streamdefcomplevel, INT, INT)
+FCALLSCFUN1 (INT, streamInqCompLevel, STREAMINQCOMPLEVEL, streaminqcomplevel, INT)
+FCALLSCFUN2 (INT, streamDefTimestep, STREAMDEFTIMESTEP, streamdeftimestep, INT, INT)
+FCALLSCFUN2 (INT, streamInqTimestep, STREAMINQTIMESTEP, streaminqtimestep, INT, INT)
+FCALLSCFUN1 (INT, streamInqCurTimestepID, STREAMINQCURTIMESTEPID, streaminqcurtimestepid, INT)
+FCALLSCFUN1 (STRING, streamFilename, STREAMFILENAME, streamfilename, INT)
+FCALLSCFUN1 (STRING, streamFilesuffix, STREAMFILESUFFIX, streamfilesuffix, INT)
+static int streamNvals_fwrap(int streamID)
+{
+  SizeType v;
+  v = streamNvals(streamID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, streamNvals_fwrap, STREAMNVALS, streamnvals, INT)
+FCALLSCFUN1 (INT, streamInqNvars, STREAMINQNVARS, streaminqnvars, INT)
+
+/*  STREAM var I/O routines (random access)  */
+
+static void streamWriteVar_fwrap(int streamID, int varID, const double data[], int numMissVals)
+{
+  streamWriteVar(streamID, varID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB4 (streamWriteVar_fwrap, STREAMWRITEVAR, streamwritevar, INT, INT, DOUBLEV, INT)
+static void streamWriteVarF_fwrap(int streamID, int varID, const float data[], int numMissVals)
+{
+  streamWriteVarF(streamID, varID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB4 (streamWriteVarF_fwrap, STREAMWRITEVARF, streamwritevarf, INT, INT, FLOATV, INT)
+static void streamReadVar_fwrap(int streamID, int varID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVar(streamID, varID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB4 (streamReadVar_fwrap, STREAMREADVAR, streamreadvar, INT, INT, DOUBLEV, PINT)
+static void streamReadVarF_fwrap(int streamID, int varID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarF(streamID, varID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB4 (streamReadVarF_fwrap, STREAMREADVARF, streamreadvarf, INT, INT, FLOATV, PINT)
+static void streamWriteVarSlice_fwrap(int streamID, int varID, int levelID, const double data[], int numMissVals)
+{
+  streamWriteVarSlice(streamID, varID, levelID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarSlice_fwrap, STREAMWRITEVARSLICE, streamwritevarslice, INT, INT, INT, DOUBLEV, INT)
+static void streamWriteVarSliceF_fwrap(int streamID, int varID, int levelID, const float data[], int numMissVals)
+{
+  streamWriteVarSliceF(streamID, varID, levelID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarSliceF_fwrap, STREAMWRITEVARSLICEF, streamwritevarslicef, INT, INT, INT, FLOATV, INT)
+static void streamReadVarSlice_fwrap(int streamID, int varID, int levelID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarSlice(streamID, varID, levelID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB5 (streamReadVarSlice_fwrap, STREAMREADVARSLICE, streamreadvarslice, INT, INT, INT, DOUBLEV, PINT)
+static void streamReadVarSliceF_fwrap(int streamID, int varID, int levelID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadVarSliceF(streamID, varID, levelID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB5 (streamReadVarSliceF_fwrap, STREAMREADVARSLICEF, streamreadvarslicef, INT, INT, INT, FLOATV, PINT)
+static void streamWriteVarChunk_fwrap(int streamID, int varID, const int rect[][2], const double data[], int numMissVals)
+{
+  streamWriteVarChunk(streamID, varID, rect, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarChunk_fwrap, STREAMWRITEVARCHUNK, streamwritevarchunk, INT, INT, INTVV, DOUBLEV, INT)
+static void streamWriteVarChunkF_fwrap(int streamID, int varID, const int rect[][2], const float data[], int numMissVals)
+{
+  streamWriteVarChunkF(streamID, varID, rect, data, (SizeType)numMissVals);
+}
+FCALLSCSUB5 (streamWriteVarChunkF_fwrap, STREAMWRITEVARCHUNKF, streamwritevarchunkf, INT, INT, INTVV, FLOATV, INT)
+
+/*  STREAM record I/O routines (sequential access)  */
+
+FCALLSCSUB3 (streamDefRecord, STREAMDEFRECORD, streamdefrecord, INT, INT, INT)
+FCALLSCSUB3 (streamInqRecord, STREAMINQRECORD, streaminqrecord, INT, PINT, PINT)
+static void streamWriteRecord_fwrap(int streamID, const double data[], int numMissVals)
+{
+  streamWriteRecord(streamID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB3 (streamWriteRecord_fwrap, STREAMWRITERECORD, streamwriterecord, INT, DOUBLEV, INT)
+static void streamWriteRecordF_fwrap(int streamID, const float data[], int numMissVals)
+{
+  streamWriteRecordF(streamID, data, (SizeType)numMissVals);
+}
+FCALLSCSUB3 (streamWriteRecordF_fwrap, STREAMWRITERECORDF, streamwriterecordf, INT, FLOATV, INT)
+static void streamReadRecord_fwrap(int streamID, double data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadRecord(streamID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB3 (streamReadRecord_fwrap, STREAMREADRECORD, streamreadrecord, INT, DOUBLEV, PINT)
+static void streamReadRecordF_fwrap(int streamID, float data[], int *numMissVals)
+{
+  SizeType numMissVals_SizeType;
+  streamReadRecordF(streamID, data, &numMissVals_SizeType);
+  assert(numMissVals_SizeType < INT_MAX);
+  *numMissVals = numMissVals_SizeType;
+}
+FCALLSCSUB3 (streamReadRecordF_fwrap, STREAMREADRECORDF, streamreadrecordf, INT, FLOATV, PINT)
+FCALLSCSUB2 (streamCopyRecord, STREAMCOPYRECORD, streamcopyrecord, INT, INT)
+
+/*  File driven I/O (may yield better performance than using the streamXXX functions)  */
+
+
+/*  Creation & Destruction  */
+
+
+/*  Advancing an iterator  */
+
+
+/*  Introspecting metadata  */
+
+
+/*  All outXXX arguments to these functions may be NULL.  */
+
+
+/*  Reading data  */
+
+
+/*  TODO[NH]: Add functions to read partial fields.  */
+
+
+/*  Direct access to grib fields  */
+
+
+/*  Callthroughs to GRIB-API  */
+
+
+/*  Convenience functions for accessing GRIB-API keys  */
+
+
+/*  VLIST routines  */
+
+FCALLSCFUN0 (INT, vlistCreate, VLISTCREATE, vlistcreate)
+FCALLSCSUB1 (vlistDestroy, VLISTDESTROY, vlistdestroy, INT)
+FCALLSCFUN1 (INT, vlistDuplicate, VLISTDUPLICATE, vlistduplicate, INT)
+FCALLSCSUB2 (vlistCopyFlag, VLISTCOPYFLAG, vlistcopyflag, INT, INT)
+FCALLSCSUB1 (vlistClearFlag, VLISTCLEARFLAG, vlistclearflag, INT)
+FCALLSCSUB2 (vlistCat, VLISTCAT, vlistcat, INT, INT)
+FCALLSCSUB2 (vlistMerge, VLISTMERGE, vlistmerge, INT, INT)
+FCALLSCSUB1 (vlistPrint, VLISTPRINT, vlistprint, INT)
+FCALLSCFUN1 (INT, vlistNumber, VLISTNUMBER, vlistnumber, INT)
+FCALLSCFUN1 (INT, vlistNvars, VLISTNVARS, vlistnvars, INT)
+FCALLSCFUN1 (INT, vlistNumGrids, VLISTNUMGRIDS, vlistnumgrids, INT)
+FCALLSCFUN1 (INT, vlistNumZaxis, VLISTNUMZAXIS, vlistnumzaxis, INT)
+FCALLSCFUN1 (INT, vlistNsubtypes, VLISTNSUBTYPES, vlistnsubtypes, INT)
+FCALLSCSUB2 (vlistDefNtsteps, VLISTDEFNTSTEPS, vlistdefntsteps, INT, INT)
+FCALLSCFUN1 (INT, vlistNtsteps, VLISTNTSTEPS, vlistntsteps, INT)
+static int vlistGridsizeMax_fwrap(int vlistID)
+{
+  SizeType v;
+  v = vlistGridsizeMax(vlistID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, vlistGridsizeMax_fwrap, VLISTGRIDSIZEMAX, vlistgridsizemax, INT)
+FCALLSCFUN2 (INT, vlistGrid, VLISTGRID, vlistgrid, INT, INT)
+FCALLSCFUN2 (INT, vlistGridIndex, VLISTGRIDINDEX, vlistgridindex, INT, INT)
+FCALLSCSUB3 (vlistChangeGridIndex, VLISTCHANGEGRIDINDEX, vlistchangegridindex, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeGrid, VLISTCHANGEGRID, vlistchangegrid, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistZaxis, VLISTZAXIS, vlistzaxis, INT, INT)
+FCALLSCFUN2 (INT, vlistZaxisIndex, VLISTZAXISINDEX, vlistzaxisindex, INT, INT)
+FCALLSCSUB3 (vlistChangeZaxisIndex, VLISTCHANGEZAXISINDEX, vlistchangezaxisindex, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeZaxis, VLISTCHANGEZAXIS, vlistchangezaxis, INT, INT, INT)
+FCALLSCFUN1 (INT, vlistNumRecords, VLISTNUMRECORDS, vlistnumrecords, INT)
+FCALLSCFUN2 (INT, vlistSubtype, VLISTSUBTYPE, vlistsubtype, INT, INT)
+FCALLSCFUN2 (INT, vlistSubtypeIndex, VLISTSUBTYPEINDEX, vlistsubtypeindex, INT, INT)
+FCALLSCSUB2 (vlistDefTaxis, VLISTDEFTAXIS, vlistdeftaxis, INT, INT)
+FCALLSCFUN1 (INT, vlistInqTaxis, VLISTINQTAXIS, vlistinqtaxis, INT)
+FCALLSCSUB2 (vlistDefTable, VLISTDEFTABLE, vlistdeftable, INT, INT)
+FCALLSCFUN1 (INT, vlistInqTable, VLISTINQTABLE, vlistinqtable, INT)
+FCALLSCSUB2 (vlistDefInstitut, VLISTDEFINSTITUT, vlistdefinstitut, INT, INT)
+FCALLSCFUN1 (INT, vlistInqInstitut, VLISTINQINSTITUT, vlistinqinstitut, INT)
+FCALLSCSUB2 (vlistDefModel, VLISTDEFMODEL, vlistdefmodel, INT, INT)
+FCALLSCFUN1 (INT, vlistInqModel, VLISTINQMODEL, vlistinqmodel, INT)
+
+/*  VLIST VAR routines  */
+
+FCALLSCFUN5 (INT, vlistDefVarTiles, VLISTDEFVARTILES, vlistdefvartiles, INT, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, vlistDefVar, VLISTDEFVAR, vlistdefvar, INT, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeVarGrid, VLISTCHANGEVARGRID, vlistchangevargrid, INT, INT, INT)
+FCALLSCSUB3 (vlistChangeVarZaxis, VLISTCHANGEVARZAXIS, vlistchangevarzaxis, INT, INT, INT)
+FCALLSCSUB5 (vlistInqVar, VLISTINQVAR, vlistinqvar, INT, INT, PINT, PINT, PINT)
+FCALLSCFUN2 (INT, vlistInqVarGrid, VLISTINQVARGRID, vlistinqvargrid, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarZaxis, VLISTINQVARZAXIS, vlistinqvarzaxis, INT, INT)
+
+/*  used in MPIOM  */
+
+FCALLSCFUN2 (INT, vlistInqVarID, VLISTINQVARID, vlistinqvarid, INT, INT)
+FCALLSCSUB3 (vlistDefVarTimetype, VLISTDEFVARTIMETYPE, vlistdefvartimetype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTimetype, VLISTINQVARTIMETYPE, vlistinqvartimetype, INT, INT)
+FCALLSCSUB3 (vlistDefVarTsteptype, VLISTDEFVARTSTEPTYPE, vlistdefvartsteptype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTsteptype, VLISTINQVARTSTEPTYPE, vlistinqvartsteptype, INT, INT)
+FCALLSCSUB3 (vlistDefVarCompType, VLISTDEFVARCOMPTYPE, vlistdefvarcomptype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCompType, VLISTINQVARCOMPTYPE, vlistinqvarcomptype, INT, INT)
+FCALLSCSUB3 (vlistDefVarCompLevel, VLISTDEFVARCOMPLEVEL, vlistdefvarcomplevel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCompLevel, VLISTINQVARCOMPLEVEL, vlistinqvarcomplevel, INT, INT)
+FCALLSCSUB3 (vlistDefVarParam, VLISTDEFVARPARAM, vlistdefvarparam, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarParam, VLISTINQVARPARAM, vlistinqvarparam, INT, INT)
+FCALLSCSUB3 (vlistDefVarCode, VLISTDEFVARCODE, vlistdefvarcode, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarCode, VLISTINQVARCODE, vlistinqvarcode, INT, INT)
+FCALLSCSUB3 (vlistDefVarDatatype, VLISTDEFVARDATATYPE, vlistdefvardatatype, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarDatatype, VLISTINQVARDATATYPE, vlistinqvardatatype, INT, INT)
+FCALLSCSUB3 (vlistDefVarXYZ, VLISTDEFVARXYZ, vlistdefvarxyz, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarXYZ, VLISTINQVARXYZ, vlistinqvarxyz, INT, INT)
+FCALLSCSUB3 (vlistDefVarNSB, VLISTDEFVARNSB, vlistdefvarnsb, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarNSB, VLISTINQVARNSB, vlistinqvarnsb, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarNumber, VLISTINQVARNUMBER, vlistinqvarnumber, INT, INT)
+FCALLSCSUB3 (vlistDefVarInstitut, VLISTDEFVARINSTITUT, vlistdefvarinstitut, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarInstitut, VLISTINQVARINSTITUT, vlistinqvarinstitut, INT, INT)
+FCALLSCSUB3 (vlistDefVarModel, VLISTDEFVARMODEL, vlistdefvarmodel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarModel, VLISTINQVARMODEL, vlistinqvarmodel, INT, INT)
+FCALLSCSUB3 (vlistDefVarTable, VLISTDEFVARTABLE, vlistdefvartable, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTable, VLISTINQVARTABLE, vlistinqvartable, INT, INT)
+FCALLSCSUB3 (vlistDefVarName, VLISTDEFVARNAME, vlistdefvarname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarName, VLISTINQVARNAME, vlistinqvarname, INT, INT, PSTRING)
+FCALLSCFUN2 (STRING, vlistCopyVarName, VLISTCOPYVARNAME, vlistcopyvarname, INT, INT)
+FCALLSCSUB3 (vlistDefVarStdname, VLISTDEFVARSTDNAME, vlistdefvarstdname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarStdname, VLISTINQVARSTDNAME, vlistinqvarstdname, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarLongname, VLISTDEFVARLONGNAME, vlistdefvarlongname, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarLongname, VLISTINQVARLONGNAME, vlistinqvarlongname, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarUnits, VLISTDEFVARUNITS, vlistdefvarunits, INT, INT, STRING)
+FCALLSCSUB3 (vlistInqVarUnits, VLISTINQVARUNITS, vlistinqvarunits, INT, INT, PSTRING)
+FCALLSCSUB3 (vlistDefVarMissval, VLISTDEFVARMISSVAL, vlistdefvarmissval, INT, INT, DOUBLE)
+FCALLSCFUN2 (DOUBLE, vlistInqVarMissval, VLISTINQVARMISSVAL, vlistinqvarmissval, INT, INT)
+static int vlistInqVarSize_fwrap(int vlistID, int varID)
+{
+  SizeType v;
+  v = vlistInqVarSize(vlistID, varID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, vlistInqVarSize_fwrap, VLISTINQVARSIZE, vlistinqvarsize, INT, INT)
+FCALLSCSUB4 (vlistDefIndex, VLISTDEFINDEX, vlistdefindex, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, vlistInqIndex, VLISTINQINDEX, vlistinqindex, INT, INT, INT)
+FCALLSCSUB4 (vlistDefFlag, VLISTDEFFLAG, vlistdefflag, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, vlistInqFlag, VLISTINQFLAG, vlistinqflag, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistFindVar, VLISTFINDVAR, vlistfindvar, INT, INT)
+FCALLSCFUN3 (INT, vlistFindLevel, VLISTFINDLEVEL, vlistfindlevel, INT, INT, INT)
+FCALLSCFUN2 (INT, vlistMergedVar, VLISTMERGEDVAR, vlistmergedvar, INT, INT)
+FCALLSCFUN3 (INT, vlistMergedLevel, VLISTMERGEDLEVEL, vlistmergedlevel, INT, INT, INT)
+FCALLSCSUB0 (cdiClearAdditionalKeys, CDICLEARADDITIONALKEYS, cdiclearadditionalkeys)
+FCALLSCSUB1 (cdiDefAdditionalKey, CDIDEFADDITIONALKEY, cdidefadditionalkey, STRING)
+FCALLSCSUB4 (vlistDefVarIntKey, VLISTDEFVARINTKEY, vlistdefvarintkey, INT, INT, STRING, INT)
+FCALLSCSUB4 (vlistDefVarDblKey, VLISTDEFVARDBLKEY, vlistdefvardblkey, INT, INT, STRING, DOUBLE)
+FCALLSCFUN3 (INT, vlistHasVarKey, VLISTHASVARKEY, vlisthasvarkey, INT, INT, STRING)
+FCALLSCFUN3 (DOUBLE, vlistInqVarDblKey, VLISTINQVARDBLKEY, vlistinqvardblkey, INT, INT, STRING)
+FCALLSCFUN3 (INT, vlistInqVarIntKey, VLISTINQVARINTKEY, vlistinqvarintkey, INT, INT, STRING)
+
+/*  CDI attributes  */
+
+FCALLSCFUN3 (INT, cdiInqNatts, CDIINQNATTS, cdiinqnatts, INT, INT, PINT)
+FCALLSCFUN6 (INT, cdiInqAtt, CDIINQATT, cdiinqatt, INT, INT, INT, PSTRING, PINT, PINT)
+FCALLSCFUN3 (INT, cdiInqAttLen, CDIINQATTLEN, cdiinqattlen, INT, INT, STRING)
+FCALLSCFUN3 (INT, cdiInqAttType, CDIINQATTTYPE, cdiinqatttype, INT, INT, STRING)
+FCALLSCFUN3 (INT, cdiDelAtt, CDIDELATT, cdidelatt, INT, INT, STRING)
+FCALLSCFUN4 (INT, cdiCopyAtts, CDICOPYATTS, cdicopyatts, INT, INT, INT, INT)
+FCALLSCFUN6 (INT, cdiDefAttInt, CDIDEFATTINT, cdidefattint, INT, INT, STRING, INT, INT, INTV)
+FCALLSCFUN6 (INT, cdiDefAttFlt, CDIDEFATTFLT, cdidefattflt, INT, INT, STRING, INT, INT, DOUBLEV)
+FCALLSCFUN5 (INT, cdiDefAttTxt, CDIDEFATTTXT, cdidefatttxt, INT, INT, STRING, INT, PPSTRING)
+FCALLSCFUN5 (INT, cdiInqAttInt, CDIINQATTINT, cdiinqattint, INT, INT, STRING, INT, INTV)
+FCALLSCFUN5 (INT, cdiInqAttFlt, CDIINQATTFLT, cdiinqattflt, INT, INT, STRING, INT, DOUBLEV)
+FCALLSCFUN5 (INT, cdiInqAttTxt, CDIINQATTTXT, cdiinqatttxt, INT, INT, STRING, INT, PPSTRING)
+
+/*  GRID routines  */
+
+FCALLSCSUB2 (gridName, GRIDNAME, gridname, INT, PSTRING)
+FCALLSCFUN1 (STRING, gridNamePtr, GRIDNAMEPTR, gridnameptr, INT)
+FCALLSCSUB1 (gridCompress, GRIDCOMPRESS, gridcompress, INT)
+FCALLSCSUB2 (gridDefMaskGME, GRIDDEFMASKGME, griddefmaskgme, INT, INTV)
+FCALLSCFUN2 (INT, gridInqMaskGME, GRIDINQMASKGME, gridinqmaskgme, INT, INTV)
+FCALLSCSUB2 (gridDefMask, GRIDDEFMASK, griddefmask, INT, INTV)
+FCALLSCFUN2 (INT, gridInqMask, GRIDINQMASK, gridinqmask, INT, INTV)
+static int gridCreate_fwrap(int gridtype, int size)
+{
+  int v;
+  v = gridCreate(gridtype, (SizeType)size);
+  return v;
+}
+FCALLSCFUN2 (INT, gridCreate_fwrap, GRIDCREATE, gridcreate, INT, INT)
+FCALLSCSUB1 (gridDestroy, GRIDDESTROY, griddestroy, INT)
+FCALLSCFUN1 (INT, gridDuplicate, GRIDDUPLICATE, gridduplicate, INT)
+FCALLSCSUB2 (gridDefProj, GRIDDEFPROJ, griddefproj, INT, INT)
+FCALLSCFUN1 (INT, gridInqProj, GRIDINQPROJ, gridinqproj, INT)
+FCALLSCFUN1 (INT, gridInqProjType, GRIDINQPROJTYPE, gridinqprojtype, INT)
+FCALLSCFUN1 (INT, gridInqType, GRIDINQTYPE, gridinqtype, INT)
+static int gridInqSize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqSize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqSize_fwrap, GRIDINQSIZE, gridinqsize, INT)
+static void gridDefXsize_fwrap(int gridID, int xsize)
+{
+  gridDefXsize(gridID, (SizeType)xsize);
+}
+FCALLSCSUB2 (gridDefXsize_fwrap, GRIDDEFXSIZE, griddefxsize, INT, INT)
+static int gridInqXsize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqXsize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqXsize_fwrap, GRIDINQXSIZE, gridinqxsize, INT)
+static void gridDefYsize_fwrap(int gridID, int ysize)
+{
+  gridDefYsize(gridID, (SizeType)ysize);
+}
+FCALLSCSUB2 (gridDefYsize_fwrap, GRIDDEFYSIZE, griddefysize, INT, INT)
+static int gridInqYsize_fwrap(int gridID)
+{
+  SizeType v;
+  v = gridInqYsize(gridID);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN1 (INT, gridInqYsize_fwrap, GRIDINQYSIZE, gridinqysize, INT)
+FCALLSCSUB2 (gridDefNP, GRIDDEFNP, griddefnp, INT, INT)
+FCALLSCFUN1 (INT, gridInqNP, GRIDINQNP, gridinqnp, INT)
+FCALLSCSUB2 (gridDefXvals, GRIDDEFXVALS, griddefxvals, INT, DOUBLEV)
+static int gridInqXvals_fwrap(int gridID, double xvals[])
+{
+  SizeType v;
+  v = gridInqXvals(gridID, xvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqXvals_fwrap, GRIDINQXVALS, gridinqxvals, INT, DOUBLEV)
+static int gridInqXvalsPart_fwrap(int gridID, int start, int size, double xvals[])
+{
+  SizeType v;
+  v = gridInqXvalsPart(gridID, start, (SizeType)size, xvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqXvalsPart_fwrap, GRIDINQXVALSPART, gridinqxvalspart, INT, INT, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridInqXIsc, GRIDINQXISC, gridinqxisc, INT)
+FCALLSCSUB2 (gridDefYvals, GRIDDEFYVALS, griddefyvals, INT, DOUBLEV)
+static int gridInqYvals_fwrap(int gridID, double yvals[])
+{
+  SizeType v;
+  v = gridInqYvals(gridID, yvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqYvals_fwrap, GRIDINQYVALS, gridinqyvals, INT, DOUBLEV)
+static int gridInqYvalsPart_fwrap(int gridID, int start, int size, double yvals[])
+{
+  SizeType v;
+  v = gridInqYvalsPart(gridID, start, (SizeType)size, yvals);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqYvalsPart_fwrap, GRIDINQYVALSPART, gridinqyvalspart, INT, INT, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridInqYIsc, GRIDINQYISC, gridinqyisc, INT)
+
+/*  CDI var keys  */
+
+
+/*  String keys  */
+
+
+/*  Integer keys  */
+
+
+/*  Floating point keys  */
+
+
+/*  Byte array keys  */
+
+FCALLSCFUN4 (INT, cdiDefKeyInt, CDIDEFKEYINT, cdidefkeyint, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, cdiInqKeyInt, CDIINQKEYINT, cdiinqkeyint, INT, INT, INT, PINT)
+FCALLSCFUN4 (INT, cdiDefKeyFloat, CDIDEFKEYFLOAT, cdidefkeyfloat, INT, INT, INT, DOUBLE)
+
+/*  cdiInqKeyFloat Get a float value from a key  */
+
+FCALLSCFUN4 (INT, cdiInqKeyFloat, CDIINQKEYFLOAT, cdiinqkeyfloat, INT, INT, INT, PDOUBLE)
+FCALLSCFUN4 (INT, cdiDefKeyString, CDIDEFKEYSTRING, cdidefkeystring, INT, INT, INT, STRING)
+FCALLSCFUN5 (INT, cdiInqKeyString, CDIINQKEYSTRING, cdiinqkeystring, INT, INT, INT, PSTRING, PINT)
+FCALLSCFUN4 (INT, cdiInqKeyLen, CDIINQKEYLEN, cdiinqkeylen, INT, INT, INT, PINT)
+FCALLSCFUN4 (INT, cdiCopyKeys, CDICOPYKEYS, cdicopykeys, INT, INT, INT, INT)
+FCALLSCFUN4 (INT, cdiCopyKey, CDICOPYKEY, cdicopykey, INT, INT, INT, INT)
+FCALLSCFUN3 (INT, cdiDeleteKey, CDIDELETEKEY, cdideletekey, INT, INT, INT)
+
+/*  GRID routines  */
+
+FCALLSCSUB2 (gridDefXname, GRIDDEFXNAME, griddefxname, INT, STRING)
+FCALLSCSUB2 (gridInqXname, GRIDINQXNAME, gridinqxname, INT, PSTRING)
+FCALLSCSUB2 (gridDefXlongname, GRIDDEFXLONGNAME, griddefxlongname, INT, STRING)
+FCALLSCSUB2 (gridInqXlongname, GRIDINQXLONGNAME, gridinqxlongname, INT, PSTRING)
+FCALLSCSUB2 (gridDefXunits, GRIDDEFXUNITS, griddefxunits, INT, STRING)
+FCALLSCSUB2 (gridInqXunits, GRIDINQXUNITS, gridinqxunits, INT, PSTRING)
+FCALLSCSUB2 (gridDefYname, GRIDDEFYNAME, griddefyname, INT, STRING)
+FCALLSCSUB2 (gridInqYname, GRIDINQYNAME, gridinqyname, INT, PSTRING)
+FCALLSCSUB2 (gridDefYlongname, GRIDDEFYLONGNAME, griddefylongname, INT, STRING)
+FCALLSCSUB2 (gridInqYlongname, GRIDINQYLONGNAME, gridinqylongname, INT, PSTRING)
+FCALLSCSUB2 (gridDefYunits, GRIDDEFYUNITS, griddefyunits, INT, STRING)
+FCALLSCSUB2 (gridInqYunits, GRIDINQYUNITS, gridinqyunits, INT, PSTRING)
+FCALLSCSUB2 (gridDefDatatype, GRIDDEFDATATYPE, griddefdatatype, INT, INT)
+FCALLSCFUN1 (INT, gridInqDatatype, GRIDINQDATATYPE, gridinqdatatype, INT)
+static double gridInqXval_fwrap(int gridID, int index)
+{
+  double v;
+  v = gridInqXval(gridID, (SizeType)index);
+  return v;
+}
+FCALLSCFUN2 (DOUBLE, gridInqXval_fwrap, GRIDINQXVAL, gridinqxval, INT, INT)
+static double gridInqYval_fwrap(int gridID, int index)
+{
+  double v;
+  v = gridInqYval(gridID, (SizeType)index);
+  return v;
+}
+FCALLSCFUN2 (DOUBLE, gridInqYval_fwrap, GRIDINQYVAL, gridinqyval, INT, INT)
+FCALLSCFUN1 (DOUBLE, gridInqXinc, GRIDINQXINC, gridinqxinc, INT)
+FCALLSCFUN1 (DOUBLE, gridInqYinc, GRIDINQYINC, gridinqyinc, INT)
+FCALLSCFUN1 (INT, gridIsCircular, GRIDISCIRCULAR, gridiscircular, INT)
+FCALLSCFUN1 (INT, gridInqTrunc, GRIDINQTRUNC, gridinqtrunc, INT)
+FCALLSCSUB2 (gridDefTrunc, GRIDDEFTRUNC, griddeftrunc, INT, INT)
+
+/*  Reference of an unstructured grid  */
+
+FCALLSCSUB2 (gridDefNumber, GRIDDEFNUMBER, griddefnumber, INT, INT)
+FCALLSCFUN1 (INT, gridInqNumber, GRIDINQNUMBER, gridinqnumber, INT)
+FCALLSCSUB2 (gridDefPosition, GRIDDEFPOSITION, griddefposition, INT, INT)
+FCALLSCFUN1 (INT, gridInqPosition, GRIDINQPOSITION, gridinqposition, INT)
+FCALLSCSUB2 (gridDefReference, GRIDDEFREFERENCE, griddefreference, INT, STRING)
+FCALLSCFUN2 (INT, gridInqReference, GRIDINQREFERENCE, gridinqreference, INT, PSTRING)
+FCALLSCSUB2 (gridDefUUID, GRIDDEFUUID, griddefuuid, INT, PVOID)
+FCALLSCSUB2 (gridInqUUID, GRIDINQUUID, gridinquuid, INT, PVOID)
+
+/*  Rotated Lon/Lat grid  */
+
+FCALLSCSUB4 (gridDefParamRLL, GRIDDEFPARAMRLL, griddefparamrll, INT, DOUBLE, DOUBLE, DOUBLE)
+FCALLSCSUB4 (gridInqParamRLL, GRIDINQPARAMRLL, gridinqparamrll, INT, PDOUBLE, PDOUBLE, PDOUBLE)
+
+/*  Hexagonal GME grid  */
+
+FCALLSCSUB5 (gridDefParamGME, GRIDDEFPARAMGME, griddefparamgme, INT, INT, INT, INT, INT)
+FCALLSCSUB5 (gridInqParamGME, GRIDINQPARAMGME, gridinqparamgme, INT, PINT, PINT, PINT, PINT)
+FCALLSCSUB2 (gridDefArea, GRIDDEFAREA, griddefarea, INT, DOUBLEV)
+FCALLSCSUB2 (gridInqArea, GRIDINQAREA, gridinqarea, INT, DOUBLEV)
+FCALLSCFUN1 (INT, gridHasArea, GRIDHASAREA, gridhasarea, INT)
+FCALLSCSUB2 (gridDefNvertex, GRIDDEFNVERTEX, griddefnvertex, INT, INT)
+FCALLSCFUN1 (INT, gridInqNvertex, GRIDINQNVERTEX, gridinqnvertex, INT)
+FCALLSCSUB2 (gridDefXbounds, GRIDDEFXBOUNDS, griddefxbounds, INT, DOUBLEV)
+static int gridInqXbounds_fwrap(int gridID, double xbounds[])
+{
+  SizeType v;
+  v = gridInqXbounds(gridID, xbounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqXbounds_fwrap, GRIDINQXBOUNDS, gridinqxbounds, INT, DOUBLEV)
+static int gridInqXboundsPart_fwrap(int gridID, int start, int size, double xbounds[])
+{
+  SizeType v;
+  v = gridInqXboundsPart(gridID, start, (SizeType)size, xbounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqXboundsPart_fwrap, GRIDINQXBOUNDSPART, gridinqxboundspart, INT, INT, INT, DOUBLEV)
+FCALLSCSUB2 (gridDefYbounds, GRIDDEFYBOUNDS, griddefybounds, INT, DOUBLEV)
+static int gridInqYbounds_fwrap(int gridID, double ybounds[])
+{
+  SizeType v;
+  v = gridInqYbounds(gridID, ybounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN2 (INT, gridInqYbounds_fwrap, GRIDINQYBOUNDS, gridinqybounds, INT, DOUBLEV)
+static int gridInqYboundsPart_fwrap(int gridID, int start, int size, double ybounds[])
+{
+  SizeType v;
+  v = gridInqYboundsPart(gridID, start, (SizeType)size, ybounds);
+  return SizeType_c2f(v);
+}
+FCALLSCFUN4 (INT, gridInqYboundsPart_fwrap, GRIDINQYBOUNDSPART, gridinqyboundspart, INT, INT, INT, DOUBLEV)
+FCALLSCSUB3 (gridDefReducedPoints, GRIDDEFREDUCEDPOINTS, griddefreducedpoints, INT, INT, INTV)
+FCALLSCSUB2 (gridInqReducedPoints, GRIDINQREDUCEDPOINTS, gridinqreducedpoints, INT, INTV)
+FCALLSCSUB2 (gridChangeType, GRIDCHANGETYPE, gridchangetype, INT, INT)
+FCALLSCSUB2 (gridDefComplexPacking, GRIDDEFCOMPLEXPACKING, griddefcomplexpacking, INT, INT)
+FCALLSCFUN1 (INT, gridInqComplexPacking, GRIDINQCOMPLEXPACKING, gridinqcomplexpacking, INT)
+
+/*  ZAXIS routines  */
+
+FCALLSCSUB2 (zaxisName, ZAXISNAME, zaxisname, INT, PSTRING)
+FCALLSCFUN1 (STRING, zaxisNamePtr, ZAXISNAMEPTR, zaxisnameptr, INT)
+FCALLSCFUN2 (INT, zaxisCreate, ZAXISCREATE, zaxiscreate, INT, INT)
+FCALLSCSUB1 (zaxisDestroy, ZAXISDESTROY, zaxisdestroy, INT)
+FCALLSCFUN1 (INT, zaxisInqType, ZAXISINQTYPE, zaxisinqtype, INT)
+FCALLSCFUN1 (INT, zaxisInqSize, ZAXISINQSIZE, zaxisinqsize, INT)
+FCALLSCFUN1 (INT, zaxisDuplicate, ZAXISDUPLICATE, zaxisduplicate, INT)
+FCALLSCSUB2 (zaxisDefLevels, ZAXISDEFLEVELS, zaxisdeflevels, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqLevels, ZAXISINQLEVELS, zaxisinqlevels, INT, DOUBLEV)
+FCALLSCFUN1 (INT, zaxisInqCLen, ZAXISINQCLEN, zaxisinqclen, INT)
+FCALLSCSUB3 (zaxisDefLevel, ZAXISDEFLEVEL, zaxisdeflevel, INT, INT, DOUBLE)
+FCALLSCFUN2 (DOUBLE, zaxisInqLevel, ZAXISINQLEVEL, zaxisinqlevel, INT, INT)
+FCALLSCSUB2 (zaxisDefNlevRef, ZAXISDEFNLEVREF, zaxisdefnlevref, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqNlevRef, ZAXISINQNLEVREF, zaxisinqnlevref, INT)
+FCALLSCSUB2 (zaxisDefNumber, ZAXISDEFNUMBER, zaxisdefnumber, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqNumber, ZAXISINQNUMBER, zaxisinqnumber, INT)
+FCALLSCSUB2 (zaxisDefUUID, ZAXISDEFUUID, zaxisdefuuid, INT, PVOID)
+FCALLSCSUB2 (zaxisInqUUID, ZAXISINQUUID, zaxisinquuid, INT, PVOID)
+FCALLSCSUB2 (zaxisDefName, ZAXISDEFNAME, zaxisdefname, INT, STRING)
+FCALLSCSUB2 (zaxisInqName, ZAXISINQNAME, zaxisinqname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefLongname, ZAXISDEFLONGNAME, zaxisdeflongname, INT, STRING)
+FCALLSCSUB2 (zaxisInqLongname, ZAXISINQLONGNAME, zaxisinqlongname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefUnits, ZAXISDEFUNITS, zaxisdefunits, INT, STRING)
+FCALLSCSUB2 (zaxisInqUnits, ZAXISINQUNITS, zaxisinqunits, INT, PSTRING)
+FCALLSCSUB2 (zaxisInqStdname, ZAXISINQSTDNAME, zaxisinqstdname, INT, PSTRING)
+FCALLSCSUB2 (zaxisDefDatatype, ZAXISDEFDATATYPE, zaxisdefdatatype, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqDatatype, ZAXISINQDATATYPE, zaxisinqdatatype, INT)
+FCALLSCSUB2 (zaxisDefPositive, ZAXISDEFPOSITIVE, zaxisdefpositive, INT, INT)
+FCALLSCFUN1 (INT, zaxisInqPositive, ZAXISINQPOSITIVE, zaxisinqpositive, INT)
+FCALLSCSUB1 (zaxisDefScalar, ZAXISDEFSCALAR, zaxisdefscalar, INT)
+FCALLSCFUN1 (INT, zaxisInqScalar, ZAXISINQSCALAR, zaxisinqscalar, INT)
+FCALLSCSUB3 (zaxisDefVct, ZAXISDEFVCT, zaxisdefvct, INT, INT, DOUBLEV)
+FCALLSCSUB2 (zaxisInqVct, ZAXISINQVCT, zaxisinqvct, INT, DOUBLEV)
+FCALLSCFUN1 (INT, zaxisInqVctSize, ZAXISINQVCTSIZE, zaxisinqvctsize, INT)
+FCALLSCSUB2 (zaxisDefLbounds, ZAXISDEFLBOUNDS, zaxisdeflbounds, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqLbounds, ZAXISINQLBOUNDS, zaxisinqlbounds, INT, DOUBLEV)
+FCALLSCFUN2 (DOUBLE, zaxisInqLbound, ZAXISINQLBOUND, zaxisinqlbound, INT, INT)
+FCALLSCSUB2 (zaxisDefUbounds, ZAXISDEFUBOUNDS, zaxisdefubounds, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqUbounds, ZAXISINQUBOUNDS, zaxisinqubounds, INT, DOUBLEV)
+FCALLSCFUN2 (DOUBLE, zaxisInqUbound, ZAXISINQUBOUND, zaxisinqubound, INT, INT)
+FCALLSCSUB2 (zaxisDefWeights, ZAXISDEFWEIGHTS, zaxisdefweights, INT, DOUBLEV)
+FCALLSCFUN2 (INT, zaxisInqWeights, ZAXISINQWEIGHTS, zaxisinqweights, INT, DOUBLEV)
+FCALLSCSUB2 (zaxisChangeType, ZAXISCHANGETYPE, zaxischangetype, INT, INT)
+
+/*  TAXIS routines  */
+
+FCALLSCFUN1 (INT, taxisCreate, TAXISCREATE, taxiscreate, INT)
+FCALLSCSUB1 (taxisDestroy, TAXISDESTROY, taxisdestroy, INT)
+FCALLSCFUN1 (INT, taxisDuplicate, TAXISDUPLICATE, taxisduplicate, INT)
+FCALLSCSUB2 (taxisCopyTimestep, TAXISCOPYTIMESTEP, taxiscopytimestep, INT, INT)
+FCALLSCSUB2 (taxisDefType, TAXISDEFTYPE, taxisdeftype, INT, INT)
+FCALLSCFUN1 (INT, taxisInqType, TAXISINQTYPE, taxisinqtype, INT)
+FCALLSCSUB2 (taxisDefVdate, TAXISDEFVDATE, taxisdefvdate, INT, INT)
+FCALLSCSUB2 (taxisDefVtime, TAXISDEFVTIME, taxisdefvtime, INT, INT)
+FCALLSCFUN1 (INT, taxisInqVdate, TAXISINQVDATE, taxisinqvdate, INT)
+FCALLSCFUN1 (INT, taxisInqVtime, TAXISINQVTIME, taxisinqvtime, INT)
+FCALLSCSUB2 (taxisDefRdate, TAXISDEFRDATE, taxisdefrdate, INT, INT)
+FCALLSCSUB2 (taxisDefRtime, TAXISDEFRTIME, taxisdefrtime, INT, INT)
+FCALLSCFUN1 (INT, taxisInqRdate, TAXISINQRDATE, taxisinqrdate, INT)
+FCALLSCFUN1 (INT, taxisInqRtime, TAXISINQRTIME, taxisinqrtime, INT)
+FCALLSCFUN1 (INT, taxisHasBounds, TAXISHASBOUNDS, taxishasbounds, INT)
+FCALLSCSUB1 (taxisWithBounds, TAXISWITHBOUNDS, taxiswithbounds, INT)
+FCALLSCSUB1 (taxisDeleteBounds, TAXISDELETEBOUNDS, taxisdeletebounds, INT)
+FCALLSCSUB3 (taxisDefVdateBounds, TAXISDEFVDATEBOUNDS, taxisdefvdatebounds, INT, INT, INT)
+FCALLSCSUB3 (taxisDefVtimeBounds, TAXISDEFVTIMEBOUNDS, taxisdefvtimebounds, INT, INT, INT)
+FCALLSCSUB3 (taxisInqVdateBounds, TAXISINQVDATEBOUNDS, taxisinqvdatebounds, INT, PINT, PINT)
+FCALLSCSUB3 (taxisInqVtimeBounds, TAXISINQVTIMEBOUNDS, taxisinqvtimebounds, INT, PINT, PINT)
+FCALLSCSUB2 (taxisDefCalendar, TAXISDEFCALENDAR, taxisdefcalendar, INT, INT)
+FCALLSCFUN1 (INT, taxisInqCalendar, TAXISINQCALENDAR, taxisinqcalendar, INT)
+FCALLSCSUB2 (taxisDefTunit, TAXISDEFTUNIT, taxisdeftunit, INT, INT)
+FCALLSCFUN1 (INT, taxisInqTunit, TAXISINQTUNIT, taxisinqtunit, INT)
+FCALLSCSUB2 (taxisDefForecastTunit, TAXISDEFFORECASTTUNIT, taxisdefforecasttunit, INT, INT)
+FCALLSCFUN1 (INT, taxisInqForecastTunit, TAXISINQFORECASTTUNIT, taxisinqforecasttunit, INT)
+FCALLSCSUB2 (taxisDefForecastPeriod, TAXISDEFFORECASTPERIOD, taxisdefforecastperiod, INT, DOUBLE)
+FCALLSCFUN1 (DOUBLE, taxisInqForecastPeriod, TAXISINQFORECASTPERIOD, taxisinqforecastperiod, INT)
+FCALLSCSUB2 (taxisDefNumavg, TAXISDEFNUMAVG, taxisdefnumavg, INT, INT)
+FCALLSCFUN1 (INT, taxisInqNumavg, TAXISINQNUMAVG, taxisinqnumavg, INT)
+FCALLSCFUN1 (STRING, taxisNamePtr, TAXISNAMEPTR, taxisnameptr, INT)
+FCALLSCFUN1 (STRING, tunitNamePtr, TUNITNAMEPTR, tunitnameptr, INT)
+
+/*  Institut routines  */
+
+FCALLSCFUN4 (INT, institutDef, INSTITUTDEF, institutdef, INT, INT, STRING, STRING)
+FCALLSCFUN4 (INT, institutInq, INSTITUTINQ, institutinq, INT, INT, STRING, STRING)
+FCALLSCFUN0 (INT, institutInqNumber, INSTITUTINQNUMBER, institutinqnumber)
+FCALLSCFUN1 (INT, institutInqCenter, INSTITUTINQCENTER, institutinqcenter, INT)
+FCALLSCFUN1 (INT, institutInqSubcenter, INSTITUTINQSUBCENTER, institutinqsubcenter, INT)
+FCALLSCFUN1 (STRING, institutInqNamePtr, INSTITUTINQNAMEPTR, institutinqnameptr, INT)
+FCALLSCFUN1 (STRING, institutInqLongnamePtr, INSTITUTINQLONGNAMEPTR, institutinqlongnameptr, INT)
+
+/*  Model routines  */
+
+FCALLSCFUN3 (INT, modelDef, MODELDEF, modeldef, INT, INT, STRING)
+FCALLSCFUN3 (INT, modelInq, MODELINQ, modelinq, INT, INT, STRING)
+FCALLSCFUN1 (INT, modelInqInstitut, MODELINQINSTITUT, modelinqinstitut, INT)
+FCALLSCFUN1 (INT, modelInqGribID, MODELINQGRIBID, modelinqgribid, INT)
+FCALLSCFUN1 (STRING, modelInqNamePtr, MODELINQNAMEPTR, modelinqnameptr, INT)
+
+/*  Table routines  */
+
+FCALLSCSUB2 (tableWrite, TABLEWRITE, tablewrite, STRING, INT)
+FCALLSCFUN1 (INT, tableRead, TABLEREAD, tableread, STRING)
+FCALLSCFUN3 (INT, tableDef, TABLEDEF, tabledef, INT, INT, STRING)
+FCALLSCFUN1 (STRING, tableInqNamePtr, TABLEINQNAMEPTR, tableinqnameptr, INT)
+FCALLSCFUN3 (INT, tableInq, TABLEINQ, tableinq, INT, INT, STRING)
+FCALLSCFUN0 (INT, tableInqNumber, TABLEINQNUMBER, tableinqnumber)
+FCALLSCFUN1 (INT, tableInqNum, TABLEINQNUM, tableinqnum, INT)
+FCALLSCFUN1 (INT, tableInqModel, TABLEINQMODEL, tableinqmodel, INT)
+FCALLSCSUB6 (tableInqEntry, TABLEINQENTRY, tableinqentry, INT, INT, INT, PSTRING, PSTRING, PSTRING)
+
+/*  Subtype routines  */
+
+FCALLSCFUN1 (INT, subtypeCreate, SUBTYPECREATE, subtypecreate, INT)
+
+/*  Gives a textual summary of the variable subtype  */
+
+FCALLSCSUB1 (subtypePrint, SUBTYPEPRINT, subtypeprint, INT)
+
+/*  Compares two subtype data structures  */
+
+FCALLSCFUN2 (INT, subtypeCompare, SUBTYPECOMPARE, subtypecompare, INT, INT)
+FCALLSCFUN1 (INT, subtypeInqSize, SUBTYPEINQSIZE, subtypeinqsize, INT)
+FCALLSCFUN1 (INT, subtypeInqActiveIndex, SUBTYPEINQACTIVEINDEX, subtypeinqactiveindex, INT)
+FCALLSCSUB2 (subtypeDefActiveIndex, SUBTYPEDEFACTIVEINDEX, subtypedefactiveindex, INT, INT)
+
+/*  Generate a "query object" out of a key-value pair  */
+
+
+/*  Generate an AND-combined "query object" out of two previous query objects  */
+
+FCALLSCFUN3 (INT, subtypeInqTile, SUBTYPEINQTILE, subtypeinqtile, INT, INT, INT)
+FCALLSCFUN4 (INT, subtypeInqAttribute, SUBTYPEINQATTRIBUTE, subtypeinqattribute, INT, INT, STRING, PINT)
+FCALLSCFUN2 (INT, vlistInqVarSubtype, VLISTINQVARSUBTYPE, vlistinqvarsubtype, INT, INT)
+FCALLSCSUB3 (gribapiLibraryVersion, GRIBAPILIBRARYVERSION, gribapilibraryversion, PINT, PINT, PINT)
+
+/*  Compatibility functions for release 1.8.3 (obsolete functions)  */
+
+FCALLSCSUB2 (zaxisDefLtype, ZAXISDEFLTYPE, zaxisdefltype, INT, INT)
+FCALLSCFUN2 (INT, vlistInqVarTypeOfGeneratingProcess, VLISTINQVARTYPEOFGENERATINGPROCESS, vlistinqvartypeofgeneratingprocess, INT, INT)
+FCALLSCSUB3 (vlistDefVarTypeOfGeneratingProcess, VLISTDEFVARTYPEOFGENERATINGPROCESS, vlistdefvartypeofgeneratingprocess, INT, INT, INT)
+FCALLSCSUB3 (vlistDefVarProductDefinitionTemplate, VLISTDEFVARPRODUCTDEFINITIONTEMPLATE, vlistdefvarproductdefinitiontemplate, INT, INT, INT)
+
+/*  End of fortran interface  */
+
+
+#if defined __clang__
+#  pragma GCC diagnostic pop
+#endif
+
+// clang-format on
+
+#endif
diff --git a/src/cdipio.inc b/src/cdipio.inc
new file mode 100644
index 000000000..6c6e9385f
--- /dev/null
+++ b/src/cdipio.inc
@@ -0,0 +1,318 @@
+! This file was automatically generated, don't edit!
+!
+! Fortran interface for CDI library version 2.4.3
+!
+! Author:
+! -------
+! Uwe Schulzweida, MPI-MET, Hamburg,   September 2024
+!
+
+!
+!  Start of fortran interface for the following routines (make_fint.c)
+!
+!
+!  parallel IO IOMode
+!
+      INTEGER    PIO_NONE
+      PARAMETER (PIO_NONE               =  0)
+      INTEGER    PIO_MPI
+      PARAMETER (PIO_MPI                =  1)
+      INTEGER    PIO_WRITER
+      PARAMETER (PIO_WRITER             =  2)
+      INTEGER    PIO_ASYNCH
+      PARAMETER (PIO_ASYNCH             =  3)
+      INTEGER    PIO_FPGUARD
+      PARAMETER (PIO_FPGUARD            =  4)
+      INTEGER    PIO_MPI_FW_ORDERED
+      PARAMETER (PIO_MPI_FW_ORDERED     =  5)
+      INTEGER    PIO_MPI_FW_AT_ALL
+      PARAMETER (PIO_MPI_FW_AT_ALL      =  6)
+      INTEGER    PIO_MPI_FW_AT_REBLOCK
+      PARAMETER (PIO_MPI_FW_AT_REBLOCK  =  7)
+      INTEGER    PIO_MINIOMODE
+      PARAMETER (PIO_MINIOMODE          = PIO_NONE)
+      INTEGER    PIO_MAXIOMODE
+      PARAMETER (PIO_MAXIOMODE          = PIO_MPI_FW_AT_REBLOCK)
+      INTEGER    PIO_ROLE_CLIENT
+      PARAMETER (PIO_ROLE_CLIENT        =  0)
+      INTEGER    PIO_ROLE_COLLECTOR
+      PARAMETER (PIO_ROLE_COLLECTOR     =  1)
+      INTEGER    PIO_ROLE_WRITER
+      PARAMETER (PIO_ROLE_WRITER        =  2)
+      INTEGER    PIO_ROLE_WRITER_COLLECTOR
+      PARAMETER (PIO_ROLE_WRITER_COLLECTOR =  3)
+      INTEGER    PIO_ROLE_FPGUARD
+      PARAMETER (PIO_ROLE_FPGUARD       =  4)
+!
+!  parallel IO routines
+!
+!                     pioEndDef
+      EXTERNAL        pioEndDef
+
+!                     pioEndTimestepping
+      EXTERNAL        pioEndTimestepping
+
+!                     pioFinalize
+      EXTERNAL        pioFinalize
+
+!                     cdiPioNoPostCommSetup
+      EXTERNAL        cdiPioNoPostCommSetup
+
+      INTEGER         pioInit
+!                                    (INTEGER         commSuper,
+!                                     INTEGER         nProcsIO,
+!                                     INTEGER         IOMode,
+!                                     INTEGER         pioNamespace,
+!                                     REAL            partInflate,
+!                                     PROCEDURE       postCommSetupActions)
+      EXTERNAL        pioInit
+
+      INTEGER         cdiPioInit
+!                                    (INTEGER         commSuper,
+!                                     INTEGER         confResH,
+!                                     INTEGER         pioNamespace)
+      EXTERNAL        cdiPioInit
+
+!                     pioWriteTimestep
+      EXTERNAL        pioWriteTimestep
+
+!                     cdiPioRDMAProgress
+      EXTERNAL        cdiPioRDMAProgress
+
+!                     cdiPioStreamDefDecomposedVlist
+!                                    (INTEGER         streamID,
+!                                     INTEGER         vlistID,
+!                                     TYPE(XT_IDXLIST)partDesc(*),
+!                                     INTEGER         conversion(*))
+      EXTERNAL        cdiPioStreamDefDecomposedVlist
+
+!                     streamWriteVarPart
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     DOUBLEPRECISION data,
+!                                     INTEGER         numMissVals,
+!                                     TYPE(XT_IDXLIST)partDesc)
+      EXTERNAL        streamWriteVarPart
+
+!                     streamWriteVarPartF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     REAL            data,
+!                                     INTEGER         numMissVals,
+!                                     TYPE(XT_IDXLIST)partDesc)
+      EXTERNAL        streamWriteVarPartF
+
+!                     streamWriteScatteredVarPart
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     DOUBLEPRECISION data,
+!                                     INTEGER         numBlocks,
+!                                     INTEGER         blocklengths(*),
+!                                     INTEGER         displacements(*),
+!                                     INTEGER         numMissVals,
+!                                     TYPE(XT_IDXLIST)partDesc)
+      EXTERNAL        streamWriteScatteredVarPart
+
+!                     streamWriteScatteredVarPartF
+!                                    (INTEGER         streamID,
+!                                     INTEGER         varID,
+!                                     REAL            data,
+!                                     INTEGER         numBlocks,
+!                                     INTEGER         blocklengths(*),
+!                                     INTEGER         displacements(*),
+!                                     INTEGER         numMissVals,
+!                                     TYPE(XT_IDXLIST)partDesc)
+      EXTERNAL        streamWriteScatteredVarPartF
+
+      INTEGER         cdiPioCSRLastN
+!                                    (INTEGER         commSuper,
+!                                     INTEGER         IOMode,
+!                                     INTEGER         nProcsIO)
+      EXTERNAL        cdiPioCSRLastN
+
+      INTEGER         cdiPioCSRFirstN
+!                                    (INTEGER         commSuper,
+!                                     INTEGER         IOMode,
+!                                     INTEGER         nProcsIO)
+      EXTERNAL        cdiPioCSRFirstN
+
+      INTEGER         cdiPioCSRBalanced
+!                                    (INTEGER         commSuper,
+!                                     INTEGER         IOMode,
+!                                     INTEGER         nProcsIO)
+      EXTERNAL        cdiPioCSRBalanced
+
+      INTEGER         cdiPioStr2IOMode
+!                                    (CHARACTER*(*)   modeStr)
+      EXTERNAL        cdiPioStr2IOMode
+
+      CHARACTER(80)   cdiPioIOMode2Str
+!                                    (INTEGER         IOMode)
+      EXTERNAL        cdiPioIOMode2Str
+
+      INTEGER         cdiPioConfCreate
+      EXTERNAL        cdiPioConfCreate
+
+!                     cdiPioConfDestroy
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfDestroy
+
+!                     cdiPioConfSetPartInflate
+!                                    (INTEGER         confResH,
+!                                     REAL            partInflate)
+      EXTERNAL        cdiPioConfSetPartInflate
+
+      REAL            cdiPioConfGetPartInflate
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetPartInflate
+
+!                     cdiPioConfSetIOMode
+!                                    (INTEGER         confResH,
+!                                     INTEGER         IOMode)
+      EXTERNAL        cdiPioConfSetIOMode
+
+      INTEGER         cdiPioConfGetIOMode
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetIOMode
+
+!                     cdiPioConfSetCSRole
+!                                    (INTEGER         confResH,
+!                                     INTEGER         CSRole)
+      EXTERNAL        cdiPioConfSetCSRole
+
+      INTEGER         cdiPioConfGetCSRole
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetCSRole
+
+!                     cdiPioConfSetPostCommSetupActions
+!                                    (INTEGER         confResH,
+!                                     PROCEDURE       postCommSetupActions)
+      EXTERNAL        cdiPioConfSetPostCommSetupActions
+
+      INTEGER    CDIPIO_CALLBACK_POSTCOMMSETUP
+      PARAMETER (CDIPIO_CALLBACK_POSTCOMMSETUP =  0)
+      INTEGER    CDIPIO_CALLBACK_POSTSTREAMCLOSE
+      PARAMETER (CDIPIO_CALLBACK_POSTSTREAMCLOSE =  1)
+      INTEGER    CDIPIO_CALLBACK_POSTWRITEBATCH
+      PARAMETER (CDIPIO_CALLBACK_POSTWRITEBATCH =  2)
+!                     cdiPioConfSetCallBackActions
+!                                    (INTEGER         confResH,
+!                                     INTEGER         trigger,
+!                                     PROCEDURE       action)
+      EXTERNAL        cdiPioConfSetCallBackActions
+
+!
+!  cdiPioConfSetLargePageAlign should block buffer be aligned to
+!  large pages instead of normal pages?
+!
+!                     cdiPioConfSetLargePageAlign
+!                                    (INTEGER         confResH,
+!                                     INTEGER         largePageAlign)
+      EXTERNAL        cdiPioConfSetLargePageAlign
+
+      INTEGER         cdiPioConfGetLargePageAlign
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetLargePageAlign
+
+!                     cdiPioConfSetRecordAggBufLim
+!                                    (INTEGER         confResH,
+!                                     INTEGER         lim_mb)
+      EXTERNAL        cdiPioConfSetRecordAggBufLim
+
+      INTEGER         cdiPioConfGetRecordAggBufLim
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetRecordAggBufLim
+
+!                     cdiPioConfSetWriteAggBufLim
+!                                    (INTEGER         confResH,
+!                                     INTEGER         lim_mb)
+      EXTERNAL        cdiPioConfSetWriteAggBufLim
+
+      INTEGER         cdiPioConfGetWriteAggBufLim
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetWriteAggBufLim
+
+!                     cdiPioConfSetAioQueueDepth
+!                                    (INTEGER         confResH,
+!                                     INTEGER         queue_depth)
+      EXTERNAL        cdiPioConfSetAioQueueDepth
+
+      INTEGER         cdiPioConfGetAioQueueDepth
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetAioQueueDepth
+
+!                     cdiPioConfSetMaxPathLen
+!                                    (INTEGER         confResH,
+!                                     INTEGER         max_path_len)
+      EXTERNAL        cdiPioConfSetMaxPathLen
+
+      INTEGER         cdiPioConfGetMaxPathLen
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetMaxPathLen
+
+!                     cdiPioConfSetRedistCache
+!                                    (INTEGER         confResH,
+!                                     INTEGER         doCache)
+      EXTERNAL        cdiPioConfSetRedistCache
+
+      INTEGER         cdiPioConfGetRedistCache
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetRedistCache
+
+!                     cdiPioConfSetXmapCache
+!                                    (INTEGER         confResH,
+!                                     INTEGER         doCache)
+      EXTERNAL        cdiPioConfSetXmapCache
+
+      INTEGER         cdiPioConfGetXmapCache
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetXmapCache
+
+!                     cdiPioConfSetStripeConversion
+!                                    (INTEGER         confResH,
+!                                     INTEGER         doStripify)
+      EXTERNAL        cdiPioConfSetStripeConversion
+
+      INTEGER         cdiPioConfGetStripeConversion
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetStripeConversion
+
+!                     cdiPioConfSetBatchedRMA
+!                                    (INTEGER         confResH,
+!                                     INTEGER         doBatchedRMA)
+      EXTERNAL        cdiPioConfSetBatchedRMA
+
+      INTEGER         cdiPioConfGetBatchedRMA
+!                                    (INTEGER         confResH)
+      EXTERNAL        cdiPioConfGetBatchedRMA
+
+      INTEGER         cdiPioDistGridCreate
+!                                    (INTEGER         gridtype,
+!                                     INTEGER         size,
+!                                     INTEGER         xsize,
+!                                     INTEGER         ysize,
+!                                     INTEGER         nvertex,
+!                                     INTEGER         xy_decomposition_optional(2,*),
+!                                     TYPE(XT_IDXLIST)partDesc2D,
+!                                     TYPE(XT_IDXLIST)partDescX,
+!                                     TYPE(XT_IDXLIST)partDescY)
+      EXTERNAL        cdiPioDistGridCreate
+
+!                     cdiPioDistGridEnableIndividualQueries
+!                                    (INTEGER         gridID)
+      EXTERNAL        cdiPioDistGridEnableIndividualQueries
+
+!                     cdiPioDistGridDisableIndividualQueries
+!                                    (INTEGER         gridID)
+      EXTERNAL        cdiPioDistGridDisableIndividualQueries
+
+      LOGICAL         cdiPioDistGridIndividualQueriesEnabled
+!                                    (INTEGER         gridID)
+      EXTERNAL        cdiPioDistGridIndividualQueriesEnabled
+
+      INTEGER         cdiPioInqInterComm
+      EXTERNAL        cdiPioInqInterComm
+
+!
+!  End of fortran interface
+!
diff --git a/src/cdipioFortran.c b/src/cdipioFortran.c
new file mode 100644
index 000000000..e278f4202
--- /dev/null
+++ b/src/cdipioFortran.c
@@ -0,0 +1,186 @@
+// Automatically generated by make_fint.c, don't edit!
+
+// clang-format off
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef CDIPIO_H_
+#include "cdipio.h"
+#endif
+
+#ifdef HAVE_CF_INTERFACE
+
+#include <limits.h>
+#include <assert.h>
+
+#ifndef __CFORTRAN_LOADED
+#  if defined __clang__
+#    pragma GCC diagnostic push
+#    pragma GCC diagnostic ignored "-Wreserved-id-macro"
+#  endif
+#  include "cfortran.h"
+#  if defined __clang__
+#    pragma GCC diagnostic pop
+#  endif
+#endif
+/* These functions are meant to be called from Fortran and don't
+ * need an interface declaration in a C header. */
+#ifdef __clang__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wmissing-prototypes"
+#endif
+
+#ifdef CDI_H_
+
+static inline
+int SizeType_c2f(SizeType value_SizeType)
+{
+  assert(value_SizeType < INT_MAX);
+  return (int) value_SizeType;
+}
+
+#endif
+
+/*  Start of fortran interface for the following routines (make_fint.c)  */
+
+
+/*  parallel IO IOMode  */
+
+
+/*  parallel IO routines  */
+
+FCALLSCSUB0 (pioEndDef, PIOENDDEF, pioenddef)
+FCALLSCSUB0 (pioEndTimestepping, PIOENDTIMESTEPPING, pioendtimestepping)
+FCALLSCSUB0 (pioFinalize, PIOFINALIZE, piofinalize)
+FCALLSCSUB0 (cdiPioNoPostCommSetup, CDIPIONOPOSTCOMMSETUP, cdipionopostcommsetup)
+
+#undef ROUTINE_6
+#define ROUTINE_6 (void (*)(void))
+static int pioInit_fwrap(int commSuper, int nProcsIO, int IOMode, int *pioNamespace, float partInflate, void (*postCommSetupActions)(void))
+{
+  MPI_Comm v;
+  v = pioInit(MPI_Comm_f2c(commSuper), nProcsIO, IOMode, pioNamespace, partInflate, postCommSetupActions);
+  return MPI_Comm_c2f(v);
+}
+FCALLSCFUN6 (INT, pioInit_fwrap, PIOINIT, pioinit, INT, INT, INT, PINT, FLOAT, ROUTINE)
+static int cdiPioInit_fwrap(int commSuper, int confResH, int *pioNamespace)
+{
+  MPI_Comm v;
+  v = cdiPioInit(MPI_Comm_f2c(commSuper), confResH, pioNamespace);
+  return MPI_Comm_c2f(v);
+}
+FCALLSCFUN3 (INT, cdiPioInit_fwrap, CDIPIOINIT, cdipioinit, INT, INT, PINT)
+FCALLSCSUB0 (pioWriteTimestep, PIOWRITETIMESTEP, piowritetimestep)
+FCALLSCSUB0 (cdiPioRDMAProgress, CDIPIORDMAPROGRESS, cdipiordmaprogress)
+FCALLSCSUB4 (cdiPioStreamDefDecomposedVlist, CDIPIOSTREAMDEFDECOMPOSEDVLIST, cdipiostreamdefdecomposedvlist, INT, INT, PVOID, INTV)
+static void streamWriteVarPart_fwrap(int streamID, int varID, double *data, int numMissVals, void *partDesc)
+{
+  streamWriteVarPart(streamID, varID, data, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc));
+}
+FCALLSCSUB5 (streamWriteVarPart_fwrap, STREAMWRITEVARPART, streamwritevarpart, INT, INT, PDOUBLE, INT, PVOID)
+static void streamWriteVarPartF_fwrap(int streamID, int varID, float *data, int numMissVals, void *partDesc)
+{
+  streamWriteVarPartF(streamID, varID, data, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc));
+}
+FCALLSCSUB5 (streamWriteVarPartF_fwrap, STREAMWRITEVARPARTF, streamwritevarpartf, INT, INT, PFLOAT, INT, PVOID)
+static void streamWriteScatteredVarPart_fwrap(int streamID, int varID, double *data, int numBlocks, const int  blocklengths[], const int  displacements[], int numMissVals, void *partDesc)
+{
+  streamWriteScatteredVarPart(streamID, varID, data, numBlocks, blocklengths, displacements, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc));
+}
+FCALLSCSUB8 (streamWriteScatteredVarPart_fwrap, STREAMWRITESCATTEREDVARPART, streamwritescatteredvarpart, INT, INT, PDOUBLE, INT, INTV, INTV, INT, PVOID)
+static void streamWriteScatteredVarPartF_fwrap(int streamID, int varID, float *data, int numBlocks, const int  blocklengths[], const int  displacements[], int numMissVals, void *partDesc)
+{
+  streamWriteScatteredVarPartF(streamID, varID, data, numBlocks, blocklengths, displacements, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc));
+}
+FCALLSCSUB8 (streamWriteScatteredVarPartF_fwrap, STREAMWRITESCATTEREDVARPARTF, streamwritescatteredvarpartf, INT, INT, PFLOAT, INT, INTV, INTV, INT, PVOID)
+static int cdiPioCSRLastN_fwrap(int commSuper, int IOMode, int nProcsIO)
+{
+  int v;
+  v = cdiPioCSRLastN(MPI_Comm_f2c(commSuper), IOMode, nProcsIO);
+  return v;
+}
+FCALLSCFUN3 (INT, cdiPioCSRLastN_fwrap, CDIPIOCSRLASTN, cdipiocsrlastn, INT, INT, INT)
+static int cdiPioCSRFirstN_fwrap(int commSuper, int IOMode, int nProcsIO)
+{
+  int v;
+  v = cdiPioCSRFirstN(MPI_Comm_f2c(commSuper), IOMode, nProcsIO);
+  return v;
+}
+FCALLSCFUN3 (INT, cdiPioCSRFirstN_fwrap, CDIPIOCSRFIRSTN, cdipiocsrfirstn, INT, INT, INT)
+static int cdiPioCSRBalanced_fwrap(int commSuper, int IOMode, int nProcsIO)
+{
+  int v;
+  v = cdiPioCSRBalanced(MPI_Comm_f2c(commSuper), IOMode, nProcsIO);
+  return v;
+}
+FCALLSCFUN3 (INT, cdiPioCSRBalanced_fwrap, CDIPIOCSRBALANCED, cdipiocsrbalanced, INT, INT, INT)
+FCALLSCFUN1 (INT, cdiPioStr2IOMode, CDIPIOSTR2IOMODE, cdipiostr2iomode, STRING)
+FCALLSCFUN1 (STRING, cdiPioIOMode2Str, CDIPIOIOMODE2STR, cdipioiomode2str, INT)
+FCALLSCFUN0 (INT, cdiPioConfCreate, CDIPIOCONFCREATE, cdipioconfcreate)
+FCALLSCSUB1 (cdiPioConfDestroy, CDIPIOCONFDESTROY, cdipioconfdestroy, INT)
+FCALLSCSUB2 (cdiPioConfSetPartInflate, CDIPIOCONFSETPARTINFLATE, cdipioconfsetpartinflate, INT, FLOAT)
+FCALLSCFUN1 (FLOAT, cdiPioConfGetPartInflate, CDIPIOCONFGETPARTINFLATE, cdipioconfgetpartinflate, INT)
+FCALLSCSUB2 (cdiPioConfSetIOMode, CDIPIOCONFSETIOMODE, cdipioconfsetiomode, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetIOMode, CDIPIOCONFGETIOMODE, cdipioconfgetiomode, INT)
+FCALLSCSUB2 (cdiPioConfSetCSRole, CDIPIOCONFSETCSROLE, cdipioconfsetcsrole, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetCSRole, CDIPIOCONFGETCSROLE, cdipioconfgetcsrole, INT)
+
+#undef ROUTINE_2
+#define ROUTINE_2 (void (*)(void))
+FCALLSCSUB2 (cdiPioConfSetPostCommSetupActions, CDIPIOCONFSETPOSTCOMMSETUPACTIONS, cdipioconfsetpostcommsetupactions, INT, ROUTINE)
+
+#undef ROUTINE_3
+#define ROUTINE_3 (void (*)(void))
+FCALLSCSUB3 (cdiPioConfSetCallBackActions, CDIPIOCONFSETCALLBACKACTIONS, cdipioconfsetcallbackactions, INT, INT, ROUTINE)
+
+/*  cdiPioConfSetLargePageAlign should block buffer be aligned to
+ * large pages instead of normal pages?  */
+
+FCALLSCSUB2 (cdiPioConfSetLargePageAlign, CDIPIOCONFSETLARGEPAGEALIGN, cdipioconfsetlargepagealign, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetLargePageAlign, CDIPIOCONFGETLARGEPAGEALIGN, cdipioconfgetlargepagealign, INT)
+FCALLSCSUB2 (cdiPioConfSetRecordAggBufLim, CDIPIOCONFSETRECORDAGGBUFLIM, cdipioconfsetrecordaggbuflim, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetRecordAggBufLim, CDIPIOCONFGETRECORDAGGBUFLIM, cdipioconfgetrecordaggbuflim, INT)
+FCALLSCSUB2 (cdiPioConfSetWriteAggBufLim, CDIPIOCONFSETWRITEAGGBUFLIM, cdipioconfsetwriteaggbuflim, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetWriteAggBufLim, CDIPIOCONFGETWRITEAGGBUFLIM, cdipioconfgetwriteaggbuflim, INT)
+FCALLSCSUB2 (cdiPioConfSetAioQueueDepth, CDIPIOCONFSETAIOQUEUEDEPTH, cdipioconfsetaioqueuedepth, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetAioQueueDepth, CDIPIOCONFGETAIOQUEUEDEPTH, cdipioconfgetaioqueuedepth, INT)
+FCALLSCSUB2 (cdiPioConfSetMaxPathLen, CDIPIOCONFSETMAXPATHLEN, cdipioconfsetmaxpathlen, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetMaxPathLen, CDIPIOCONFGETMAXPATHLEN, cdipioconfgetmaxpathlen, INT)
+FCALLSCSUB2 (cdiPioConfSetRedistCache, CDIPIOCONFSETREDISTCACHE, cdipioconfsetredistcache, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetRedistCache, CDIPIOCONFGETREDISTCACHE, cdipioconfgetredistcache, INT)
+FCALLSCSUB2 (cdiPioConfSetXmapCache, CDIPIOCONFSETXMAPCACHE, cdipioconfsetxmapcache, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetXmapCache, CDIPIOCONFGETXMAPCACHE, cdipioconfgetxmapcache, INT)
+FCALLSCSUB2 (cdiPioConfSetStripeConversion, CDIPIOCONFSETSTRIPECONVERSION, cdipioconfsetstripeconversion, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetStripeConversion, CDIPIOCONFGETSTRIPECONVERSION, cdipioconfgetstripeconversion, INT)
+FCALLSCSUB2 (cdiPioConfSetBatchedRMA, CDIPIOCONFSETBATCHEDRMA, cdipioconfsetbatchedrma, INT, INT)
+FCALLSCFUN1 (INT, cdiPioConfGetBatchedRMA, CDIPIOCONFGETBATCHEDRMA, cdipioconfgetbatchedrma, INT)
+static int cdiPioDistGridCreate_fwrap(int gridtype, int size, int xsize, int ysize, int nvertex, const int xy_decomposition_optional[][2], void *partDesc2D, void *partDescX, void *partDescY)
+{
+  int v;
+  v = cdiPioDistGridCreate(gridtype, size, xsize, ysize, nvertex, xy_decomposition_optional, (*(Xt_idxlist *)partDesc2D), (*(Xt_idxlist *)partDescX), (*(Xt_idxlist *)partDescY));
+  return v;
+}
+FCALLSCFUN9 (INT, cdiPioDistGridCreate_fwrap, CDIPIODISTGRIDCREATE, cdipiodistgridcreate, INT, INT, INT, INT, INT, INTVV, PVOID, PVOID, PVOID)
+FCALLSCSUB1 (cdiPioDistGridEnableIndividualQueries, CDIPIODISTGRIDENABLEINDIVIDUALQUERIES, cdipiodistgridenableindividualqueries, INT)
+FCALLSCSUB1 (cdiPioDistGridDisableIndividualQueries, CDIPIODISTGRIDDISABLEINDIVIDUALQUERIES, cdipiodistgriddisableindividualqueries, INT)
+FCALLSCFUN1 (LOGICAL, cdiPioDistGridIndividualQueriesEnabled, CDIPIODISTGRIDINDIVIDUALQUERIESENABLED, cdipiodistgridindividualqueriesenabled, INT)
+static int cdiPioInqInterComm_fwrap()
+{
+  MPI_Comm v;
+  v = cdiPioInqInterComm();
+  return MPI_Comm_c2f(v);
+}
+FCALLSCFUN0 (INT, cdiPioInqInterComm_fwrap, CDIPIOINQINTERCOMM, cdipioinqintercomm)
+
+/*  End of fortran interface  */
+
+
+#if defined __clang__
+#  pragma GCC diagnostic pop
+#endif
+
+// clang-format on
+
+#endif
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644
index 000000000..bb2099c9e
--- /dev/null
+++ b/src/config.h.in
@@ -0,0 +1,361 @@
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* CDI version */
+#undef CDI
+
+/* Compiler */
+#undef COMPILER
+
+/* Compiler version */
+#undef COMP_VERSION
+
+/* Define to 1 for ACROSS support */
+#undef HAVE_ACROSS
+
+/* Defined if backtrace() could be fully identified. */
+#undef HAVE_BACKTRACE
+
+/* Defined to 1 if C / Fortran interface cfortran.h works */
+#undef HAVE_CF_INTERFACE
+
+/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
+   */
+#undef HAVE_DECL_ISNAN
+
+/* Define to 1 if you have the declaration of `MPI_UNSIGNED_LONG_LONG', and to
+   0 if you don't. */
+#undef HAVE_DECL_MPI_UNSIGNED_LONG_LONG
+
+/* Define to 1 if you have the declaration of `ncaux_h5filterspec_parselist',
+   and to 0 if you don't. */
+#undef HAVE_DECL_NCAUX_H5FILTERSPEC_PARSELIST
+
+/* Define to 1 if you have the declaration of `nc_inq_format_extended', and to
+   0 if you don't. */
+#undef HAVE_DECL_NC_INQ_FORMAT_EXTENDED
+
+/* Define to 1 if you have the declaration of `nc_inq_var_filter', and to 0 if
+   you don't. */
+#undef HAVE_DECL_NC_INQ_VAR_FILTER
+
+/* Define to 1 if you have the declaration of `nc_inq_var_filter_ids', and to
+   0 if you don't. */
+#undef HAVE_DECL_NC_INQ_VAR_FILTER_IDS
+
+/* Define to 1 if you have the declaration of `PAGESIZE', and to 0 if you
+   don't. */
+#undef HAVE_DECL_PAGESIZE
+
+/* Define to 1 if you have the declaration of `PAGE_SIZE', and to 0 if you
+   don't. */
+#undef HAVE_DECL_PAGE_SIZE
+
+/* Define to 1 if you have the declaration of `POSIX_REC_XFER_ALIGN', and to 0
+   if you don't. */
+#undef HAVE_DECL_POSIX_REC_XFER_ALIGN
+
+/* Define to 1 if you have the declaration of `uuid_create', and to 0 if you
+   don't. */
+#undef HAVE_DECL_UUID_CREATE
+
+/* Define to 1 if you have the declaration of `uuid_generate', and to 0 if you
+   don't. */
+#undef HAVE_DECL_UUID_GENERATE
+
+/* Define to 1 if you have the declaration of `UUID_MAKE_V5', and to 0 if you
+   don't. */
+#undef HAVE_DECL_UUID_MAKE_V5
+
+/* Define to 1 if you have the declaration of `_PC_REC_XFER_ALIGN', and to 0
+   if you don't. */
+#undef HAVE_DECL__PC_REC_XFER_ALIGN
+
+/* Define to 1 if you have the declaration of `_SC_LARGE_PAGESIZE', and to 0
+   if you don't. */
+#undef HAVE_DECL__SC_LARGE_PAGESIZE
+
+/* Define to 1 if you have the declaration of `_SC_PAGESIZE', and to 0 if you
+   don't. */
+#undef HAVE_DECL__SC_PAGESIZE
+
+/* Define to 1 if you have the declaration of `_SC_PAGE_SIZE', and to 0 if you
+   don't. */
+#undef HAVE_DECL__SC_PAGE_SIZE
+
+/* Define to 1 if __builtin_ctz is available, 0 if not */
+#undef HAVE_DECL___BUILTIN_CTZ
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#undef HAVE_EXECINFO_H
+
+/* Define to 1 if you have the <fdb5/api/fdb_c.h> header file. */
+#undef HAVE_FDB5_API_FDB_C_H
+
+/* Define to 1 if you have the `getline' function. */
+#undef HAVE_GETLINE
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the <grib_api.h> header file. */
+#undef HAVE_GRIB_API_H
+
+/* Define to 1 if you have the `grib_get_length' function. */
+#undef HAVE_GRIB_GET_LENGTH
+
+/* Define to 1 for H5get_libversion support */
+#undef HAVE_H5GET_LIBVERSION
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 for GRIB1 decoding/encoding with cgribex */
+#undef HAVE_LIBCGRIBEX
+
+/* Define to 1 for EXTRA interface */
+#undef HAVE_LIBEXTRA
+
+/* Define to 1 for FDB5 support */
+#undef HAVE_LIBFDB5
+
+/* Define to 1 for GRIB support */
+#undef HAVE_LIBGRIB
+
+/* ECCODES library is present if defined to 1 */
+#undef HAVE_LIBGRIB_API
+
+/* Define to 1 for IEG interface */
+#undef HAVE_LIBIEG
+
+/* Define to 1 for NetCDF OpenDAP */
+#undef HAVE_LIBNC_DAP
+
+/* Define to 1 for NetCDF support */
+#undef HAVE_LIBNETCDF
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 for SERVICE interface */
+#undef HAVE_LIBSERVICE
+
+/* Define to 1 for SZIP support */
+#undef HAVE_LIBSZ
+
+/* Define to 1 if you have the `mallinfo' function. */
+#undef HAVE_MALLINFO
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define to 1 for NetCDF4/HDF5 support */
+#undef HAVE_NC4HDF5
+
+/* Define to 1 for NetCDF4/HDF5 threadsafe support */
+#undef HAVE_NC4HDF5_THREADSAFE
+
+/* Define to 1 for NetCDF4/szlib support */
+#undef HAVE_NC4SZLIB
+
+/* Define to 1 for NetCDF Zarr */
+#undef HAVE_NCZARR
+
+/* Define to 1 for NetCDF4 nc_def_var_szip support */
+#undef HAVE_NC_DEF_VAR_SZIP
+
+/* Define to 1 for NetCDF2 support */
+#undef HAVE_NETCDF2
+
+/* Define to 1 for NetCDF4 support */
+#undef HAVE_NETCDF4
+
+/* Define to 1 if you have the <netcdf.h> header file. */
+#undef HAVE_NETCDF_H
+
+/* Define to 1 if you have the <netcdf_meta.h> header file. */
+#undef HAVE_NETCDF_META_H
+
+/* Define to 1 if you have the <netcdf_par.h> header file. */
+#undef HAVE_NETCDF_PAR_H
+
+/* Defined to 1 if NetCDF parallel open supports NC_PNETCDF */
+#undef HAVE_NETCDF_PAR_PNETCDF
+
+/* netCDF library does support MPI parallel invocations */
+#undef HAVE_PARALLEL_NC4
+
+/* ScalES PPM C core library is available */
+#undef HAVE_PPM_CORE
+
+/* Define to 1 if you have the <ppm/dist_array.h> header file. */
+#undef HAVE_PPM_DIST_ARRAY_H
+
+/* Define to 1 if you have the <pthread.h> header file. */
+#undef HAVE_PTHREAD_H
+
+/* Have PTHREAD_PRIO_INHERIT. */
+#undef HAVE_PTHREAD_PRIO_INHERIT
+
+/* Define to 1 if you have the `pwrite' function. */
+#undef HAVE_PWRITE
+
+/* If available, contains the Python version number currently in use. */
+#undef HAVE_PYTHON
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLKSIZE
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <szlib.h> header file. */
+#undef HAVE_SZLIB_H
+
+/* Define to 1 if you have the `timegm' function. */
+#undef HAVE_TIMEGM
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the <uuid.h> header file. */
+#undef HAVE_UUID_H
+
+/* Define to 1 if you have the <uuid/uuid.h> header file. */
+#undef HAVE_UUID_UUID_H
+
+/* Define to 1 for HIRLAM extensions */
+#undef HIRLAM_EXTENSIONS
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `MPI_Aint', as computed by sizeof. */
+#undef SIZEOF_MPI_AINT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `unsigned long long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
+/* The size of `Xt_uid', as computed by sizeof. */
+#undef SIZEOF_XT_UID
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* System type */
+#undef SYSTEM_TYPE
+
+/* If the compiler supports a TLS storage class, define it to that here */
+#undef TLS
+
+/* Defined if aext alternatives should be tested */
+#undef USE_XT_REDIST_P2P_AEXT_NEW
+
+/* Version number of package */
+#undef VERSION
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Defined to MPI datatype to be used for Xt_uid */
+#undef YAXT_UID_DT
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Defined to return type of backtrace(). */
+#undef backtrace_size_t
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#undef restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+   __restrict__, even though the corresponding Sun C compiler ends up with
+   "#define restrict _Restrict" or "#define restrict __restrict__" in the
+   previous line.  Perhaps some future version of Sun C++ will work with
+   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif
diff --git a/src/mo_cdi.f90 b/src/mo_cdi.f90
new file mode 100644
index 000000000..fc56115c5
--- /dev/null
+++ b/src/mo_cdi.f90
@@ -0,0 +1,6161 @@
+! >>> Warning: This is a generated file. If you modify it, you get what you deserve. <<<
+!
+! Generated by "../interfaces/f2003/bindGen.rb" from input file "cdi.h".
+
+module mo_cdi
+  use iso_c_binding
+  implicit none
+  private
+
+  public ctrim
+  public c_len
+
+  interface
+    integer(c_size_t) function lib_strlen(charPtr) bind(c, name = "strlen")
+      import c_size_t, c_ptr
+      type(c_ptr), value :: charPtr
+    end function lib_strlen
+
+    subroutine lib_free(ptr) bind(c, name = "free")
+      import c_ptr
+      type(c_ptr), value, intent(in) :: ptr
+    end subroutine lib_free
+  end interface
+
+  integer(c_int), public, parameter :: CDI_MAX_NAME = 256
+  integer(c_int), public, parameter :: CDI_UNDEFID = -1
+  integer(c_int), public, parameter :: CDI_GLOBAL = -1
+  integer(c_int), public, parameter :: CDI_XAXIS = 1
+  integer(c_int), public, parameter :: CDI_YAXIS = 2
+  integer(c_int), public, parameter :: CDI_BIGENDIAN = 0
+  integer(c_int), public, parameter :: CDI_LITTLEENDIAN = 1
+  integer(c_int), public, parameter :: CDI_PDPENDIAN = 2
+  integer(c_int), public, parameter :: CDI_REAL = 1
+  integer(c_int), public, parameter :: CDI_COMP = 2
+  integer(c_int), public, parameter :: CDI_BOTH = 3
+  integer(c_int), public, parameter :: CDI_NOERR = 0
+  integer(c_int), public, parameter :: CDI_EEOF = -1
+  integer(c_int), public, parameter :: CDI_ETMOF = -9
+  integer(c_int), public, parameter :: CDI_ESYSTEM = -10
+  integer(c_int), public, parameter :: CDI_EINVAL = -20
+  integer(c_int), public, parameter :: CDI_EISDIR = -21
+  integer(c_int), public, parameter :: CDI_EISEMPTY = -22
+  integer(c_int), public, parameter :: CDI_EUFTYPE = -23
+  integer(c_int), public, parameter :: CDI_ELIBNAVAIL = -24
+  integer(c_int), public, parameter :: CDI_EUFSTRUCT = -25
+  integer(c_int), public, parameter :: CDI_EUNC4 = -26
+  integer(c_int), public, parameter :: CDI_EDIMSIZE = -27
+  integer(c_int), public, parameter :: CDI_EQENF = -50
+  integer(c_int), public, parameter :: CDI_EQNAVAIL = -51
+  integer(c_int), public, parameter :: CDI_ELIMIT = -99
+  integer(c_int), public, parameter :: CDI_FILETYPE_GRB = 1
+  integer(c_int), public, parameter :: CDI_FILETYPE_GRB2 = 2
+  integer(c_int), public, parameter :: CDI_FILETYPE_NC = 3
+  integer(c_int), public, parameter :: CDI_FILETYPE_NC2 = 4
+  integer(c_int), public, parameter :: CDI_FILETYPE_NC4 = 5
+  integer(c_int), public, parameter :: CDI_FILETYPE_NC4C = 6
+  integer(c_int), public, parameter :: CDI_FILETYPE_NC5 = 7
+  integer(c_int), public, parameter :: CDI_FILETYPE_SRV = 8
+  integer(c_int), public, parameter :: CDI_FILETYPE_EXT = 9
+  integer(c_int), public, parameter :: CDI_FILETYPE_IEG = 10
+  integer(c_int), public, parameter :: CDI_FILETYPE_NCZARR = 11
+  integer(c_int), public, parameter :: FILETYPE_GRB = 1
+  integer(c_int), public, parameter :: FILETYPE_GRB2 = 2
+  integer(c_int), public, parameter :: FILETYPE_NC = 3
+  integer(c_int), public, parameter :: FILETYPE_NC2 = 4
+  integer(c_int), public, parameter :: FILETYPE_NC4 = 5
+  integer(c_int), public, parameter :: CDI_PROTOCOL_OTHER = 0
+  integer(c_int), public, parameter :: CDI_PROTOCOL_FILE = 1
+  integer(c_int), public, parameter :: CDI_PROTOCOL_FDB = 2
+  integer(c_int), public, parameter :: CDI_PROTOCOL_ACROSS = 3
+  integer(c_int), public, parameter :: CDI_COMPRESS_NONE = 0
+  integer(c_int), public, parameter :: CDI_COMPRESS_SZIP = 1
+  integer(c_int), public, parameter :: CDI_COMPRESS_AEC = 2
+  integer(c_int), public, parameter :: CDI_COMPRESS_ZIP = 3
+  integer(c_int), public, parameter :: CDI_COMPRESS_JPEG = 4
+  integer(c_int), public, parameter :: CDI_COMPRESS_FILTER = 5
+  integer(c_int), public, parameter :: DATATYPE_PACK16 = 16
+  integer(c_int), public, parameter :: DATATYPE_PACK24 = 24
+  integer(c_int), public, parameter :: DATATYPE_FLT32 = 132
+  integer(c_int), public, parameter :: DATATYPE_FLT64 = 164
+  integer(c_int), public, parameter :: DATATYPE_INT32 = 232
+  integer(c_int), public, parameter :: DATATYPE_INT = 251
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK = 0
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK1 = 1
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK2 = 2
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK3 = 3
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK4 = 4
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK5 = 5
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK6 = 6
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK7 = 7
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK8 = 8
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK9 = 9
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK10 = 10
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK11 = 11
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK12 = 12
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK13 = 13
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK14 = 14
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK15 = 15
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK16 = 16
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK17 = 17
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK18 = 18
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK19 = 19
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK20 = 20
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK21 = 21
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK22 = 22
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK23 = 23
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK24 = 24
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK25 = 25
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK26 = 26
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK27 = 27
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK28 = 28
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK29 = 29
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK30 = 30
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK31 = 31
+  integer(c_int), public, parameter :: CDI_DATATYPE_PACK32 = 32
+  integer(c_int), public, parameter :: CDI_DATATYPE_CPX32 = 64
+  integer(c_int), public, parameter :: CDI_DATATYPE_CPX64 = 128
+  integer(c_int), public, parameter :: CDI_DATATYPE_FLT32 = 132
+  integer(c_int), public, parameter :: CDI_DATATYPE_FLT64 = 164
+  integer(c_int), public, parameter :: CDI_DATATYPE_INT8 = 208
+  integer(c_int), public, parameter :: CDI_DATATYPE_INT16 = 216
+  integer(c_int), public, parameter :: CDI_DATATYPE_INT32 = 232
+  integer(c_int), public, parameter :: CDI_DATATYPE_UINT8 = 308
+  integer(c_int), public, parameter :: CDI_DATATYPE_UINT16 = 316
+  integer(c_int), public, parameter :: CDI_DATATYPE_UINT32 = 332
+  integer(c_int), public, parameter :: CDI_DATATYPE_INT = 251
+  integer(c_int), public, parameter :: CDI_DATATYPE_FLT = 252
+  integer(c_int), public, parameter :: CDI_DATATYPE_TXT = 253
+  integer(c_int), public, parameter :: CDI_DATATYPE_CPX = 254
+  integer(c_int), public, parameter :: CDI_DATATYPE_UCHAR = 255
+  integer(c_int), public, parameter :: CDI_DATATYPE_LONG = 256
+  integer(c_int), public, parameter :: CDI_DATATYPE_UINT = 257
+  integer(c_int), public, parameter :: CDI_CHUNK_AUTO = 1
+  integer(c_int), public, parameter :: CDI_CHUNK_GRID = 2
+  integer(c_int), public, parameter :: CDI_CHUNK_LINES = 3
+  integer(c_int), public, parameter :: GRID_GENERIC = 1
+  integer(c_int), public, parameter :: GRID_GAUSSIAN = 2
+  integer(c_int), public, parameter :: GRID_GAUSSIAN_REDUCED = 3
+  integer(c_int), public, parameter :: GRID_LONLAT = 4
+  integer(c_int), public, parameter :: GRID_SPECTRAL = 5
+  integer(c_int), public, parameter :: GRID_FOURIER = 6
+  integer(c_int), public, parameter :: GRID_GME = 7
+  integer(c_int), public, parameter :: GRID_TRAJECTORY = 8
+  integer(c_int), public, parameter :: GRID_UNSTRUCTURED = 9
+  integer(c_int), public, parameter :: GRID_CURVILINEAR = 10
+  integer(c_int), public, parameter :: GRID_PROJECTION = 12
+  integer(c_int), public, parameter :: GRID_CHARXY = 13
+  integer(c_int), public, parameter :: CDI_PROJ_RLL = 21
+  integer(c_int), public, parameter :: CDI_PROJ_LCC = 22
+  integer(c_int), public, parameter :: CDI_PROJ_LAEA = 23
+  integer(c_int), public, parameter :: CDI_PROJ_SINU = 24
+  integer(c_int), public, parameter :: CDI_PROJ_STERE = 25
+  integer(c_int), public, parameter :: CDI_PROJ_HEALPIX = 26
+  integer(c_int), public, parameter :: ZAXIS_SURFACE = 0
+  integer(c_int), public, parameter :: ZAXIS_GENERIC = 1
+  integer(c_int), public, parameter :: ZAXIS_HYBRID = 2
+  integer(c_int), public, parameter :: ZAXIS_HYBRID_HALF = 3
+  integer(c_int), public, parameter :: ZAXIS_PRESSURE = 4
+  integer(c_int), public, parameter :: ZAXIS_HEIGHT = 5
+  integer(c_int), public, parameter :: ZAXIS_DEPTH_BELOW_SEA = 6
+  integer(c_int), public, parameter :: ZAXIS_DEPTH_BELOW_LAND = 7
+  integer(c_int), public, parameter :: ZAXIS_ISENTROPIC = 8
+  integer(c_int), public, parameter :: ZAXIS_TRAJECTORY = 9
+  integer(c_int), public, parameter :: ZAXIS_ALTITUDE = 10
+  integer(c_int), public, parameter :: ZAXIS_SIGMA = 11
+  integer(c_int), public, parameter :: ZAXIS_MEANSEA = 12
+  integer(c_int), public, parameter :: ZAXIS_TOA = 13
+  integer(c_int), public, parameter :: ZAXIS_SEA_BOTTOM = 14
+  integer(c_int), public, parameter :: ZAXIS_ATMOSPHERE = 15
+  integer(c_int), public, parameter :: ZAXIS_CLOUD_BASE = 16
+  integer(c_int), public, parameter :: ZAXIS_CLOUD_TOP = 17
+  integer(c_int), public, parameter :: ZAXIS_ISOTHERM_ZERO = 18
+  integer(c_int), public, parameter :: ZAXIS_SNOW = 19
+  integer(c_int), public, parameter :: ZAXIS_LAKE_BOTTOM = 20
+  integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM = 21
+  integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM_TA = 22
+  integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM_TW = 23
+  integer(c_int), public, parameter :: ZAXIS_MIX_LAYER = 24
+  integer(c_int), public, parameter :: ZAXIS_REFERENCE = 25
+  integer(c_int), public, parameter :: ZAXIS_CHAR = 26
+  integer(c_int), public, parameter :: ZAXIS_TROPOPAUSE = 27
+  integer(c_int), public, parameter :: MAX_KV_PAIRS_MATCH = 10
+  integer(c_int), public, parameter :: TIME_CONSTANT = 0
+  integer(c_int), public, parameter :: TIME_VARYING = 1
+  integer(c_int), public, parameter :: TIME_VARIABLE = 1
+  integer(c_int), public, parameter :: TSTEP_CONSTANT = 0
+  integer(c_int), public, parameter :: TSTEP_INSTANT = 1
+  integer(c_int), public, parameter :: TSTEP_AVG = 2
+  integer(c_int), public, parameter :: TSTEP_ACCUM = 3
+  integer(c_int), public, parameter :: TSTEP_MAX = 4
+  integer(c_int), public, parameter :: TSTEP_MIN = 5
+  integer(c_int), public, parameter :: TSTEP_DIFF = 6
+  integer(c_int), public, parameter :: TSTEP_RMS = 7
+  integer(c_int), public, parameter :: TSTEP_SD = 8
+  integer(c_int), public, parameter :: TSTEP_COV = 9
+  integer(c_int), public, parameter :: TSTEP_RATIO = 10
+  integer(c_int), public, parameter :: TSTEP_SUM = 11
+  integer(c_int), public, parameter :: TSTEP_RANGE = 12
+  integer(c_int), public, parameter :: TSTEP_INSTANT2 = 13
+  integer(c_int), public, parameter :: TSTEP_INSTANT3 = 14
+  integer(c_int), public, parameter :: TAXIS_ABSOLUTE = 1
+  integer(c_int), public, parameter :: TAXIS_RELATIVE = 2
+  integer(c_int), public, parameter :: TAXIS_FORECAST = 3
+  integer(c_int), public, parameter :: TUNIT_SECOND = 1
+  integer(c_int), public, parameter :: TUNIT_MINUTE = 2
+  integer(c_int), public, parameter :: TUNIT_QUARTER = 3
+  integer(c_int), public, parameter :: TUNIT_30MINUTES = 4
+  integer(c_int), public, parameter :: TUNIT_HOUR = 5
+  integer(c_int), public, parameter :: TUNIT_3HOURS = 6
+  integer(c_int), public, parameter :: TUNIT_6HOURS = 7
+  integer(c_int), public, parameter :: TUNIT_12HOURS = 8
+  integer(c_int), public, parameter :: TUNIT_DAY = 9
+  integer(c_int), public, parameter :: TUNIT_MONTH = 10
+  integer(c_int), public, parameter :: TUNIT_YEAR = 11
+  integer(c_int), public, parameter :: CALENDAR_STANDARD = 0
+  integer(c_int), public, parameter :: CALENDAR_GREGORIAN = 1
+  integer(c_int), public, parameter :: CALENDAR_PROLEPTIC = 2
+  integer(c_int), public, parameter :: CALENDAR_360DAYS = 3
+  integer(c_int), public, parameter :: CALENDAR_365DAYS = 4
+  integer(c_int), public, parameter :: CALENDAR_366DAYS = 5
+  integer(c_int), public, parameter :: CALENDAR_NONE = 6
+  integer(c_int), public, parameter :: CDI_UUID_SIZE = 16
+
+  public t_CdiParam
+  type, bind(c) :: t_CdiParam
+    integer(c_int) :: discipline
+    integer(c_int) :: category
+    integer(c_int) :: number
+  end type t_CdiParam
+
+  public :: t_CdiIterator
+  type :: t_CdiIterator
+    type(c_ptr) :: ptr
+  end type t_CdiIterator
+
+  public :: t_CdiGribIterator
+  type :: t_CdiGribIterator
+    type(c_ptr) :: ptr
+  end type t_CdiGribIterator
+  public :: cdiReset
+  public :: cdiStringError
+  public :: cdiDebug
+  public :: cdiLibraryVersion
+  public :: cdiPrintVersion
+  public :: cdiHaveFiletype
+  public :: cdiDefMissval
+  public :: cdiInqMissval
+  public :: cdiDefGlobal
+  public :: namespaceNew
+  public :: namespaceSetActive
+  public :: namespaceGetActive
+  public :: namespaceDelete
+  public :: cdiParamToString
+  public :: cdiDecodeParam
+  public :: cdiEncodeParam
+  public :: cdiDecodeDate
+  public :: cdiEncodeDate
+  public :: cdiDecodeTime
+  public :: cdiEncodeTime
+  public :: cdiGetFiletype
+  public :: streamOpenRead
+  public :: streamOpenWrite
+  public :: streamOpenAppend
+  public :: streamClose
+  public :: streamSync
+  public :: streamDefMaxSteps
+  public :: streamDefNumWorker
+  public :: streamInqNumSteps
+  public :: streamDefVlist
+  public :: streamInqVlist
+  public :: streamInqFiletype
+  public :: streamDefByteorder
+  public :: streamInqByteorder
+  public :: streamDefShuffle
+  public :: streamDefFilter
+  public :: streamDefCompType
+  public :: streamInqCompType
+  public :: streamDefCompLevel
+  public :: streamInqCompLevel
+  public :: streamDefTimestep
+  public :: streamInqTimestep
+  public :: streamInqCurTimestepID
+  public :: streamFilename
+  public :: streamFilesuffix
+  public :: streamNvals
+  public :: streamInqNvars
+  public :: streamWriteVar
+  public :: streamWriteVarF
+  public :: streamReadVar
+  public :: streamReadVarF
+  public :: streamWriteVarSlice
+  public :: streamWriteVarSliceF
+  public :: streamReadVarSlice
+  public :: streamReadVarSliceF
+  public :: streamWriteVarChunk
+  public :: streamWriteVarChunkF
+  public :: streamDefRecord
+  public :: streamInqRecord
+  public :: streamWriteRecord
+  public :: streamWriteRecordF
+  public :: streamReadRecord
+  public :: streamReadRecordF
+  public :: streamCopyRecord
+  public :: cdiIterator_new
+  public :: cdiIterator_clone
+  public :: cdiIterator_serialize
+  public :: cdiIterator_deserialize
+  public :: cdiIterator_delete
+  public :: cdiIterator_nextField
+  public :: cdiIterator_inqStartTime
+  public :: cdiIterator_inqEndTime
+  public :: cdiIterator_inqRTime
+  public :: cdiIterator_inqVTime
+  public :: cdiIterator_inqLevelType
+  public :: cdiIterator_inqLevel
+  public :: cdiIterator_inqLevelUuid
+  public :: cdiIterator_inqTile
+  public :: cdiIterator_inqTileCount
+  public :: cdiIterator_inqParam
+  public :: cdiIterator_inqParamParts
+  public :: cdiIterator_inqDatatype
+  public :: cdiIterator_inqFiletype
+  public :: cdiIterator_inqTsteptype
+  public :: cdiIterator_inqVariableName
+  public :: cdiIterator_inqGridId
+  public :: cdiIterator_readField
+  public :: cdiIterator_readFieldF
+  public :: cdiGribIterator_clone
+  public :: cdiGribIterator_delete
+  public :: cdiGribIterator_getLong
+  public :: cdiGribIterator_getDouble
+  public :: cdiGribIterator_getLength
+  public :: cdiGribIterator_getString
+  public :: cdiGribIterator_getSize
+  public :: cdiGribIterator_getLongArray
+  public :: cdiGribIterator_getDoubleArray
+  public :: cdiGribIterator_inqEdition
+  public :: cdiGribIterator_inqLongValue
+  public :: cdiGribIterator_inqLongDefaultValue
+  public :: cdiGribIterator_inqDoubleValue
+  public :: cdiGribIterator_inqDoubleDefaultValue
+  public :: cdiGribIterator_inqStringValue
+  public :: vlistCreate
+  public :: vlistDestroy
+  public :: vlistDuplicate
+  public :: vlistCopyFlag
+  public :: vlistClearFlag
+  public :: vlistCat
+  public :: vlistMerge
+  public :: vlistPrint
+  public :: vlistNumber
+  public :: vlistNvars
+  public :: vlistNumGrids
+  public :: vlistNumZaxis
+  public :: vlistNsubtypes
+  public :: vlistDefNtsteps
+  public :: vlistNtsteps
+  public :: vlistGridsizeMax
+  public :: vlistGrid
+  public :: vlistGridIndex
+  public :: vlistChangeGridIndex
+  public :: vlistChangeGrid
+  public :: vlistZaxis
+  public :: vlistZaxisIndex
+  public :: vlistChangeZaxisIndex
+  public :: vlistChangeZaxis
+  public :: vlistNumRecords
+  public :: vlistSubtype
+  public :: vlistSubtypeIndex
+  public :: vlistDefTaxis
+  public :: vlistInqTaxis
+  public :: vlistDefTable
+  public :: vlistInqTable
+  public :: vlistDefInstitut
+  public :: vlistInqInstitut
+  public :: vlistDefModel
+  public :: vlistInqModel
+  public :: vlistDefVarTiles
+  public :: vlistDefVar
+  public :: vlistChangeVarGrid
+  public :: vlistChangeVarZaxis
+  public :: vlistInqVar
+  public :: vlistInqVarGrid
+  public :: vlistInqVarZaxis
+  public :: vlistInqVarID
+  public :: vlistDefVarTimetype
+  public :: vlistInqVarTimetype
+  public :: vlistDefVarTsteptype
+  public :: vlistInqVarTsteptype
+  public :: vlistDefVarCompType
+  public :: vlistInqVarCompType
+  public :: vlistDefVarCompLevel
+  public :: vlistInqVarCompLevel
+  public :: vlistDefVarParam
+  public :: vlistInqVarParam
+  public :: vlistDefVarCode
+  public :: vlistInqVarCode
+  public :: vlistDefVarDatatype
+  public :: vlistInqVarDatatype
+  public :: vlistDefVarXYZ
+  public :: vlistInqVarXYZ
+  public :: vlistDefVarNSB
+  public :: vlistInqVarNSB
+  public :: vlistInqVarNumber
+  public :: vlistDefVarInstitut
+  public :: vlistInqVarInstitut
+  public :: vlistDefVarModel
+  public :: vlistInqVarModel
+  public :: vlistDefVarTable
+  public :: vlistInqVarTable
+  public :: vlistDefVarName
+  public :: vlistInqVarName
+  public :: vlistCopyVarName
+  public :: vlistDefVarStdname
+  public :: vlistInqVarStdname
+  public :: vlistDefVarLongname
+  public :: vlistInqVarLongname
+  public :: vlistDefVarUnits
+  public :: vlistInqVarUnits
+  public :: vlistDefVarMissval
+  public :: vlistInqVarMissval
+  public :: vlistInqVarSize
+  public :: vlistDefIndex
+  public :: vlistInqIndex
+  public :: vlistDefFlag
+  public :: vlistInqFlag
+  public :: vlistFindVar
+  public :: vlistFindLevel
+  public :: vlistMergedVar
+  public :: vlistMergedLevel
+  public :: cdiClearAdditionalKeys
+  public :: cdiDefAdditionalKey
+  public :: vlistDefVarIntKey
+  public :: vlistDefVarDblKey
+  public :: vlistHasVarKey
+  public :: vlistInqVarDblKey
+  public :: vlistInqVarIntKey
+  public :: cdiInqNatts
+  public :: cdiInqAtt
+  public :: cdiInqAttLen
+  public :: cdiInqAttType
+  public :: cdiDelAtt
+  public :: cdiCopyAtts
+  public :: cdiDefAttInt
+  public :: cdiDefAttFlt
+  public :: cdiDefAttTxt
+  public :: cdiInqAttInt
+  public :: cdiInqAttFlt
+  public :: cdiInqAttTxt
+  public :: gridName
+  public :: gridNamePtr
+  public :: gridCompress
+  public :: gridDefMaskGME
+  public :: gridInqMaskGME
+  public :: gridDefMask
+  public :: gridInqMask
+  public :: gridCreate
+  public :: gridDestroy
+  public :: gridDuplicate
+  public :: gridDefProj
+  public :: gridInqProj
+  public :: gridInqProjType
+  public :: gridInqType
+  public :: gridInqSize
+  public :: gridDefXsize
+  public :: gridInqXsize
+  public :: gridDefYsize
+  public :: gridInqYsize
+  public :: gridDefNP
+  public :: gridInqNP
+  public :: gridDefXvals
+  public :: gridInqXvals
+  public :: gridInqXvalsPart
+  public :: gridInqXvalsPtr
+  public :: gridInqXIsc
+  public :: gridDefYvals
+  public :: gridInqYvals
+  public :: gridInqYvalsPart
+  public :: gridInqYvalsPtr
+  public :: gridInqYIsc
+  integer(c_int), public, parameter :: CDI_KEY_NAME = 942
+  integer(c_int), public, parameter :: CDI_KEY_LONGNAME = 943
+  integer(c_int), public, parameter :: CDI_KEY_STDNAME = 944
+  integer(c_int), public, parameter :: CDI_KEY_UNITS = 945
+  integer(c_int), public, parameter :: CDI_KEY_DATATYPE = 946
+  integer(c_int), public, parameter :: CDI_KEY_REFERENCEURI = 947
+  integer(c_int), public, parameter :: CDI_KEY_CHUNKS = 948
+  integer(c_int), public, parameter :: CDI_KEY_NUMBEROFGRIDUSED = 961
+  integer(c_int), public, parameter :: CDI_KEY_NUMBEROFGRIDINREFERENCE = 962
+  integer(c_int), public, parameter :: CDI_KEY_NUMBEROFVGRIDUSED = 963
+  integer(c_int), public, parameter :: CDI_KEY_NLEV = 964
+  integer(c_int), public, parameter :: CDI_KEY_CHUNKTYPE = 965
+  integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE = 966
+  integer(c_int), public, parameter :: CDI_KEY_MISSVAL = 701
+  integer(c_int), public, parameter :: CDI_KEY_ADDOFFSET = 702
+  integer(c_int), public, parameter :: CDI_KEY_SCALEFACTOR = 703
+  integer(c_int), public, parameter :: CDI_KEY_FILTERSPEC_IN = 720
+  integer(c_int), public, parameter :: CDI_KEY_FILTERSPEC = 721
+  integer(c_int), public, parameter :: CDI_KEY_UUID = 960
+  integer(c_int), public, parameter :: CDI_KEY_DIMNAME = 941
+  integer(c_int), public, parameter :: CDI_KEY_PSNAME = 950
+  integer(c_int), public, parameter :: CDI_KEY_P0NAME = 951
+  integer(c_int), public, parameter :: CDI_KEY_P0VALUE = 952
+  integer(c_int), public, parameter :: CDI_KEY_TABLESVERSION = 801
+  integer(c_int), public, parameter :: CDI_KEY_LOCALTABLESVERSION = 802
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFGENERATINGPROCESS = 803
+  integer(c_int), public, parameter :: CDI_KEY_PRODUCTDEFINITIONTEMPLATE = 804
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFPROCESSEDDATA = 805
+  integer(c_int), public, parameter :: CDI_KEY_SHAPEOFTHEEARTH = 806
+  integer(c_int), public, parameter :: CDI_KEY_BACKGROUNDPROCESS = 807
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFENSEMBLEFORECAST = 808
+  integer(c_int), public, parameter :: CDI_KEY_NUMBEROFFORECASTSINENSEMBLE =&
+  & 809
+  integer(c_int), public, parameter :: CDI_KEY_PERTURBATIONNUMBER = 810
+  integer(c_int), public, parameter :: CDI_KEY_CENTRE = 811
+  integer(c_int), public, parameter :: CDI_KEY_SUBCENTRE = 812
+  integer(c_int), public, parameter :: CDI_KEY_MPIMTYPE = 813
+  integer(c_int), public, parameter :: CDI_KEY_MPIMCLASS = 814
+  integer(c_int), public, parameter :: CDI_KEY_MPIMUSER = 815
+  integer(c_int), public, parameter :: CDI_KEY_REVSTATUS = 816
+  integer(c_int), public, parameter :: CDI_KEY_REVNUMBER = 817
+  integer(c_int), public, parameter :: CDI_KEY_GRIB2LOCALSECTIONNUMBER = 818
+  integer(c_int), public, parameter :: CDI_KEY_SECTION2PADDINGLENGTH = 819
+  integer(c_int), public, parameter :: CDI_KEY_SECTION2PADDING = 820
+  integer(c_int), public, parameter :: CDI_KEY_CONSTITUENTTYPE = 821
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFTIMEINCREMENT = 822
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFFIRSTFIXEDSURFACE = 823
+  integer(c_int), public, parameter :: CDI_KEY_TYPEOFSECONDFIXEDSURFACE = 824
+  integer(c_int), public, parameter :: CDI_KEY_UVRELATIVETOGRID = 825
+  integer(c_int), public, parameter :: CDI_KEY_SCANNINGMODE = 826
+  integer(c_int), public, parameter :: CDI_KEY_VDIMNAME = 920
+  integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_VARTYPE = 921
+  integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_VARNAME = 922
+  integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_NAME = 923
+  public :: cdiDefKeyInt
+  public :: cdiInqKeyInt
+  public :: cdiDefKeyFloat
+  public :: cdiInqKeyFloat
+  public :: cdiDefKeyBytes
+  public :: cdiInqKeyBytes
+  public :: cdiDefKeyString
+  public :: cdiInqKeyString
+  public :: cdiInqKeyLen
+  public :: cdiCopyKeys
+  public :: cdiCopyKey
+  public :: cdiDeleteKey
+  public :: gridDefXname
+  public :: gridInqXname
+  public :: gridDefXlongname
+  public :: gridInqXlongname
+  public :: gridDefXunits
+  public :: gridInqXunits
+  public :: gridDefYname
+  public :: gridInqYname
+  public :: gridDefYlongname
+  public :: gridInqYlongname
+  public :: gridDefYunits
+  public :: gridInqYunits
+  public :: gridDefDatatype
+  public :: gridInqDatatype
+  public :: gridInqXval
+  public :: gridInqYval
+  public :: gridInqXinc
+  public :: gridInqYinc
+  public :: gridIsCircular
+  public :: gridInqTrunc
+  public :: gridDefTrunc
+  public :: gridDefNumber
+  public :: gridInqNumber
+  public :: gridDefPosition
+  public :: gridInqPosition
+  public :: gridDefReference
+  public :: gridInqReference
+  public :: gridDefUUID
+  public :: gridInqUUID
+  public :: gridDefParamRLL
+  public :: gridInqParamRLL
+  public :: gridDefParamGME
+  public :: gridInqParamGME
+  public :: gridDefArea
+  public :: gridInqArea
+  public :: gridHasArea
+  public :: gridDefNvertex
+  public :: gridInqNvertex
+  public :: gridDefXbounds
+  public :: gridInqXbounds
+  public :: gridInqXboundsPart
+  public :: gridInqXboundsPtr
+  public :: gridDefYbounds
+  public :: gridInqYbounds
+  public :: gridInqYboundsPart
+  public :: gridInqYboundsPtr
+  public :: gridDefReducedPoints
+  public :: gridInqReducedPoints
+  public :: gridChangeType
+  public :: gridDefComplexPacking
+  public :: gridInqComplexPacking
+  public :: zaxisName
+  public :: zaxisNamePtr
+  public :: zaxisCreate
+  public :: zaxisDestroy
+  public :: zaxisInqType
+  public :: zaxisInqSize
+  public :: zaxisDuplicate
+  public :: zaxisDefLevels
+  public :: zaxisInqLevels
+  public :: zaxisInqCLen
+  public :: zaxisDefLevel
+  public :: zaxisInqLevel
+  public :: zaxisDefNlevRef
+  public :: zaxisInqNlevRef
+  public :: zaxisDefNumber
+  public :: zaxisInqNumber
+  public :: zaxisDefUUID
+  public :: zaxisInqUUID
+  public :: zaxisDefName
+  public :: zaxisInqName
+  public :: zaxisDefLongname
+  public :: zaxisInqLongname
+  public :: zaxisDefUnits
+  public :: zaxisInqUnits
+  public :: zaxisInqStdname
+  public :: zaxisDefDatatype
+  public :: zaxisInqDatatype
+  public :: zaxisDefPositive
+  public :: zaxisInqPositive
+  public :: zaxisDefScalar
+  public :: zaxisInqScalar
+  public :: zaxisDefVct
+  public :: zaxisInqVct
+  public :: zaxisInqVctSize
+  public :: zaxisInqVctPtr
+  public :: zaxisDefLbounds
+  public :: zaxisInqLbounds
+  public :: zaxisInqLbound
+  public :: zaxisDefUbounds
+  public :: zaxisInqUbounds
+  public :: zaxisInqUbound
+  public :: zaxisDefWeights
+  public :: zaxisInqWeights
+  public :: zaxisChangeType
+  public :: taxisCreate
+  public :: taxisDestroy
+  public :: taxisDuplicate
+  public :: taxisCopyTimestep
+  public :: taxisDefType
+  public :: taxisInqType
+  public :: taxisDefVdate
+  public :: taxisDefVtime
+  public :: taxisInqVdate
+  public :: taxisInqVtime
+  public :: taxisDefRdate
+  public :: taxisDefRtime
+  public :: taxisInqRdate
+  public :: taxisInqRtime
+  public :: taxisHasBounds
+  public :: taxisWithBounds
+  public :: taxisDeleteBounds
+  public :: taxisDefVdateBounds
+  public :: taxisDefVtimeBounds
+  public :: taxisInqVdateBounds
+  public :: taxisInqVtimeBounds
+  public :: taxisDefCalendar
+  public :: taxisInqCalendar
+  public :: taxisDefTunit
+  public :: taxisInqTunit
+  public :: taxisDefForecastTunit
+  public :: taxisInqForecastTunit
+  public :: taxisDefForecastPeriod
+  public :: taxisInqForecastPeriod
+  public :: taxisDefNumavg
+  public :: taxisInqNumavg
+  public :: taxisNamePtr
+  public :: tunitNamePtr
+  public :: institutDef
+  public :: institutInq
+  public :: institutInqNumber
+  public :: institutInqCenter
+  public :: institutInqSubcenter
+  public :: institutInqNamePtr
+  public :: institutInqLongnamePtr
+  public :: modelDef
+  public :: modelInq
+  public :: modelInqInstitut
+  public :: modelInqGribID
+  public :: modelInqNamePtr
+  public :: tableWrite
+  public :: tableRead
+  public :: tableDef
+  public :: tableInqNamePtr
+  public :: tableInq
+  public :: tableInqNumber
+  public :: tableInqNum
+  public :: tableInqModel
+  public :: tableInqEntry
+  public :: subtypeCreate
+  public :: subtypePrint
+  public :: subtypeCompare
+  public :: subtypeInqSize
+  public :: subtypeInqActiveIndex
+  public :: subtypeDefActiveIndex
+  public :: subtypeInqTile
+  public :: subtypeInqAttribute
+  public :: vlistInqVarSubtype
+  public :: gribapiLibraryVersion
+  public :: zaxisDefLtype
+  public :: vlistInqVarTypeOfGeneratingProcess
+  public :: vlistDefVarTypeOfGeneratingProcess
+  public :: vlistDefVarProductDefinitionTemplate
+  public :: date_to_julday
+  public :: julday_to_date
+  public :: time_to_sec
+  public :: sec_to_time
+  integer(c_int), public, parameter :: HAVE_CDI_PROJ_FUNCS = 1
+  public :: cdf_def_var_filter
+
+  interface
+    subroutine cdiReset() bind(c, name = 'cdiReset')
+    end subroutine cdiReset
+
+    subroutine cdiDebug(debug_dummy) bind(c, name = 'cdiDebug')
+      import c_int
+      integer(c_int), value :: debug_dummy
+    end subroutine cdiDebug
+
+    subroutine cdiPrintVersion() bind(c, name = 'cdiPrintVersion')
+    end subroutine cdiPrintVersion
+
+    function cdiHaveFiletype(filetype_dummy) bind(c, name = 'cdiHaveFiletype')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: filetype_dummy
+      integer(c_int) :: f_result
+    end function cdiHaveFiletype
+
+    subroutine cdiDefMissval(missval_dummy) bind(c, name = 'cdiDefMissval')
+      import c_double
+      real(c_double), value :: missval_dummy
+    end subroutine cdiDefMissval
+
+    function cdiInqMissval() bind(c, name = 'cdiInqMissval') result(f_result)
+      import c_double
+      real(c_double) :: f_result
+    end function cdiInqMissval
+
+    function namespaceNew() bind(c, name = 'namespaceNew') result(f_result)
+      import c_int
+      integer(c_int) :: f_result
+    end function namespaceNew
+
+    subroutine namespaceSetActive(namespaceID_dummy) bind(c, name =&
+    & 'namespaceSetActive')
+      import c_int
+      integer(c_int), value :: namespaceID_dummy
+    end subroutine namespaceSetActive
+
+    function namespaceGetActive() bind(c, name = 'namespaceGetActive')&
+    & result(f_result)
+      import c_int
+      integer(c_int) :: f_result
+    end function namespaceGetActive
+
+    subroutine namespaceDelete(namespaceID_dummy) bind(c, name =&
+    & 'namespaceDelete')
+      import c_int
+      integer(c_int), value :: namespaceID_dummy
+    end subroutine namespaceDelete
+
+    subroutine cdiDecodeParam(param_dummy, pnum_dummy, pcat_dummy, pdis_dummy)&
+    & bind(c, name = 'cdiDecodeParam')
+      import c_int
+      integer(c_int), value :: param_dummy
+      integer(c_int), intent(inout) :: pnum_dummy
+      integer(c_int), intent(inout) :: pcat_dummy
+      integer(c_int), intent(inout) :: pdis_dummy
+    end subroutine cdiDecodeParam
+
+    function cdiEncodeParam(pnum_dummy, pcat_dummy, pdis_dummy) bind(c, name =&
+    & 'cdiEncodeParam') result(f_result)
+      import c_int
+      integer(c_int), value :: pnum_dummy
+      integer(c_int), value :: pcat_dummy
+      integer(c_int), value :: pdis_dummy
+      integer(c_int) :: f_result
+    end function cdiEncodeParam
+
+    subroutine cdiDecodeDate(date_dummy, year_dummy, month_dummy, day_dummy)&
+    & bind(c, name = 'cdiDecodeDate')
+      import c_int
+      integer(c_int), value :: date_dummy
+      integer(c_int), intent(inout) :: year_dummy
+      integer(c_int), intent(inout) :: month_dummy
+      integer(c_int), intent(inout) :: day_dummy
+    end subroutine cdiDecodeDate
+
+    function cdiEncodeDate(year_dummy, month_dummy, day_dummy) bind(c, name =&
+    & 'cdiEncodeDate') result(f_result)
+      import c_int
+      integer(c_int), value :: year_dummy
+      integer(c_int), value :: month_dummy
+      integer(c_int), value :: day_dummy
+      integer(c_int) :: f_result
+    end function cdiEncodeDate
+
+    subroutine cdiDecodeTime(time_dummy, hour_dummy, minute_dummy,&
+    & second_dummy) bind(c, name = 'cdiDecodeTime')
+      import c_int
+      integer(c_int), value :: time_dummy
+      integer(c_int), intent(inout) :: hour_dummy
+      integer(c_int), intent(inout) :: minute_dummy
+      integer(c_int), intent(inout) :: second_dummy
+    end subroutine cdiDecodeTime
+
+    function cdiEncodeTime(hour_dummy, minute_dummy, second_dummy) bind(c, name&
+    & = 'cdiEncodeTime') result(f_result)
+      import c_int
+      integer(c_int), value :: hour_dummy
+      integer(c_int), value :: minute_dummy
+      integer(c_int), value :: second_dummy
+      integer(c_int) :: f_result
+    end function cdiEncodeTime
+
+    subroutine streamClose(streamID_dummy) bind(c, name = 'streamClose')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+    end subroutine streamClose
+
+    subroutine streamSync(streamID_dummy) bind(c, name = 'streamSync')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+    end subroutine streamSync
+
+    subroutine streamDefMaxSteps(streamID_dummy, maxSteps_dummy) bind(c, name =&
+    & 'streamDefMaxSteps')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: maxSteps_dummy
+    end subroutine streamDefMaxSteps
+
+    subroutine streamDefNumWorker(streamID_dummy, numWorker_dummy) bind(c, name&
+    & = 'streamDefNumWorker')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: numWorker_dummy
+    end subroutine streamDefNumWorker
+
+    function streamInqNumSteps(streamID_dummy) bind(c, name =&
+    & 'streamInqNumSteps') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqNumSteps
+
+    subroutine streamDefVlist(streamID_dummy, vlistID_dummy) bind(c, name =&
+    & 'streamDefVlist')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: vlistID_dummy
+    end subroutine streamDefVlist
+
+    function streamInqVlist(streamID_dummy) bind(c, name = 'streamInqVlist')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqVlist
+
+    function streamInqFiletype(streamID_dummy) bind(c, name =&
+    & 'streamInqFiletype') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqFiletype
+
+    subroutine streamDefByteorder(streamID_dummy, byteorder_dummy) bind(c, name&
+    & = 'streamDefByteorder')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: byteorder_dummy
+    end subroutine streamDefByteorder
+
+    function streamInqByteorder(streamID_dummy) bind(c, name =&
+    & 'streamInqByteorder') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqByteorder
+
+    subroutine streamDefShuffle(streamID_dummy, shuffle_dummy) bind(c, name =&
+    & 'streamDefShuffle')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: shuffle_dummy
+    end subroutine streamDefShuffle
+
+    subroutine streamDefCompType(streamID_dummy, comptype_dummy) bind(c, name =&
+    & 'streamDefCompType')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: comptype_dummy
+    end subroutine streamDefCompType
+
+    function streamInqCompType(streamID_dummy) bind(c, name =&
+    & 'streamInqCompType') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqCompType
+
+    subroutine streamDefCompLevel(streamID_dummy, complevel_dummy) bind(c, name&
+    & = 'streamDefCompLevel')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: complevel_dummy
+    end subroutine streamDefCompLevel
+
+    function streamInqCompLevel(streamID_dummy) bind(c, name =&
+    & 'streamInqCompLevel') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqCompLevel
+
+    function streamDefTimestep(streamID_dummy, tsID_dummy) bind(c, name =&
+    & 'streamDefTimestep') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: tsID_dummy
+      integer(c_int) :: f_result
+    end function streamDefTimestep
+
+    function streamInqTimestep(streamID_dummy, tsID_dummy) bind(c, name =&
+    & 'streamInqTimestep') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: tsID_dummy
+      integer(c_int) :: f_result
+    end function streamInqTimestep
+
+    function streamInqCurTimestepID(streamID_dummy) bind(c, name =&
+    & 'streamInqCurTimestepID') result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqCurTimestepID
+
+    function streamNvals(streamID_dummy) bind(c, name = 'streamNvals')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamNvals
+
+    function streamInqNvars(streamID_dummy) bind(c, name = 'streamInqNvars')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int) :: f_result
+    end function streamInqNvars
+
+    subroutine streamWriteVar(streamID_dummy, varID_dummy, data_dummy,&
+    & numMissVals_dummy) bind(c, name = 'streamWriteVar')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_double), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVar
+
+    subroutine streamWriteVarF(streamID_dummy, varID_dummy, data_dummy,&
+    & numMissVals_dummy) bind(c, name = 'streamWriteVarF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_float), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVarF
+
+    subroutine streamReadVar(streamID_dummy, varID_dummy, data_dummy,&
+    & numMissVals_dummy) bind(c, name = 'streamReadVar')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_double), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadVar
+
+    subroutine streamReadVarF(streamID_dummy, varID_dummy, data_dummy,&
+    & numMissVals_dummy) bind(c, name = 'streamReadVarF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_float), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadVarF
+
+    subroutine streamWriteVarSlice(streamID_dummy, varID_dummy, levelID_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarSlice')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_double), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVarSlice
+
+    subroutine streamWriteVarSliceF(streamID_dummy, varID_dummy, levelID_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarSliceF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_float), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVarSliceF
+
+    subroutine streamReadVarSlice(streamID_dummy, varID_dummy, levelID_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamReadVarSlice')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_double), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadVarSlice
+
+    subroutine streamReadVarSliceF(streamID_dummy, varID_dummy, levelID_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamReadVarSliceF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_float), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadVarSliceF
+
+    subroutine streamWriteVarChunk(streamID_dummy, varID_dummy, rect_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarChunk')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), intent(in) :: rect_dummy(2, *)
+      real(c_double), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVarChunk
+
+    subroutine streamWriteVarChunkF(streamID_dummy, varID_dummy, rect_dummy,&
+    & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarChunkF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), intent(in) :: rect_dummy(2, *)
+      real(c_float), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteVarChunkF
+
+    subroutine streamDefRecord(streamID_dummy, varID_dummy, levelID_dummy)&
+    & bind(c, name = 'streamDefRecord')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+    end subroutine streamDefRecord
+
+    subroutine streamInqRecord(streamID_dummy, varID_dummy, levelID_dummy)&
+    & bind(c, name = 'streamInqRecord')
+      import c_int
+      integer(c_int), value :: streamID_dummy
+      integer(c_int), intent(inout) :: varID_dummy
+      integer(c_int), intent(inout) :: levelID_dummy
+    end subroutine streamInqRecord
+
+    subroutine streamWriteRecord(streamID_dummy, data_dummy, numMissVals_dummy)&
+    & bind(c, name = 'streamWriteRecord')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      real(c_double), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteRecord
+
+    subroutine streamWriteRecordF(streamID_dummy, data_dummy,&
+    & numMissVals_dummy) bind(c, name = 'streamWriteRecordF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      real(c_float), intent(in) :: data_dummy(*)
+      integer(c_int), value :: numMissVals_dummy
+    end subroutine streamWriteRecordF
+
+    subroutine streamReadRecord(streamID_dummy, data_dummy, numMissVals_dummy)&
+    & bind(c, name = 'streamReadRecord')
+      import c_double, c_int
+      integer(c_int), value :: streamID_dummy
+      real(c_double), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadRecord
+
+    subroutine streamReadRecordF(streamID_dummy, data_dummy, numMissVals_dummy)&
+    & bind(c, name = 'streamReadRecordF')
+      import c_float, c_int
+      integer(c_int), value :: streamID_dummy
+      real(c_float), intent(inout) :: data_dummy(*)
+      integer(c_int), intent(inout) :: numMissVals_dummy
+    end subroutine streamReadRecordF
+
+    subroutine streamCopyRecord(streamIDdest_dummy, streamIDsrc_dummy) bind(c,&
+    & name = 'streamCopyRecord')
+      import c_int
+      integer(c_int), value :: streamIDdest_dummy
+      integer(c_int), value :: streamIDsrc_dummy
+    end subroutine streamCopyRecord
+
+    function vlistCreate() bind(c, name = 'vlistCreate') result(f_result)
+      import c_int
+      integer(c_int) :: f_result
+    end function vlistCreate
+
+    subroutine vlistDestroy(vlistID_dummy) bind(c, name = 'vlistDestroy')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+    end subroutine vlistDestroy
+
+    function vlistDuplicate(vlistID_dummy) bind(c, name = 'vlistDuplicate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistDuplicate
+
+    subroutine vlistCopyFlag(vlistID2_dummy, vlistID1_dummy) bind(c, name =&
+    & 'vlistCopyFlag')
+      import c_int
+      integer(c_int), value :: vlistID2_dummy
+      integer(c_int), value :: vlistID1_dummy
+    end subroutine vlistCopyFlag
+
+    subroutine vlistClearFlag(vlistID_dummy) bind(c, name = 'vlistClearFlag')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+    end subroutine vlistClearFlag
+
+    subroutine vlistCat(vlistID2_dummy, vlistID1_dummy) bind(c, name =&
+    & 'vlistCat')
+      import c_int
+      integer(c_int), value :: vlistID2_dummy
+      integer(c_int), value :: vlistID1_dummy
+    end subroutine vlistCat
+
+    subroutine vlistMerge(vlistID2_dummy, vlistID1_dummy) bind(c, name =&
+    & 'vlistMerge')
+      import c_int
+      integer(c_int), value :: vlistID2_dummy
+      integer(c_int), value :: vlistID1_dummy
+    end subroutine vlistMerge
+
+    subroutine vlistPrint(vlistID_dummy) bind(c, name = 'vlistPrint')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+    end subroutine vlistPrint
+
+    function vlistNumber(vlistID_dummy) bind(c, name = 'vlistNumber')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNumber
+
+    function vlistNvars(vlistID_dummy) bind(c, name = 'vlistNvars')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNvars
+
+    function vlistNumGrids(vlistID_dummy) bind(c, name = 'vlistNumGrids')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNumGrids
+
+    function vlistNumZaxis(vlistID_dummy) bind(c, name = 'vlistNumZaxis')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNumZaxis
+
+    function vlistNsubtypes(vlistID_dummy) bind(c, name = 'vlistNsubtypes')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNsubtypes
+
+    subroutine vlistDefNtsteps(vlistID_dummy, nts_dummy) bind(c, name =&
+    & 'vlistDefNtsteps')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: nts_dummy
+    end subroutine vlistDefNtsteps
+
+    function vlistNtsteps(vlistID_dummy) bind(c, name = 'vlistNtsteps')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNtsteps
+
+    function vlistGridsizeMax(vlistID_dummy) bind(c, name = 'vlistGridsizeMax')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistGridsizeMax
+
+    function vlistGrid(vlistID_dummy, index_dummy) bind(c, name = 'vlistGrid')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: index_dummy
+      integer(c_int) :: f_result
+    end function vlistGrid
+
+    function vlistGridIndex(vlistID_dummy, gridID_dummy) bind(c, name =&
+    & 'vlistGridIndex') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function vlistGridIndex
+
+    subroutine vlistChangeGridIndex(vlistID_dummy, index_dummy, gridID_dummy)&
+    & bind(c, name = 'vlistChangeGridIndex')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: index_dummy
+      integer(c_int), value :: gridID_dummy
+    end subroutine vlistChangeGridIndex
+
+    subroutine vlistChangeGrid(vlistID_dummy, gridID1_dummy, gridID2_dummy)&
+    & bind(c, name = 'vlistChangeGrid')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: gridID1_dummy
+      integer(c_int), value :: gridID2_dummy
+    end subroutine vlistChangeGrid
+
+    function vlistZaxis(vlistID_dummy, index_dummy) bind(c, name =&
+    & 'vlistZaxis') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: index_dummy
+      integer(c_int) :: f_result
+    end function vlistZaxis
+
+    function vlistZaxisIndex(vlistID_dummy, zaxisID_dummy) bind(c, name =&
+    & 'vlistZaxisIndex') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function vlistZaxisIndex
+
+    subroutine vlistChangeZaxisIndex(vlistID_dummy, index_dummy, zaxisID_dummy)&
+    & bind(c, name = 'vlistChangeZaxisIndex')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: index_dummy
+      integer(c_int), value :: zaxisID_dummy
+    end subroutine vlistChangeZaxisIndex
+
+    subroutine vlistChangeZaxis(vlistID_dummy, zaxisID1_dummy, zaxisID2_dummy)&
+    & bind(c, name = 'vlistChangeZaxis')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: zaxisID1_dummy
+      integer(c_int), value :: zaxisID2_dummy
+    end subroutine vlistChangeZaxis
+
+    function vlistNumRecords(vlistID_dummy) bind(c, name = 'vlistNumRecords')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistNumRecords
+
+    function vlistSubtype(vlistID_dummy, index_dummy) bind(c, name =&
+    & 'vlistSubtype') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: index_dummy
+      integer(c_int) :: f_result
+    end function vlistSubtype
+
+    function vlistSubtypeIndex(vlistID_dummy, subtypeID_dummy) bind(c, name =&
+    & 'vlistSubtypeIndex') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: subtypeID_dummy
+      integer(c_int) :: f_result
+    end function vlistSubtypeIndex
+
+    subroutine vlistDefTaxis(vlistID_dummy, taxisID_dummy) bind(c, name =&
+    & 'vlistDefTaxis')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: taxisID_dummy
+    end subroutine vlistDefTaxis
+
+    function vlistInqTaxis(vlistID_dummy) bind(c, name = 'vlistInqTaxis')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqTaxis
+
+    subroutine vlistDefTable(vlistID_dummy, tableID_dummy) bind(c, name =&
+    & 'vlistDefTable')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: tableID_dummy
+    end subroutine vlistDefTable
+
+    function vlistInqTable(vlistID_dummy) bind(c, name = 'vlistInqTable')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqTable
+
+    subroutine vlistDefInstitut(vlistID_dummy, instID_dummy) bind(c, name =&
+    & 'vlistDefInstitut')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: instID_dummy
+    end subroutine vlistDefInstitut
+
+    function vlistInqInstitut(vlistID_dummy) bind(c, name = 'vlistInqInstitut')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqInstitut
+
+    subroutine vlistDefModel(vlistID_dummy, modelID_dummy) bind(c, name =&
+    & 'vlistDefModel')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: modelID_dummy
+    end subroutine vlistDefModel
+
+    function vlistInqModel(vlistID_dummy) bind(c, name = 'vlistInqModel')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqModel
+
+    function vlistDefVarTiles(vlistID_dummy, gridID_dummy, zaxisID_dummy,&
+    & timetype_dummy, tilesetID_dummy) bind(c, name = 'vlistDefVarTiles')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: timetype_dummy
+      integer(c_int), value :: tilesetID_dummy
+      integer(c_int) :: f_result
+    end function vlistDefVarTiles
+
+    function vlistDefVar(vlistID_dummy, gridID_dummy, zaxisID_dummy,&
+    & timetype_dummy) bind(c, name = 'vlistDefVar') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: timetype_dummy
+      integer(c_int) :: f_result
+    end function vlistDefVar
+
+    subroutine vlistChangeVarGrid(vlistID_dummy, varID_dummy, gridID_dummy)&
+    & bind(c, name = 'vlistChangeVarGrid')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: gridID_dummy
+    end subroutine vlistChangeVarGrid
+
+    subroutine vlistChangeVarZaxis(vlistID_dummy, varID_dummy, zaxisID_dummy)&
+    & bind(c, name = 'vlistChangeVarZaxis')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: zaxisID_dummy
+    end subroutine vlistChangeVarZaxis
+
+    subroutine vlistInqVar(vlistID_dummy, varID_dummy, gridID_dummy,&
+    & zaxisID_dummy, timetype_dummy) bind(c, name = 'vlistInqVar')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), intent(inout) :: gridID_dummy
+      integer(c_int), intent(inout) :: zaxisID_dummy
+      integer(c_int), intent(inout) :: timetype_dummy
+    end subroutine vlistInqVar
+
+    function vlistInqVarGrid(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarGrid') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarGrid
+
+    function vlistInqVarZaxis(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarZaxis') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarZaxis
+
+    function vlistInqVarID(vlistID_dummy, code_dummy) bind(c, name =&
+    & 'vlistInqVarID') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: code_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarID
+
+    subroutine vlistDefVarTimetype(vlistID_dummy, varID_dummy, timetype_dummy)&
+    & bind(c, name = 'vlistDefVarTimetype')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: timetype_dummy
+    end subroutine vlistDefVarTimetype
+
+    function vlistInqVarTimetype(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarTimetype') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarTimetype
+
+    subroutine vlistDefVarTsteptype(vlistID_dummy, varID_dummy,&
+    & tsteptype_dummy) bind(c, name = 'vlistDefVarTsteptype')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: tsteptype_dummy
+    end subroutine vlistDefVarTsteptype
+
+    function vlistInqVarTsteptype(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarTsteptype') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarTsteptype
+
+    subroutine vlistDefVarCompType(vlistID_dummy, varID_dummy, comptype_dummy)&
+    & bind(c, name = 'vlistDefVarCompType')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: comptype_dummy
+    end subroutine vlistDefVarCompType
+
+    function vlistInqVarCompType(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarCompType') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarCompType
+
+    subroutine vlistDefVarCompLevel(vlistID_dummy, varID_dummy,&
+    & complevel_dummy) bind(c, name = 'vlistDefVarCompLevel')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: complevel_dummy
+    end subroutine vlistDefVarCompLevel
+
+    function vlistInqVarCompLevel(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarCompLevel') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarCompLevel
+
+    subroutine vlistDefVarParam(vlistID_dummy, varID_dummy, param_dummy)&
+    & bind(c, name = 'vlistDefVarParam')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: param_dummy
+    end subroutine vlistDefVarParam
+
+    function vlistInqVarParam(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarParam') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarParam
+
+    subroutine vlistDefVarCode(vlistID_dummy, varID_dummy, code_dummy) bind(c,&
+    & name = 'vlistDefVarCode')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: code_dummy
+    end subroutine vlistDefVarCode
+
+    function vlistInqVarCode(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarCode') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarCode
+
+    subroutine vlistDefVarDatatype(vlistID_dummy, varID_dummy, datatype_dummy)&
+    & bind(c, name = 'vlistDefVarDatatype')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: datatype_dummy
+    end subroutine vlistDefVarDatatype
+
+    function vlistInqVarDatatype(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarDatatype') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarDatatype
+
+    subroutine vlistDefVarXYZ(vlistID_dummy, varID_dummy, xyz_dummy) bind(c,&
+    & name = 'vlistDefVarXYZ')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: xyz_dummy
+    end subroutine vlistDefVarXYZ
+
+    function vlistInqVarXYZ(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarXYZ') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarXYZ
+
+    subroutine vlistDefVarNSB(vlistID_dummy, varID_dummy, nsb_dummy) bind(c,&
+    & name = 'vlistDefVarNSB')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: nsb_dummy
+    end subroutine vlistDefVarNSB
+
+    function vlistInqVarNSB(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarNSB') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarNSB
+
+    function vlistInqVarNumber(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarNumber') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarNumber
+
+    subroutine vlistDefVarInstitut(vlistID_dummy, varID_dummy, instID_dummy)&
+    & bind(c, name = 'vlistDefVarInstitut')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: instID_dummy
+    end subroutine vlistDefVarInstitut
+
+    function vlistInqVarInstitut(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarInstitut') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarInstitut
+
+    subroutine vlistDefVarModel(vlistID_dummy, varID_dummy, modelID_dummy)&
+    & bind(c, name = 'vlistDefVarModel')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: modelID_dummy
+    end subroutine vlistDefVarModel
+
+    function vlistInqVarModel(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarModel') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarModel
+
+    subroutine vlistDefVarTable(vlistID_dummy, varID_dummy, tableID_dummy)&
+    & bind(c, name = 'vlistDefVarTable')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: tableID_dummy
+    end subroutine vlistDefVarTable
+
+    function vlistInqVarTable(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarTable') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarTable
+
+    subroutine vlistDefVarMissval(vlistID_dummy, varID_dummy, missval_dummy)&
+    & bind(c, name = 'vlistDefVarMissval')
+      import c_double, c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_double), value :: missval_dummy
+    end subroutine vlistDefVarMissval
+
+    function vlistInqVarMissval(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarMissval') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      real(c_double) :: f_result
+    end function vlistInqVarMissval
+
+    function vlistInqVarSize(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarSize') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarSize
+
+    subroutine vlistDefIndex(vlistID_dummy, varID_dummy, levID_dummy,&
+    & index_dummy) bind(c, name = 'vlistDefIndex')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levID_dummy
+      integer(c_int), value :: index_dummy
+    end subroutine vlistDefIndex
+
+    function vlistInqIndex(vlistID_dummy, varID_dummy, levID_dummy) bind(c,&
+    & name = 'vlistInqIndex') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqIndex
+
+    subroutine vlistDefFlag(vlistID_dummy, varID_dummy, levID_dummy,&
+    & flag_dummy) bind(c, name = 'vlistDefFlag')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levID_dummy
+      integer(c_int), value :: flag_dummy
+    end subroutine vlistDefFlag
+
+    function vlistInqFlag(vlistID_dummy, varID_dummy, levID_dummy) bind(c, name&
+    & = 'vlistInqFlag') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqFlag
+
+    function vlistFindVar(vlistID_dummy, fvarID_dummy) bind(c, name =&
+    & 'vlistFindVar') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: fvarID_dummy
+      integer(c_int) :: f_result
+    end function vlistFindVar
+
+    function vlistFindLevel(vlistID_dummy, fvarID_dummy, flevelID_dummy)&
+    & bind(c, name = 'vlistFindLevel') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: fvarID_dummy
+      integer(c_int), value :: flevelID_dummy
+      integer(c_int) :: f_result
+    end function vlistFindLevel
+
+    function vlistMergedVar(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistMergedVar') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistMergedVar
+
+    function vlistMergedLevel(vlistID_dummy, varID_dummy, levelID_dummy)&
+    & bind(c, name = 'vlistMergedLevel') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: levelID_dummy
+      integer(c_int) :: f_result
+    end function vlistMergedLevel
+
+    subroutine cdiClearAdditionalKeys() bind(c, name =&
+    & 'cdiClearAdditionalKeys')
+    end subroutine cdiClearAdditionalKeys
+
+    function cdiInqNatts(cdiID_dummy, varID_dummy, nattsp_dummy) bind(c, name =&
+    & 'cdiInqNatts') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), intent(inout) :: nattsp_dummy
+      integer(c_int) :: f_result
+    end function cdiInqNatts
+
+    function cdiCopyAtts(cdiID1_dummy, varID1_dummy, cdiID2_dummy,&
+    & varID2_dummy) bind(c, name = 'cdiCopyAtts') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID1_dummy
+      integer(c_int), value :: varID1_dummy
+      integer(c_int), value :: cdiID2_dummy
+      integer(c_int), value :: varID2_dummy
+      integer(c_int) :: f_result
+    end function cdiCopyAtts
+
+    subroutine gridCompress(gridID_dummy) bind(c, name = 'gridCompress')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+    end subroutine gridCompress
+
+    subroutine gridDefMaskGME(gridID_dummy, mask_dummy) bind(c, name =&
+    & 'gridDefMaskGME')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(in) :: mask_dummy(*)
+    end subroutine gridDefMaskGME
+
+    function gridInqMaskGME(gridID_dummy, mask_dummy) bind(c, name =&
+    & 'gridInqMaskGME') result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(inout) :: mask_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqMaskGME
+
+    subroutine gridDefMask(gridID_dummy, mask_dummy) bind(c, name =&
+    & 'gridDefMask')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(in) :: mask_dummy(*)
+    end subroutine gridDefMask
+
+    function gridInqMask(gridID_dummy, mask_dummy) bind(c, name =&
+    & 'gridInqMask') result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(inout) :: mask_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqMask
+
+    function gridCreate(gridtype_dummy, size_dummy) bind(c, name =&
+    & 'gridCreate') result(f_result)
+      import c_int
+      integer(c_int), value :: gridtype_dummy
+      integer(c_int), value :: size_dummy
+      integer(c_int) :: f_result
+    end function gridCreate
+
+    subroutine gridDestroy(gridID_dummy) bind(c, name = 'gridDestroy')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+    end subroutine gridDestroy
+
+    function gridDuplicate(gridID_dummy) bind(c, name = 'gridDuplicate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridDuplicate
+
+    subroutine gridDefProj(gridID_dummy, projID_dummy) bind(c, name =&
+    & 'gridDefProj')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: projID_dummy
+    end subroutine gridDefProj
+
+    function gridInqProj(gridID_dummy) bind(c, name = 'gridInqProj')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqProj
+
+    function gridInqProjType(gridID_dummy) bind(c, name = 'gridInqProjType')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqProjType
+
+    function gridInqType(gridID_dummy) bind(c, name = 'gridInqType')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqType
+
+    function gridInqSize(gridID_dummy) bind(c, name = 'gridInqSize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqSize
+
+    subroutine gridDefXsize(gridID_dummy, xsize_dummy) bind(c, name =&
+    & 'gridDefXsize')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: xsize_dummy
+    end subroutine gridDefXsize
+
+    function gridInqXsize(gridID_dummy) bind(c, name = 'gridInqXsize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqXsize
+
+    subroutine gridDefYsize(gridID_dummy, ysize_dummy) bind(c, name =&
+    & 'gridDefYsize')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: ysize_dummy
+    end subroutine gridDefYsize
+
+    function gridInqYsize(gridID_dummy) bind(c, name = 'gridInqYsize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqYsize
+
+    subroutine gridDefNP(gridID_dummy, np_dummy) bind(c, name = 'gridDefNP')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: np_dummy
+    end subroutine gridDefNP
+
+    function gridInqNP(gridID_dummy) bind(c, name = 'gridInqNP')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqNP
+
+    subroutine gridDefXvals(gridID_dummy, xvals_dummy) bind(c, name =&
+    & 'gridDefXvals')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(in) :: xvals_dummy(*)
+    end subroutine gridDefXvals
+
+    function gridInqXvals(gridID_dummy, xvals_dummy) bind(c, name =&
+    & 'gridInqXvals') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: xvals_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqXvals
+
+    function gridInqXvalsPart(gridID_dummy, start_dummy, size_dummy,&
+    & xvals_dummy) bind(c, name = 'gridInqXvalsPart') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: start_dummy
+      integer(c_int), value :: size_dummy
+      real(c_double), intent(inout) :: xvals_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqXvalsPart
+
+    function gridInqXvalsPtr(gridID_dummy) bind(c, name = 'gridInqXvalsPtr')&
+    & result(f_result)
+      import c_int, c_ptr
+      integer(c_int), value :: gridID_dummy
+      type(c_ptr) :: f_result
+    end function gridInqXvalsPtr
+
+    function gridInqXIsc(gridID_dummy) bind(c, name = 'gridInqXIsc')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqXIsc
+
+    subroutine gridDefYvals(gridID_dummy, yvals_dummy) bind(c, name =&
+    & 'gridDefYvals')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(in) :: yvals_dummy(*)
+    end subroutine gridDefYvals
+
+    function gridInqYvals(gridID_dummy, yvals_dummy) bind(c, name =&
+    & 'gridInqYvals') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: yvals_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqYvals
+
+    function gridInqYvalsPart(gridID_dummy, start_dummy, size_dummy,&
+    & yvals_dummy) bind(c, name = 'gridInqYvalsPart') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: start_dummy
+      integer(c_int), value :: size_dummy
+      real(c_double), intent(inout) :: yvals_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqYvalsPart
+
+    function gridInqYvalsPtr(gridID_dummy) bind(c, name = 'gridInqYvalsPtr')&
+    & result(f_result)
+      import c_int, c_ptr
+      integer(c_int), value :: gridID_dummy
+      type(c_ptr) :: f_result
+    end function gridInqYvalsPtr
+
+    function gridInqYIsc(gridID_dummy) bind(c, name = 'gridInqYIsc')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqYIsc
+
+    function cdiDefKeyInt(cdiID_dummy, varID_dummy, key_dummy, value_dummy)&
+    & bind(c, name = 'cdiDefKeyInt') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(c_int), value :: value_dummy
+      integer(c_int) :: f_result
+    end function cdiDefKeyInt
+
+    function cdiInqKeyInt(cdiID_dummy, varID_dummy, key_dummy, value_dummy)&
+    & bind(c, name = 'cdiInqKeyInt') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(c_int), intent(inout) :: value_dummy
+      integer(c_int) :: f_result
+    end function cdiInqKeyInt
+
+    function cdiDefKeyFloat(cdiID_dummy, varID_dummy, key_dummy, value_dummy)&
+    & bind(c, name = 'cdiDefKeyFloat') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      real(c_double), value :: value_dummy
+      integer(c_int) :: f_result
+    end function cdiDefKeyFloat
+
+    function cdiInqKeyFloat(cdiID_dummy, varID_dummy, key_dummy, value_dummy)&
+    & bind(c, name = 'cdiInqKeyFloat') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      real(c_double), intent(inout) :: value_dummy
+      integer(c_int) :: f_result
+    end function cdiInqKeyFloat
+
+    function cdiDefKeyBytes(cdiID_dummy, varID_dummy, key_dummy, bytes_dummy,&
+    & length_dummy) bind(c, name = 'cdiDefKeyBytes') result(f_result)
+      import c_int, c_signed_char
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(kind = c_signed_char), intent(in) :: bytes_dummy(*)
+      integer(c_int), value :: length_dummy
+      integer(c_int) :: f_result
+    end function cdiDefKeyBytes
+
+    function cdiInqKeyBytes(cdiID_dummy, varID_dummy, key_dummy, bytes_dummy,&
+    & length_dummy) bind(c, name = 'cdiInqKeyBytes') result(f_result)
+      import c_int, c_signed_char
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(kind = c_signed_char), intent(inout) :: bytes_dummy(*)
+      integer(c_int), intent(inout) :: length_dummy
+      integer(c_int) :: f_result
+    end function cdiInqKeyBytes
+
+    function cdiInqKeyLen(cdiID_dummy, varID_dummy, key_dummy, length_dummy)&
+    & bind(c, name = 'cdiInqKeyLen') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(c_int), intent(inout) :: length_dummy
+      integer(c_int) :: f_result
+    end function cdiInqKeyLen
+
+    function cdiCopyKeys(cdiID1_dummy, varID1_dummy, cdiID2_dummy,&
+    & varID2_dummy) bind(c, name = 'cdiCopyKeys') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID1_dummy
+      integer(c_int), value :: varID1_dummy
+      integer(c_int), value :: cdiID2_dummy
+      integer(c_int), value :: varID2_dummy
+      integer(c_int) :: f_result
+    end function cdiCopyKeys
+
+    function cdiCopyKey(cdiID1_dummy, varID1_dummy, key_dummy, cdiID2_dummy)&
+    & bind(c, name = 'cdiCopyKey') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID1_dummy
+      integer(c_int), value :: varID1_dummy
+      integer(c_int), value :: key_dummy
+      integer(c_int), value :: cdiID2_dummy
+      integer(c_int) :: f_result
+    end function cdiCopyKey
+
+    function cdiDeleteKey(cdiID_dummy, varID_dummy, key_dummy) bind(c, name =&
+    & 'cdiDeleteKey') result(f_result)
+      import c_int
+      integer(c_int), value :: cdiID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: key_dummy
+      integer(c_int) :: f_result
+    end function cdiDeleteKey
+
+    subroutine gridDefDatatype(gridID_dummy, datatype_dummy) bind(c, name =&
+    & 'gridDefDatatype')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: datatype_dummy
+    end subroutine gridDefDatatype
+
+    function gridInqDatatype(gridID_dummy) bind(c, name = 'gridInqDatatype')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqDatatype
+
+    function gridInqXval(gridID_dummy, index_dummy) bind(c, name =&
+    & 'gridInqXval') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: index_dummy
+      real(c_double) :: f_result
+    end function gridInqXval
+
+    function gridInqYval(gridID_dummy, index_dummy) bind(c, name =&
+    & 'gridInqYval') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: index_dummy
+      real(c_double) :: f_result
+    end function gridInqYval
+
+    function gridInqXinc(gridID_dummy) bind(c, name = 'gridInqXinc')&
+    & result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double) :: f_result
+    end function gridInqXinc
+
+    function gridInqYinc(gridID_dummy) bind(c, name = 'gridInqYinc')&
+    & result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double) :: f_result
+    end function gridInqYinc
+
+    function gridIsCircular(gridID_dummy) bind(c, name = 'gridIsCircular')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridIsCircular
+
+    function gridInqTrunc(gridID_dummy) bind(c, name = 'gridInqTrunc')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqTrunc
+
+    subroutine gridDefTrunc(gridID_dummy, trunc_dummy) bind(c, name =&
+    & 'gridDefTrunc')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: trunc_dummy
+    end subroutine gridDefTrunc
+
+    subroutine gridDefNumber(gridID_dummy, number_dummy) bind(c, name =&
+    & 'gridDefNumber')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: number_dummy
+    end subroutine gridDefNumber
+
+    function gridInqNumber(gridID_dummy) bind(c, name = 'gridInqNumber')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqNumber
+
+    subroutine gridDefPosition(gridID_dummy, position_dummy) bind(c, name =&
+    & 'gridDefPosition')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: position_dummy
+    end subroutine gridDefPosition
+
+    function gridInqPosition(gridID_dummy) bind(c, name = 'gridInqPosition')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqPosition
+
+    subroutine gridDefUUID(gridID_dummy, uuid_dummy) bind(c, name =&
+    & 'gridDefUUID')
+      import CDI_UUID_SIZE, c_int, c_signed_char
+      integer(c_int), value :: gridID_dummy
+      integer(kind = c_signed_char), intent(in) :: uuid_dummy(CDI_UUID_SIZE)
+    end subroutine gridDefUUID
+
+    subroutine gridInqUUID(gridID_dummy, uuid_dummy) bind(c, name =&
+    & 'gridInqUUID')
+      import CDI_UUID_SIZE, c_int, c_signed_char
+      integer(c_int), value :: gridID_dummy
+      integer(kind = c_signed_char), intent(inout) :: uuid_dummy(CDI_UUID_SIZE)
+    end subroutine gridInqUUID
+
+    subroutine gridDefParamRLL(gridID_dummy, xpole_dummy, ypole_dummy,&
+    & angle_dummy) bind(c, name = 'gridDefParamRLL')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), value :: xpole_dummy
+      real(c_double), value :: ypole_dummy
+      real(c_double), value :: angle_dummy
+    end subroutine gridDefParamRLL
+
+    subroutine gridInqParamRLL(gridID_dummy, xpole_dummy, ypole_dummy,&
+    & angle_dummy) bind(c, name = 'gridInqParamRLL')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: xpole_dummy
+      real(c_double), intent(inout) :: ypole_dummy
+      real(c_double), intent(inout) :: angle_dummy
+    end subroutine gridInqParamRLL
+
+    subroutine gridDefParamGME(gridID_dummy, nd_dummy, ni_dummy, ni2_dummy,&
+    & ni3_dummy) bind(c, name = 'gridDefParamGME')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: nd_dummy
+      integer(c_int), value :: ni_dummy
+      integer(c_int), value :: ni2_dummy
+      integer(c_int), value :: ni3_dummy
+    end subroutine gridDefParamGME
+
+    subroutine gridInqParamGME(gridID_dummy, nd_dummy, ni_dummy, ni2_dummy,&
+    & ni3_dummy) bind(c, name = 'gridInqParamGME')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(inout) :: nd_dummy
+      integer(c_int), intent(inout) :: ni_dummy
+      integer(c_int), intent(inout) :: ni2_dummy
+      integer(c_int), intent(inout) :: ni3_dummy
+    end subroutine gridInqParamGME
+
+    subroutine gridDefArea(gridID_dummy, area_dummy) bind(c, name =&
+    & 'gridDefArea')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(in) :: area_dummy(*)
+    end subroutine gridDefArea
+
+    subroutine gridInqArea(gridID_dummy, area_dummy) bind(c, name =&
+    & 'gridInqArea')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: area_dummy(*)
+    end subroutine gridInqArea
+
+    function gridHasArea(gridID_dummy) bind(c, name = 'gridHasArea')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridHasArea
+
+    subroutine gridDefNvertex(gridID_dummy, nvertex_dummy) bind(c, name =&
+    & 'gridDefNvertex')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: nvertex_dummy
+    end subroutine gridDefNvertex
+
+    function gridInqNvertex(gridID_dummy) bind(c, name = 'gridInqNvertex')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqNvertex
+
+    subroutine gridDefXbounds(gridID_dummy, xbounds_dummy) bind(c, name =&
+    & 'gridDefXbounds')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(in) :: xbounds_dummy(*)
+    end subroutine gridDefXbounds
+
+    function gridInqXbounds(gridID_dummy, xbounds_dummy) bind(c, name =&
+    & 'gridInqXbounds') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: xbounds_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqXbounds
+
+    function gridInqXboundsPart(gridID_dummy, start_dummy, size_dummy,&
+    & xbounds_dummy) bind(c, name = 'gridInqXboundsPart') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: start_dummy
+      integer(c_int), value :: size_dummy
+      real(c_double), intent(inout) :: xbounds_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqXboundsPart
+
+    function gridInqXboundsPtr(gridID_dummy) bind(c, name =&
+    & 'gridInqXboundsPtr') result(f_result)
+      import c_int, c_ptr
+      integer(c_int), value :: gridID_dummy
+      type(c_ptr) :: f_result
+    end function gridInqXboundsPtr
+
+    subroutine gridDefYbounds(gridID_dummy, ybounds_dummy) bind(c, name =&
+    & 'gridDefYbounds')
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(in) :: ybounds_dummy(*)
+    end subroutine gridDefYbounds
+
+    function gridInqYbounds(gridID_dummy, ybounds_dummy) bind(c, name =&
+    & 'gridInqYbounds') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      real(c_double), intent(inout) :: ybounds_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqYbounds
+
+    function gridInqYboundsPart(gridID_dummy, start_dummy, size_dummy,&
+    & ybounds_dummy) bind(c, name = 'gridInqYboundsPart') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: start_dummy
+      integer(c_int), value :: size_dummy
+      real(c_double), intent(inout) :: ybounds_dummy(*)
+      integer(c_int) :: f_result
+    end function gridInqYboundsPart
+
+    function gridInqYboundsPtr(gridID_dummy) bind(c, name =&
+    & 'gridInqYboundsPtr') result(f_result)
+      import c_int, c_ptr
+      integer(c_int), value :: gridID_dummy
+      type(c_ptr) :: f_result
+    end function gridInqYboundsPtr
+
+    subroutine gridDefReducedPoints(gridID_dummy, reducedPointsSize_dummy,&
+    & reducedPoints_dummy) bind(c, name = 'gridDefReducedPoints')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: reducedPointsSize_dummy
+      integer(c_int), intent(in) :: reducedPoints_dummy(*)
+    end subroutine gridDefReducedPoints
+
+    subroutine gridInqReducedPoints(gridID_dummy, reducedPoints_dummy) bind(c,&
+    & name = 'gridInqReducedPoints')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), intent(inout) :: reducedPoints_dummy(*)
+    end subroutine gridInqReducedPoints
+
+    subroutine gridChangeType(gridID_dummy, gridtype_dummy) bind(c, name =&
+    & 'gridChangeType')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: gridtype_dummy
+    end subroutine gridChangeType
+
+    subroutine gridDefComplexPacking(gridID_dummy, lpack_dummy) bind(c, name =&
+    & 'gridDefComplexPacking')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: lpack_dummy
+    end subroutine gridDefComplexPacking
+
+    function gridInqComplexPacking(gridID_dummy) bind(c, name =&
+    & 'gridInqComplexPacking') result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function gridInqComplexPacking
+
+    function zaxisCreate(zaxistype_dummy, size_dummy) bind(c, name =&
+    & 'zaxisCreate') result(f_result)
+      import c_int
+      integer(c_int), value :: zaxistype_dummy
+      integer(c_int), value :: size_dummy
+      integer(c_int) :: f_result
+    end function zaxisCreate
+
+    subroutine zaxisDestroy(zaxisID_dummy) bind(c, name = 'zaxisDestroy')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+    end subroutine zaxisDestroy
+
+    function zaxisInqType(zaxisID_dummy) bind(c, name = 'zaxisInqType')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqType
+
+    function zaxisInqSize(zaxisID_dummy) bind(c, name = 'zaxisInqSize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqSize
+
+    function zaxisDuplicate(zaxisID_dummy) bind(c, name = 'zaxisDuplicate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisDuplicate
+
+    subroutine zaxisDefLevels(zaxisID_dummy, levels_dummy) bind(c, name =&
+    & 'zaxisDefLevels')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(in) :: levels_dummy(*)
+    end subroutine zaxisDefLevels
+
+    function zaxisInqLevels(zaxisID_dummy, levels_dummy) bind(c, name =&
+    & 'zaxisInqLevels') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(inout) :: levels_dummy(*)
+      integer(c_int) :: f_result
+    end function zaxisInqLevels
+
+    function zaxisInqCLen(zaxisID_dummy) bind(c, name = 'zaxisInqCLen')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqCLen
+
+    subroutine zaxisDefLevel(zaxisID_dummy, levelID_dummy, levels_dummy)&
+    & bind(c, name = 'zaxisDefLevel')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_double), value :: levels_dummy
+    end subroutine zaxisDefLevel
+
+    function zaxisInqLevel(zaxisID_dummy, levelID_dummy) bind(c, name =&
+    & 'zaxisInqLevel') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: levelID_dummy
+      real(c_double) :: f_result
+    end function zaxisInqLevel
+
+    subroutine zaxisDefNlevRef(gridID_dummy, nhlev_dummy) bind(c, name =&
+    & 'zaxisDefNlevRef')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: nhlev_dummy
+    end subroutine zaxisDefNlevRef
+
+    function zaxisInqNlevRef(gridID_dummy) bind(c, name = 'zaxisInqNlevRef')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqNlevRef
+
+    subroutine zaxisDefNumber(gridID_dummy, number_dummy) bind(c, name =&
+    & 'zaxisDefNumber')
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int), value :: number_dummy
+    end subroutine zaxisDefNumber
+
+    function zaxisInqNumber(gridID_dummy) bind(c, name = 'zaxisInqNumber')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: gridID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqNumber
+
+    subroutine zaxisDefUUID(zaxisID_dummy, uuid_dummy) bind(c, name =&
+    & 'zaxisDefUUID')
+      import CDI_UUID_SIZE, c_int, c_signed_char
+      integer(c_int), value :: zaxisID_dummy
+      integer(kind = c_signed_char), intent(in) :: uuid_dummy(CDI_UUID_SIZE)
+    end subroutine zaxisDefUUID
+
+    subroutine zaxisInqUUID(zaxisID_dummy, uuid_dummy) bind(c, name =&
+    & 'zaxisInqUUID')
+      import CDI_UUID_SIZE, c_int, c_signed_char
+      integer(c_int), value :: zaxisID_dummy
+      integer(kind = c_signed_char), intent(inout) :: uuid_dummy(CDI_UUID_SIZE)
+    end subroutine zaxisInqUUID
+
+    subroutine zaxisDefDatatype(zaxisID_dummy, datatype_dummy) bind(c, name =&
+    & 'zaxisDefDatatype')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: datatype_dummy
+    end subroutine zaxisDefDatatype
+
+    function zaxisInqDatatype(zaxisID_dummy) bind(c, name = 'zaxisInqDatatype')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqDatatype
+
+    subroutine zaxisDefPositive(zaxisID_dummy, positive_dummy) bind(c, name =&
+    & 'zaxisDefPositive')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: positive_dummy
+    end subroutine zaxisDefPositive
+
+    function zaxisInqPositive(zaxisID_dummy) bind(c, name = 'zaxisInqPositive')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqPositive
+
+    subroutine zaxisDefScalar(zaxisID_dummy) bind(c, name = 'zaxisDefScalar')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+    end subroutine zaxisDefScalar
+
+    function zaxisInqScalar(zaxisID_dummy) bind(c, name = 'zaxisInqScalar')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqScalar
+
+    subroutine zaxisDefVct(zaxisID_dummy, size_dummy, vct_dummy) bind(c, name =&
+    & 'zaxisDefVct')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: size_dummy
+      real(c_double), intent(in) :: vct_dummy(*)
+    end subroutine zaxisDefVct
+
+    subroutine zaxisInqVct(zaxisID_dummy, vct_dummy) bind(c, name =&
+    & 'zaxisInqVct')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(inout) :: vct_dummy(*)
+    end subroutine zaxisInqVct
+
+    function zaxisInqVctSize(zaxisID_dummy) bind(c, name = 'zaxisInqVctSize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int) :: f_result
+    end function zaxisInqVctSize
+
+    function zaxisInqVctPtr(zaxisID_dummy) bind(c, name = 'zaxisInqVctPtr')&
+    & result(f_result)
+      import c_int, c_ptr
+      integer(c_int), value :: zaxisID_dummy
+      type(c_ptr) :: f_result
+    end function zaxisInqVctPtr
+
+    subroutine zaxisDefLbounds(zaxisID_dummy, lbounds_dummy) bind(c, name =&
+    & 'zaxisDefLbounds')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(in) :: lbounds_dummy(*)
+    end subroutine zaxisDefLbounds
+
+    function zaxisInqLbound(zaxisID_dummy, index_dummy) bind(c, name =&
+    & 'zaxisInqLbound') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: index_dummy
+      real(c_double) :: f_result
+    end function zaxisInqLbound
+
+    subroutine zaxisDefUbounds(zaxisID_dummy, ubounds_dummy) bind(c, name =&
+    & 'zaxisDefUbounds')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(in) :: ubounds_dummy(*)
+    end subroutine zaxisDefUbounds
+
+    function zaxisInqUbound(zaxisID_dummy, index_dummy) bind(c, name =&
+    & 'zaxisInqUbound') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: index_dummy
+      real(c_double) :: f_result
+    end function zaxisInqUbound
+
+    subroutine zaxisDefWeights(zaxisID_dummy, weights_dummy) bind(c, name =&
+    & 'zaxisDefWeights')
+      import c_double, c_int
+      integer(c_int), value :: zaxisID_dummy
+      real(c_double), intent(in) :: weights_dummy(*)
+    end subroutine zaxisDefWeights
+
+    subroutine zaxisChangeType(zaxisID_dummy, zaxistype_dummy) bind(c, name =&
+    & 'zaxisChangeType')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: zaxistype_dummy
+    end subroutine zaxisChangeType
+
+    function taxisCreate(taxistype_dummy) bind(c, name = 'taxisCreate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxistype_dummy
+      integer(c_int) :: f_result
+    end function taxisCreate
+
+    subroutine taxisDestroy(taxisID_dummy) bind(c, name = 'taxisDestroy')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+    end subroutine taxisDestroy
+
+    function taxisDuplicate(taxisID_dummy) bind(c, name = 'taxisDuplicate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisDuplicate
+
+    subroutine taxisCopyTimestep(taxisIDdes_dummy, taxisIDsrc_dummy) bind(c,&
+    & name = 'taxisCopyTimestep')
+      import c_int
+      integer(c_int), value :: taxisIDdes_dummy
+      integer(c_int), value :: taxisIDsrc_dummy
+    end subroutine taxisCopyTimestep
+
+    subroutine taxisDefType(taxisID_dummy, taxistype_dummy) bind(c, name =&
+    & 'taxisDefType')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: taxistype_dummy
+    end subroutine taxisDefType
+
+    function taxisInqType(taxisID_dummy) bind(c, name = 'taxisInqType')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqType
+
+    subroutine taxisDefVdate(taxisID_dummy, date_dummy) bind(c, name =&
+    & 'taxisDefVdate')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: date_dummy
+    end subroutine taxisDefVdate
+
+    subroutine taxisDefVtime(taxisID_dummy, time_dummy) bind(c, name =&
+    & 'taxisDefVtime')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: time_dummy
+    end subroutine taxisDefVtime
+
+    function taxisInqVdate(taxisID_dummy) bind(c, name = 'taxisInqVdate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqVdate
+
+    function taxisInqVtime(taxisID_dummy) bind(c, name = 'taxisInqVtime')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqVtime
+
+    subroutine taxisDefRdate(taxisID_dummy, date_dummy) bind(c, name =&
+    & 'taxisDefRdate')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: date_dummy
+    end subroutine taxisDefRdate
+
+    subroutine taxisDefRtime(taxisID_dummy, time_dummy) bind(c, name =&
+    & 'taxisDefRtime')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: time_dummy
+    end subroutine taxisDefRtime
+
+    function taxisInqRdate(taxisID_dummy) bind(c, name = 'taxisInqRdate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqRdate
+
+    function taxisInqRtime(taxisID_dummy) bind(c, name = 'taxisInqRtime')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqRtime
+
+    function taxisHasBounds(taxisID_dummy) bind(c, name = 'taxisHasBounds')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisHasBounds
+
+    subroutine taxisWithBounds(taxisID_dummy) bind(c, name = 'taxisWithBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+    end subroutine taxisWithBounds
+
+    subroutine taxisDeleteBounds(taxisID_dummy) bind(c, name =&
+    & 'taxisDeleteBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+    end subroutine taxisDeleteBounds
+
+    subroutine taxisDefVdateBounds(taxisID_dummy, vdate_lb_dummy,&
+    & vdate_ub_dummy) bind(c, name = 'taxisDefVdateBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: vdate_lb_dummy
+      integer(c_int), value :: vdate_ub_dummy
+    end subroutine taxisDefVdateBounds
+
+    subroutine taxisDefVtimeBounds(taxisID_dummy, vtime_lb_dummy,&
+    & vtime_ub_dummy) bind(c, name = 'taxisDefVtimeBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: vtime_lb_dummy
+      integer(c_int), value :: vtime_ub_dummy
+    end subroutine taxisDefVtimeBounds
+
+    subroutine taxisInqVdateBounds(taxisID_dummy, vdate_lb_dummy,&
+    & vdate_ub_dummy) bind(c, name = 'taxisInqVdateBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), intent(inout) :: vdate_lb_dummy
+      integer(c_int), intent(inout) :: vdate_ub_dummy
+    end subroutine taxisInqVdateBounds
+
+    subroutine taxisInqVtimeBounds(taxisID_dummy, vtime_lb_dummy,&
+    & vtime_ub_dummy) bind(c, name = 'taxisInqVtimeBounds')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), intent(inout) :: vtime_lb_dummy
+      integer(c_int), intent(inout) :: vtime_ub_dummy
+    end subroutine taxisInqVtimeBounds
+
+    subroutine taxisDefCalendar(taxisID_dummy, calendar_dummy) bind(c, name =&
+    & 'taxisDefCalendar')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: calendar_dummy
+    end subroutine taxisDefCalendar
+
+    function taxisInqCalendar(taxisID_dummy) bind(c, name = 'taxisInqCalendar')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqCalendar
+
+    subroutine taxisDefTunit(taxisID_dummy, tunit_dummy) bind(c, name =&
+    & 'taxisDefTunit')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: tunit_dummy
+    end subroutine taxisDefTunit
+
+    function taxisInqTunit(taxisID_dummy) bind(c, name = 'taxisInqTunit')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqTunit
+
+    subroutine taxisDefForecastTunit(taxisID_dummy, tunit_dummy) bind(c, name =&
+    & 'taxisDefForecastTunit')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: tunit_dummy
+    end subroutine taxisDefForecastTunit
+
+    function taxisInqForecastTunit(taxisID_dummy) bind(c, name =&
+    & 'taxisInqForecastTunit') result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqForecastTunit
+
+    subroutine taxisDefForecastPeriod(taxisID_dummy, fc_period_dummy) bind(c,&
+    & name = 'taxisDefForecastPeriod')
+      import c_double, c_int
+      integer(c_int), value :: taxisID_dummy
+      real(c_double), value :: fc_period_dummy
+    end subroutine taxisDefForecastPeriod
+
+    function taxisInqForecastPeriod(taxisID_dummy) bind(c, name =&
+    & 'taxisInqForecastPeriod') result(f_result)
+      import c_double, c_int
+      integer(c_int), value :: taxisID_dummy
+      real(c_double) :: f_result
+    end function taxisInqForecastPeriod
+
+    subroutine taxisDefNumavg(taxisID_dummy, numavg_dummy) bind(c, name =&
+    & 'taxisDefNumavg')
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int), value :: numavg_dummy
+    end subroutine taxisDefNumavg
+
+    function taxisInqNumavg(taxisID_dummy) bind(c, name = 'taxisInqNumavg')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: taxisID_dummy
+      integer(c_int) :: f_result
+    end function taxisInqNumavg
+
+    function institutInqNumber() bind(c, name = 'institutInqNumber')&
+    & result(f_result)
+      import c_int
+      integer(c_int) :: f_result
+    end function institutInqNumber
+
+    function institutInqCenter(instID_dummy) bind(c, name =&
+    & 'institutInqCenter') result(f_result)
+      import c_int
+      integer(c_int), value :: instID_dummy
+      integer(c_int) :: f_result
+    end function institutInqCenter
+
+    function institutInqSubcenter(instID_dummy) bind(c, name =&
+    & 'institutInqSubcenter') result(f_result)
+      import c_int
+      integer(c_int), value :: instID_dummy
+      integer(c_int) :: f_result
+    end function institutInqSubcenter
+
+    function modelInqInstitut(modelID_dummy) bind(c, name = 'modelInqInstitut')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: modelID_dummy
+      integer(c_int) :: f_result
+    end function modelInqInstitut
+
+    function modelInqGribID(modelID_dummy) bind(c, name = 'modelInqGribID')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: modelID_dummy
+      integer(c_int) :: f_result
+    end function modelInqGribID
+
+    function tableInqNumber() bind(c, name = 'tableInqNumber') result(f_result)
+      import c_int
+      integer(c_int) :: f_result
+    end function tableInqNumber
+
+    function tableInqNum(tableID_dummy) bind(c, name = 'tableInqNum')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: tableID_dummy
+      integer(c_int) :: f_result
+    end function tableInqNum
+
+    function tableInqModel(tableID_dummy) bind(c, name = 'tableInqModel')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: tableID_dummy
+      integer(c_int) :: f_result
+    end function tableInqModel
+
+    function subtypeCreate(subtype_dummy) bind(c, name = 'subtypeCreate')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: subtype_dummy
+      integer(c_int) :: f_result
+    end function subtypeCreate
+
+    subroutine subtypePrint(subtypeID_dummy) bind(c, name = 'subtypePrint')
+      import c_int
+      integer(c_int), value :: subtypeID_dummy
+    end subroutine subtypePrint
+
+    function subtypeCompare(subtypeID1_dummy, subtypeID2_dummy) bind(c, name =&
+    & 'subtypeCompare') result(f_result)
+      import c_int
+      integer(c_int), value :: subtypeID1_dummy
+      integer(c_int), value :: subtypeID2_dummy
+      integer(c_int) :: f_result
+    end function subtypeCompare
+
+    function subtypeInqSize(subtypeID_dummy) bind(c, name = 'subtypeInqSize')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: subtypeID_dummy
+      integer(c_int) :: f_result
+    end function subtypeInqSize
+
+    function subtypeInqActiveIndex(subtypeID_dummy) bind(c, name =&
+    & 'subtypeInqActiveIndex') result(f_result)
+      import c_int
+      integer(c_int), value :: subtypeID_dummy
+      integer(c_int) :: f_result
+    end function subtypeInqActiveIndex
+
+    subroutine subtypeDefActiveIndex(subtypeID_dummy, index_dummy) bind(c, name&
+    & = 'subtypeDefActiveIndex')
+      import c_int
+      integer(c_int), value :: subtypeID_dummy
+      integer(c_int), value :: index_dummy
+    end subroutine subtypeDefActiveIndex
+
+    function subtypeInqTile(subtypeID_dummy, tileindex_dummy, attribute_dummy)&
+    & bind(c, name = 'subtypeInqTile') result(f_result)
+      import c_int
+      integer(c_int), value :: subtypeID_dummy
+      integer(c_int), value :: tileindex_dummy
+      integer(c_int), value :: attribute_dummy
+      integer(c_int) :: f_result
+    end function subtypeInqTile
+
+    function vlistInqVarSubtype(vlistID_dummy, varID_dummy) bind(c, name =&
+    & 'vlistInqVarSubtype') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarSubtype
+
+    subroutine gribapiLibraryVersion(major_version_dummy, minor_version_dummy,&
+    & revision_version_dummy) bind(c, name = 'gribapiLibraryVersion')
+      import c_int
+      integer(c_int), intent(inout) :: major_version_dummy
+      integer(c_int), intent(inout) :: minor_version_dummy
+      integer(c_int), intent(inout) :: revision_version_dummy
+    end subroutine gribapiLibraryVersion
+
+    subroutine zaxisDefLtype(zaxisID_dummy, ltype_dummy) bind(c, name =&
+    & 'zaxisDefLtype')
+      import c_int
+      integer(c_int), value :: zaxisID_dummy
+      integer(c_int), value :: ltype_dummy
+    end subroutine zaxisDefLtype
+
+    function vlistInqVarTypeOfGeneratingProcess(vlistID_dummy, varID_dummy)&
+    & bind(c, name = 'vlistInqVarTypeOfGeneratingProcess') result(f_result)
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int) :: f_result
+    end function vlistInqVarTypeOfGeneratingProcess
+
+    subroutine vlistDefVarTypeOfGeneratingProcess(vlistID_dummy, varID_dummy,&
+    & typeOfGeneratingProcess_dummy) bind(c, name =&
+    & 'vlistDefVarTypeOfGeneratingProcess')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: typeOfGeneratingProcess_dummy
+    end subroutine vlistDefVarTypeOfGeneratingProcess
+
+    subroutine vlistDefVarProductDefinitionTemplate(vlistID_dummy, varID_dummy,&
+    & productDefinitionTemplate_dummy) bind(c, name =&
+    & 'vlistDefVarProductDefinitionTemplate')
+      import c_int
+      integer(c_int), value :: vlistID_dummy
+      integer(c_int), value :: varID_dummy
+      integer(c_int), value :: productDefinitionTemplate_dummy
+    end subroutine vlistDefVarProductDefinitionTemplate
+
+    function date_to_julday(calendar_dummy, date_dummy) bind(c, name =&
+    & 'date_to_julday') result(f_result)
+      import c_int, c_int64_t
+      integer(c_int), value :: calendar_dummy
+      integer(c_int64_t), value :: date_dummy
+      integer(c_int64_t) :: f_result
+    end function date_to_julday
+
+    function julday_to_date(calendar_dummy, julday_dummy) bind(c, name =&
+    & 'julday_to_date') result(f_result)
+      import c_int, c_int64_t
+      integer(c_int), value :: calendar_dummy
+      integer(c_int64_t), value :: julday_dummy
+      integer(c_int64_t) :: f_result
+    end function julday_to_date
+
+    function time_to_sec(time_dummy) bind(c, name = 'time_to_sec')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: time_dummy
+      integer(c_int) :: f_result
+    end function time_to_sec
+
+    function sec_to_time(secofday_dummy) bind(c, name = 'sec_to_time')&
+    & result(f_result)
+      import c_int
+      integer(c_int), value :: secofday_dummy
+      integer(c_int) :: f_result
+    end function sec_to_time
+
+  end interface
+
+contains
+
+  subroutine ctrim(str)
+    character(kind = c_char, len = *), intent(inout) :: str
+    integer :: i
+
+    do i=1,len(str)
+      if (str(i:i) == c_null_char) then
+        str(i:len(str)) = ' '
+        exit
+      end if
+    end do
+  end subroutine ctrim
+
+  function c_len(s) result(i)
+    character(kind = c_char, len = *), intent(in) :: s
+    integer :: i
+
+    do i = 1, len(s)
+      if (s(i:i) == c_null_char) exit
+    end do
+    i = i - 1
+  end function
+
+  function cdiStringError(cdiErrno_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: cdiErrno_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_cdiStringError(cdiErrno_dummy) bind(c, name =&
+      & 'cdiStringError') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: cdiErrno_dummy
+      end function lib_cdiStringError
+    end interface
+    f_result => null()
+    ptr = lib_cdiStringError(cdiErrno_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function cdiStringError
+
+  function cdiLibraryVersion() result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_cdiLibraryVersion() bind(c, name = 'cdiLibraryVersion')&
+      & result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+      end function lib_cdiLibraryVersion
+    end interface
+    f_result => null()
+    ptr = lib_cdiLibraryVersion()
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function cdiLibraryVersion
+
+  subroutine cdiDefGlobal(string_dummy, val_dummy)
+    character(kind = c_char, len = *), intent(in) :: string_dummy
+    integer(c_int), value :: val_dummy
+    character(kind = c_char) :: string_temp(len(string_dummy) + 1)
+    integer :: string_i
+    interface
+      subroutine lib_cdiDefGlobal(string_dummy, val_dummy) bind(c, name =&
+      & 'cdiDefGlobal')
+        import c_char, c_int
+        character(kind = c_char) :: string_dummy(*)
+        integer(c_int), value :: val_dummy
+      end subroutine lib_cdiDefGlobal
+    end interface
+    do string_i = 1, len(string_dummy)
+      string_temp(string_i) = string_dummy(string_i:string_i)
+    end do
+    string_temp(len(string_dummy) + 1) = c_null_char
+    call lib_cdiDefGlobal(string_temp, val_dummy)
+  end subroutine cdiDefGlobal
+
+  subroutine cdiParamToString(param_dummy, paramstr_dummy, maxlen_dummy)
+    integer(c_int), value :: param_dummy
+    character(kind = c_char, len = *), intent(inout) :: paramstr_dummy
+    integer(c_int), value :: maxlen_dummy
+    character(kind = c_char) :: paramstr_temp(len(paramstr_dummy) + 1)
+    integer :: paramstr_i
+    interface
+      subroutine lib_cdiParamToString(param_dummy, paramstr_dummy,&
+      & maxlen_dummy) bind(c, name = 'cdiParamToString')
+        import c_char, c_int
+        integer(c_int), value :: param_dummy
+        character(kind = c_char) :: paramstr_dummy(*)
+        integer(c_int), value :: maxlen_dummy
+      end subroutine lib_cdiParamToString
+    end interface
+    paramstr_temp(len(paramstr_dummy) + 1) = c_null_char
+    do paramstr_i = len(paramstr_dummy), 1, -1
+      if(paramstr_dummy(paramstr_i:paramstr_i) /= ' ') exit
+      paramstr_temp(paramstr_i) = c_null_char
+    end do
+    do paramstr_i = paramstr_i, 1, -1
+        paramstr_temp(paramstr_i) = paramstr_dummy(paramstr_i:paramstr_i)
+    end do
+    call lib_cdiParamToString(param_dummy, paramstr_temp, maxlen_dummy)
+    do paramstr_i = 1, len(paramstr_dummy)
+      if(paramstr_temp(paramstr_i) == c_null_char) exit
+      paramstr_dummy(paramstr_i:paramstr_i) = paramstr_temp(paramstr_i)
+    end do
+    do paramstr_i = paramstr_i, len(paramstr_dummy)
+      paramstr_dummy(paramstr_i:paramstr_i) = ' '
+    end do
+  end subroutine cdiParamToString
+
+  function cdiGetFiletype(uri_dummy, byteorder_dummy) result(f_result)
+    integer(c_int) :: f_result
+    character(kind = c_char, len = *), intent(in) :: uri_dummy
+    integer(c_int), intent(inout) :: byteorder_dummy
+    character(kind = c_char) :: uri_temp(len(uri_dummy) + 1)
+    integer :: uri_i
+    interface
+      function lib_cdiGetFiletype(uri_dummy, byteorder_dummy) bind(c, name =&
+      & 'cdiGetFiletype') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        character(kind = c_char) :: uri_dummy(*)
+        integer(c_int), intent(inout) :: byteorder_dummy
+      end function lib_cdiGetFiletype
+    end interface
+    do uri_i = 1, len(uri_dummy)
+      uri_temp(uri_i) = uri_dummy(uri_i:uri_i)
+    end do
+    uri_temp(len(uri_dummy) + 1) = c_null_char
+    f_result = lib_cdiGetFiletype(uri_temp, byteorder_dummy)
+  end function cdiGetFiletype
+
+  function streamOpenRead(path_dummy) result(f_result)
+    integer(c_int) :: f_result
+    character(kind = c_char, len = *), intent(in) :: path_dummy
+    character(kind = c_char) :: path_temp(len(path_dummy) + 1)
+    integer :: path_i
+    interface
+      function lib_streamOpenRead(path_dummy) bind(c, name = 'streamOpenRead')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        character(kind = c_char) :: path_dummy(*)
+      end function lib_streamOpenRead
+    end interface
+    do path_i = 1, len(path_dummy)
+      path_temp(path_i) = path_dummy(path_i:path_i)
+    end do
+    path_temp(len(path_dummy) + 1) = c_null_char
+    f_result = lib_streamOpenRead(path_temp)
+  end function streamOpenRead
+
+  function streamOpenWrite(path_dummy, filetype_dummy) result(f_result)
+    integer(c_int) :: f_result
+    character(kind = c_char, len = *), intent(in) :: path_dummy
+    integer(c_int), value :: filetype_dummy
+    character(kind = c_char) :: path_temp(len(path_dummy) + 1)
+    integer :: path_i
+    interface
+      function lib_streamOpenWrite(path_dummy, filetype_dummy) bind(c, name =&
+      & 'streamOpenWrite') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        character(kind = c_char) :: path_dummy(*)
+        integer(c_int), value :: filetype_dummy
+      end function lib_streamOpenWrite
+    end interface
+    do path_i = 1, len(path_dummy)
+      path_temp(path_i) = path_dummy(path_i:path_i)
+    end do
+    path_temp(len(path_dummy) + 1) = c_null_char
+    f_result = lib_streamOpenWrite(path_temp, filetype_dummy)
+  end function streamOpenWrite
+
+  function streamOpenAppend(path_dummy) result(f_result)
+    integer(c_int) :: f_result
+    character(kind = c_char, len = *), intent(in) :: path_dummy
+    character(kind = c_char) :: path_temp(len(path_dummy) + 1)
+    integer :: path_i
+    interface
+      function lib_streamOpenAppend(path_dummy) bind(c, name =&
+      & 'streamOpenAppend') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        character(kind = c_char) :: path_dummy(*)
+      end function lib_streamOpenAppend
+    end interface
+    do path_i = 1, len(path_dummy)
+      path_temp(path_i) = path_dummy(path_i:path_i)
+    end do
+    path_temp(len(path_dummy) + 1) = c_null_char
+    f_result = lib_streamOpenAppend(path_temp)
+  end function streamOpenAppend
+
+  subroutine streamDefFilter(streamID_dummy, filterSpec_dummy)
+    integer(c_int), value :: streamID_dummy
+    character(kind = c_char, len = *), intent(in) :: filterSpec_dummy
+    character(kind = c_char) :: filterSpec_temp(len(filterSpec_dummy) + 1)
+    integer :: filterSpec_i
+    interface
+      subroutine lib_streamDefFilter(streamID_dummy, filterSpec_dummy) bind(c,&
+      & name = 'streamDefFilter')
+        import c_char, c_int
+        integer(c_int), value :: streamID_dummy
+        character(kind = c_char) :: filterSpec_dummy(*)
+      end subroutine lib_streamDefFilter
+    end interface
+    do filterSpec_i = 1, len(filterSpec_dummy)
+      filterSpec_temp(filterSpec_i) =&
+      & filterSpec_dummy(filterSpec_i:filterSpec_i)
+    end do
+    filterSpec_temp(len(filterSpec_dummy) + 1) = c_null_char
+    call lib_streamDefFilter(streamID_dummy, filterSpec_temp)
+  end subroutine streamDefFilter
+
+  function streamFilename(streamID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: streamID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_streamFilename(streamID_dummy) bind(c, name =&
+      & 'streamFilename') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: streamID_dummy
+      end function lib_streamFilename
+    end interface
+    f_result => null()
+    ptr = lib_streamFilename(streamID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function streamFilename
+
+  function streamFilesuffix(filetype_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: filetype_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_streamFilesuffix(filetype_dummy) bind(c, name =&
+      & 'streamFilesuffix') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: filetype_dummy
+      end function lib_streamFilesuffix
+    end interface
+    f_result => null()
+    ptr = lib_streamFilesuffix(filetype_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function streamFilesuffix
+
+  function cdiIterator_new(path_dummy) result(f_result)
+    type(t_CdiIterator) :: f_result
+    character(kind = c_char, len = *), intent(in) :: path_dummy
+    character(kind = c_char) :: path_temp(len(path_dummy) + 1)
+    integer :: path_i
+    interface
+      function lib_cdiIterator_new(path_dummy) bind(c, name =&
+      & 'cdiIterator_new') result(c_result)
+        import c_char, c_ptr
+        type(c_ptr) :: c_result
+        character(kind = c_char) :: path_dummy(*)
+      end function lib_cdiIterator_new
+    end interface
+    do path_i = 1, len(path_dummy)
+      path_temp(path_i) = path_dummy(path_i:path_i)
+    end do
+    path_temp(len(path_dummy) + 1) = c_null_char
+    f_result%ptr = lib_cdiIterator_new(path_temp)
+  end function cdiIterator_new
+
+  function cdiIterator_clone(me_dummy) result(f_result)
+    type(t_CdiIterator) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_clone(me_dummy) bind(c, name =&
+      & 'cdiIterator_clone') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_clone
+    end interface
+    f_result%ptr = lib_cdiIterator_clone(me_dummy%ptr)
+  end function cdiIterator_clone
+
+  function cdiIterator_serialize(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_serialize(me_dummy) bind(c, name =&
+      & 'cdiIterator_serialize') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_serialize
+    end interface
+    cString = lib_cdiIterator_serialize(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_serialize
+
+  function cdiIterator_deserialize(description_dummy) result(f_result)
+    type(t_CdiIterator) :: f_result
+    character(kind = c_char, len = *), intent(in) :: description_dummy
+    character(kind = c_char) :: description_temp(len(description_dummy) + 1)
+    integer :: description_i
+    interface
+      function lib_cdiIterator_deserialize(description_dummy) bind(c, name =&
+      & 'cdiIterator_deserialize') result(c_result)
+        import c_char, c_ptr
+        type(c_ptr) :: c_result
+        character(kind = c_char) :: description_dummy(*)
+      end function lib_cdiIterator_deserialize
+    end interface
+    do description_i = 1, len(description_dummy)
+      description_temp(description_i) =&
+      & description_dummy(description_i:description_i)
+    end do
+    description_temp(len(description_dummy) + 1) = c_null_char
+    f_result%ptr = lib_cdiIterator_deserialize(description_temp)
+  end function cdiIterator_deserialize
+
+  subroutine cdiIterator_delete(me_dummy)
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      subroutine lib_cdiIterator_delete(me_dummy) bind(c, name =&
+      & 'cdiIterator_delete')
+        import c_ptr
+        type(c_ptr), value :: me_dummy
+      end subroutine lib_cdiIterator_delete
+    end interface
+    call lib_cdiIterator_delete(me_dummy%ptr)
+  end subroutine cdiIterator_delete
+
+  function cdiIterator_nextField(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_nextField(me_dummy) bind(c, name =&
+      & 'cdiIterator_nextField') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_nextField
+    end interface
+    f_result = lib_cdiIterator_nextField(me_dummy%ptr)
+  end function cdiIterator_nextField
+
+  function cdiIterator_inqStartTime(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_inqStartTime(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqStartTime') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqStartTime
+    end interface
+    cString = lib_cdiIterator_inqStartTime(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_inqStartTime
+
+  function cdiIterator_inqEndTime(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_inqEndTime(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqEndTime') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqEndTime
+    end interface
+    cString = lib_cdiIterator_inqEndTime(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_inqEndTime
+
+  function cdiIterator_inqRTime(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_inqRTime(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqRTime') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqRTime
+    end interface
+    cString = lib_cdiIterator_inqRTime(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_inqRTime
+
+  function cdiIterator_inqVTime(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_inqVTime(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqVTime') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqVTime
+    end interface
+    cString = lib_cdiIterator_inqVTime(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_inqVTime
+
+  function cdiIterator_inqLevelType(me_dummy, levelSelector_dummy, outName,&
+  & outLongName, outStdName, outUnit) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), value :: levelSelector_dummy
+    character(kind = c_char), pointer, optional, intent(inout) :: outName(:)
+    character(kind = c_char), pointer, optional, intent(inout) ::&
+    & outLongName(:)
+    character(kind = c_char), pointer, optional, intent(inout) :: outStdName(:)
+    character(kind = c_char), pointer, optional, intent(inout) :: outUnit(:)
+    type(c_ptr), target :: outName_cptr
+    type(c_ptr) :: outName_handle
+    integer :: outName_shape(1)
+    character(kind = c_char), pointer :: outName_fptr(:)
+    type(c_ptr), target :: outLongName_cptr
+    type(c_ptr) :: outLongName_handle
+    integer :: outLongName_shape(1)
+    character(kind = c_char), pointer :: outLongName_fptr(:)
+    type(c_ptr), target :: outStdName_cptr
+    type(c_ptr) :: outStdName_handle
+    integer :: outStdName_shape(1)
+    character(kind = c_char), pointer :: outStdName_fptr(:)
+    type(c_ptr), target :: outUnit_cptr
+    type(c_ptr) :: outUnit_handle
+    integer :: outUnit_shape(1)
+    character(kind = c_char), pointer :: outUnit_fptr(:)
+    interface
+      function lib_cdiIterator_inqLevelType(me_dummy, levelSelector_dummy,&
+      & outName, outLongName, outStdName, outUnit) bind(c, name =&
+      & 'cdiIterator_inqLevelType') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        integer(c_int), value :: levelSelector_dummy
+        type(c_ptr), value :: outName
+        type(c_ptr), value :: outLongName
+        type(c_ptr), value :: outStdName
+        type(c_ptr), value :: outUnit
+      end function lib_cdiIterator_inqLevelType
+    end interface
+    outName_handle = c_null_ptr
+    if(present(outName)) outName_handle = c_loc(outName_cptr)
+    outLongName_handle = c_null_ptr
+    if(present(outLongName)) outLongName_handle = c_loc(outLongName_cptr)
+    outStdName_handle = c_null_ptr
+    if(present(outStdName)) outStdName_handle = c_loc(outStdName_cptr)
+    outUnit_handle = c_null_ptr
+    if(present(outUnit)) outUnit_handle = c_loc(outUnit_cptr)
+    f_result = lib_cdiIterator_inqLevelType(me_dummy%ptr, levelSelector_dummy,&
+    & outName_handle, outLongName_handle, outStdName_handle, outUnit_handle)
+    if(present(outName)) then
+      if(c_associated(outName_cptr)) then
+        outName_shape(1) = int(lib_strlen(outName_cptr))
+        call c_f_pointer(outName_cptr, outName_fptr, outName_shape)
+        allocate(outName(outName_shape(1)))
+        outName = outName_fptr
+        call lib_free(outName_cptr)
+      else
+        outName => null()
+      end if
+    end if
+    if(present(outLongName)) then
+      if(c_associated(outLongName_cptr)) then
+        outLongName_shape(1) = int(lib_strlen(outLongName_cptr))
+        call c_f_pointer(outLongName_cptr, outLongName_fptr, outLongName_shape)
+        allocate(outLongName(outLongName_shape(1)))
+        outLongName = outLongName_fptr
+        call lib_free(outLongName_cptr)
+      else
+        outLongName => null()
+      end if
+    end if
+    if(present(outStdName)) then
+      if(c_associated(outStdName_cptr)) then
+        outStdName_shape(1) = int(lib_strlen(outStdName_cptr))
+        call c_f_pointer(outStdName_cptr, outStdName_fptr, outStdName_shape)
+        allocate(outStdName(outStdName_shape(1)))
+        outStdName = outStdName_fptr
+        call lib_free(outStdName_cptr)
+      else
+        outStdName => null()
+      end if
+    end if
+    if(present(outUnit)) then
+      if(c_associated(outUnit_cptr)) then
+        outUnit_shape(1) = int(lib_strlen(outUnit_cptr))
+        call c_f_pointer(outUnit_cptr, outUnit_fptr, outUnit_shape)
+        allocate(outUnit(outUnit_shape(1)))
+        outUnit = outUnit_fptr
+        call lib_free(outUnit_cptr)
+      else
+        outUnit => null()
+      end if
+    end if
+  end function cdiIterator_inqLevelType
+
+  function cdiIterator_inqLevel(me_dummy, levelSelector_dummy, outValue1,&
+  & outValue2) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), value :: levelSelector_dummy
+    real(c_double), target, optional, intent(inout) :: outValue1
+    real(c_double), target, optional, intent(inout) :: outValue2
+    type(c_ptr) :: outValue1_cptr
+    type(c_ptr) :: outValue2_cptr
+    interface
+      function lib_cdiIterator_inqLevel(me_dummy, levelSelector_dummy,&
+      & outValue1, outValue2) bind(c, name = 'cdiIterator_inqLevel')&
+      & result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        integer(c_int), value :: levelSelector_dummy
+        type(c_ptr), value :: outValue1
+        type(c_ptr), value :: outValue2
+      end function lib_cdiIterator_inqLevel
+    end interface
+    outValue1_cptr = c_null_ptr
+    if(present(outValue1)) outValue1_cptr = c_loc(outValue1)
+    outValue2_cptr = c_null_ptr
+    if(present(outValue2)) outValue2_cptr = c_loc(outValue2)
+    f_result = lib_cdiIterator_inqLevel(me_dummy%ptr, levelSelector_dummy,&
+    & outValue1_cptr, outValue2_cptr)
+  end function cdiIterator_inqLevel
+
+  function cdiIterator_inqLevelUuid(me_dummy, outVgridNumber, outLevelCount,&
+  & outUuid) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), optional, target, intent(inout) :: outVgridNumber
+    integer(c_int), optional, target, intent(inout) :: outLevelCount
+    integer(kind = c_signed_char), target, optional, intent(inout) ::&
+    & outUuid(CDI_UUID_SIZE)
+    type(c_ptr) :: outVgridNumber_cptr
+    type(c_ptr) :: outLevelCount_cptr
+    type(c_ptr) :: outUuid_cptr
+    interface
+      function lib_cdiIterator_inqLevelUuid(me_dummy, outVgridNumber,&
+      & outLevelCount, outUuid) bind(c, name = 'cdiIterator_inqLevelUuid')&
+      & result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        type(c_ptr), value :: outVgridNumber
+        type(c_ptr), value :: outLevelCount
+        type(c_ptr), value :: outUuid
+      end function lib_cdiIterator_inqLevelUuid
+    end interface
+    outVgridNumber_cptr = c_null_ptr
+    if(present(outVgridNumber)) outVgridNumber_cptr = c_loc(outVgridNumber)
+    outLevelCount_cptr = c_null_ptr
+    if(present(outLevelCount)) outLevelCount_cptr = c_loc(outLevelCount)
+    outUuid_cptr = c_null_ptr
+    if(present(outUuid)) outUuid_cptr = c_loc(outUuid)
+    f_result = lib_cdiIterator_inqLevelUuid(me_dummy%ptr, outVgridNumber_cptr,&
+    & outLevelCount_cptr, outUuid_cptr)
+  end function cdiIterator_inqLevelUuid
+
+  function cdiIterator_inqTile(me_dummy, outTileIndex_dummy,&
+  & outTileAttribute_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), intent(inout) :: outTileIndex_dummy
+    integer(c_int), intent(inout) :: outTileAttribute_dummy
+    interface
+      function lib_cdiIterator_inqTile(me_dummy, outTileIndex_dummy,&
+      & outTileAttribute_dummy) bind(c, name = 'cdiIterator_inqTile')&
+      & result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        integer(c_int), intent(inout) :: outTileIndex_dummy
+        integer(c_int), intent(inout) :: outTileAttribute_dummy
+      end function lib_cdiIterator_inqTile
+    end interface
+    f_result = lib_cdiIterator_inqTile(me_dummy%ptr, outTileIndex_dummy,&
+    & outTileAttribute_dummy)
+  end function cdiIterator_inqTile
+
+  function cdiIterator_inqTileCount(me_dummy, outTileCount_dummy,&
+  & outTileAttributeCount_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), intent(inout) :: outTileCount_dummy
+    integer(c_int), intent(inout) :: outTileAttributeCount_dummy
+    interface
+      function lib_cdiIterator_inqTileCount(me_dummy, outTileCount_dummy,&
+      & outTileAttributeCount_dummy) bind(c, name = 'cdiIterator_inqTileCount')&
+      & result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        integer(c_int), intent(inout) :: outTileCount_dummy
+        integer(c_int), intent(inout) :: outTileAttributeCount_dummy
+      end function lib_cdiIterator_inqTileCount
+    end interface
+    f_result = lib_cdiIterator_inqTileCount(me_dummy%ptr, outTileCount_dummy,&
+    & outTileAttributeCount_dummy)
+  end function cdiIterator_inqTileCount
+
+  function cdiIterator_inqParam(me_dummy) result(f_result)
+    type(t_CdiParam) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_inqParam(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqParam') result(c_result)
+        import c_ptr, t_CdiParam
+        type(t_CdiParam) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqParam
+    end interface
+    f_result = lib_cdiIterator_inqParam(me_dummy%ptr)
+  end function cdiIterator_inqParam
+
+  subroutine cdiIterator_inqParamParts(me_dummy, outDiscipline_dummy,&
+  & outCategory_dummy, outNumber_dummy)
+    type(t_CdiIterator), intent(in) :: me_dummy
+    integer(c_int), intent(inout) :: outDiscipline_dummy
+    integer(c_int), intent(inout) :: outCategory_dummy
+    integer(c_int), intent(inout) :: outNumber_dummy
+    interface
+      subroutine lib_cdiIterator_inqParamParts(me_dummy, outDiscipline_dummy,&
+      & outCategory_dummy, outNumber_dummy) bind(c, name =&
+      & 'cdiIterator_inqParamParts')
+        import c_int, c_ptr
+        type(c_ptr), value :: me_dummy
+        integer(c_int), intent(inout) :: outDiscipline_dummy
+        integer(c_int), intent(inout) :: outCategory_dummy
+        integer(c_int), intent(inout) :: outNumber_dummy
+      end subroutine lib_cdiIterator_inqParamParts
+    end interface
+    call lib_cdiIterator_inqParamParts(me_dummy%ptr, outDiscipline_dummy,&
+    & outCategory_dummy, outNumber_dummy)
+  end subroutine cdiIterator_inqParamParts
+
+  function cdiIterator_inqDatatype(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_inqDatatype(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqDatatype') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqDatatype
+    end interface
+    f_result = lib_cdiIterator_inqDatatype(me_dummy%ptr)
+  end function cdiIterator_inqDatatype
+
+  function cdiIterator_inqFiletype(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_inqFiletype(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqFiletype') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqFiletype
+    end interface
+    f_result = lib_cdiIterator_inqFiletype(me_dummy%ptr)
+  end function cdiIterator_inqFiletype
+
+  function cdiIterator_inqTsteptype(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_inqTsteptype(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqTsteptype') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqTsteptype
+    end interface
+    f_result = lib_cdiIterator_inqTsteptype(me_dummy%ptr)
+  end function cdiIterator_inqTsteptype
+
+  function cdiIterator_inqVariableName(me_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiIterator_inqVariableName(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqVariableName') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqVariableName
+    end interface
+    cString = lib_cdiIterator_inqVariableName(me_dummy%ptr)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiIterator_inqVariableName
+
+  function cdiIterator_inqGridId(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiIterator_inqGridId(me_dummy) bind(c, name =&
+      & 'cdiIterator_inqGridId') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiIterator_inqGridId
+    end interface
+    f_result = lib_cdiIterator_inqGridId(me_dummy%ptr)
+  end function cdiIterator_inqGridId
+
+  subroutine cdiIterator_readField(me_dummy, data_dummy, numMissVals)
+    type(t_CdiIterator), intent(in) :: me_dummy
+    real(c_double), intent(inout) :: data_dummy(*)
+    integer(c_int), optional, target, intent(inout) :: numMissVals
+    type(c_ptr) :: numMissVals_cptr
+    interface
+      subroutine lib_cdiIterator_readField(me_dummy, data_dummy, numMissVals)&
+      & bind(c, name = 'cdiIterator_readField')
+        import c_double, c_ptr
+        type(c_ptr), value :: me_dummy
+        real(c_double), intent(inout) :: data_dummy(*)
+        type(c_ptr), value :: numMissVals
+      end subroutine lib_cdiIterator_readField
+    end interface
+    numMissVals_cptr = c_null_ptr
+    if(present(numMissVals)) numMissVals_cptr = c_loc(numMissVals)
+    call lib_cdiIterator_readField(me_dummy%ptr, data_dummy, numMissVals_cptr)
+  end subroutine cdiIterator_readField
+
+  subroutine cdiIterator_readFieldF(me_dummy, data_dummy, numMissVals)
+    type(t_CdiIterator), intent(in) :: me_dummy
+    real(c_float), intent(inout) :: data_dummy(*)
+    integer(c_int), optional, target, intent(inout) :: numMissVals
+    type(c_ptr) :: numMissVals_cptr
+    interface
+      subroutine lib_cdiIterator_readFieldF(me_dummy, data_dummy, numMissVals)&
+      & bind(c, name = 'cdiIterator_readFieldF')
+        import c_float, c_ptr
+        type(c_ptr), value :: me_dummy
+        real(c_float), intent(inout) :: data_dummy(*)
+        type(c_ptr), value :: numMissVals
+      end subroutine lib_cdiIterator_readFieldF
+    end interface
+    numMissVals_cptr = c_null_ptr
+    if(present(numMissVals)) numMissVals_cptr = c_loc(numMissVals)
+    call lib_cdiIterator_readFieldF(me_dummy%ptr, data_dummy, numMissVals_cptr)
+  end subroutine cdiIterator_readFieldF
+
+  function cdiGribIterator_clone(me_dummy) result(f_result)
+    type(t_CdiGribIterator) :: f_result
+    type(t_CdiIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiGribIterator_clone(me_dummy) bind(c, name =&
+      & 'cdiGribIterator_clone') result(c_result)
+        import c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiGribIterator_clone
+    end interface
+    f_result%ptr = lib_cdiGribIterator_clone(me_dummy%ptr)
+  end function cdiGribIterator_clone
+
+  subroutine cdiGribIterator_delete(me_dummy)
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    interface
+      subroutine lib_cdiGribIterator_delete(me_dummy) bind(c, name =&
+      & 'cdiGribIterator_delete')
+        import c_ptr
+        type(c_ptr), value :: me_dummy
+      end subroutine lib_cdiGribIterator_delete
+    end interface
+    call lib_cdiGribIterator_delete(me_dummy%ptr)
+  end subroutine cdiGribIterator_delete
+
+  function cdiGribIterator_getLong(me_dummy, key_dummy, value_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_long), intent(inout) :: value_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getLong(me_dummy, key_dummy, value_dummy)&
+      & bind(c, name = 'cdiGribIterator_getLong') result(c_result)
+        import c_char, c_int, c_long, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_long), intent(inout) :: value_dummy
+      end function lib_cdiGribIterator_getLong
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getLong(me_dummy%ptr, key_temp, value_dummy)
+  end function cdiGribIterator_getLong
+
+  function cdiGribIterator_getDouble(me_dummy, key_dummy, value_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    real(c_double), intent(inout) :: value_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getDouble(me_dummy, key_dummy, value_dummy)&
+      & bind(c, name = 'cdiGribIterator_getDouble') result(c_result)
+        import c_char, c_double, c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        real(c_double), intent(inout) :: value_dummy
+      end function lib_cdiGribIterator_getDouble
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getDouble(me_dummy%ptr, key_temp,&
+    & value_dummy)
+  end function cdiGribIterator_getDouble
+
+  function cdiGribIterator_getLength(me_dummy, key_dummy, value_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_size_t), intent(inout) :: value_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getLength(me_dummy, key_dummy, value_dummy)&
+      & bind(c, name = 'cdiGribIterator_getLength') result(c_result)
+        import c_char, c_int, c_ptr, c_size_t
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_size_t), intent(inout) :: value_dummy
+      end function lib_cdiGribIterator_getLength
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getLength(me_dummy%ptr, key_temp,&
+    & value_dummy)
+  end function cdiGribIterator_getLength
+
+  function cdiGribIterator_getString(me_dummy, key_dummy, value_dummy,&
+  & length_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    character(kind = c_char, len = *), intent(inout) :: value_dummy
+    integer(c_size_t), intent(inout) :: length_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    character(kind = c_char) :: value_temp(len(value_dummy) + 1)
+    integer :: value_i
+    interface
+      function lib_cdiGribIterator_getString(me_dummy, key_dummy, value_dummy,&
+      & length_dummy) bind(c, name = 'cdiGribIterator_getString')&
+      & result(c_result)
+        import c_char, c_int, c_ptr, c_size_t
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        character(kind = c_char) :: value_dummy(*)
+        integer(c_size_t), intent(inout) :: length_dummy
+      end function lib_cdiGribIterator_getString
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    value_temp(len(value_dummy) + 1) = c_null_char
+    do value_i = len(value_dummy), 1, -1
+      if(value_dummy(value_i:value_i) /= ' ') exit
+      value_temp(value_i) = c_null_char
+    end do
+    do value_i = value_i, 1, -1
+        value_temp(value_i) = value_dummy(value_i:value_i)
+    end do
+    f_result = lib_cdiGribIterator_getString(me_dummy%ptr, key_temp,&
+    & value_temp, length_dummy)
+    do value_i = 1, len(value_dummy)
+      if(value_temp(value_i) == c_null_char) exit
+      value_dummy(value_i:value_i) = value_temp(value_i)
+    end do
+    do value_i = value_i, len(value_dummy)
+      value_dummy(value_i:value_i) = ' '
+    end do
+  end function cdiGribIterator_getString
+
+  function cdiGribIterator_getSize(me_dummy, key_dummy, value_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_size_t), intent(inout) :: value_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getSize(me_dummy, key_dummy, value_dummy)&
+      & bind(c, name = 'cdiGribIterator_getSize') result(c_result)
+        import c_char, c_int, c_ptr, c_size_t
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_size_t), intent(inout) :: value_dummy
+      end function lib_cdiGribIterator_getSize
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getSize(me_dummy%ptr, key_temp, value_dummy)
+  end function cdiGribIterator_getSize
+
+  function cdiGribIterator_getLongArray(me_dummy, key_dummy, value_dummy,&
+  & array_size_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_long), intent(inout) :: value_dummy
+    integer(c_size_t), intent(inout) :: array_size_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getLongArray(me_dummy, key_dummy,&
+      & value_dummy, array_size_dummy) bind(c, name =&
+      & 'cdiGribIterator_getLongArray') result(c_result)
+        import c_char, c_int, c_long, c_ptr, c_size_t
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_long), intent(inout) :: value_dummy
+        integer(c_size_t), intent(inout) :: array_size_dummy
+      end function lib_cdiGribIterator_getLongArray
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getLongArray(me_dummy%ptr, key_temp,&
+    & value_dummy, array_size_dummy)
+  end function cdiGribIterator_getLongArray
+
+  function cdiGribIterator_getDoubleArray(me_dummy, key_dummy, value_dummy,&
+  & array_size_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    real(c_double), intent(inout) :: value_dummy
+    integer(c_size_t), intent(inout) :: array_size_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_getDoubleArray(me_dummy, key_dummy,&
+      & value_dummy, array_size_dummy) bind(c, name =&
+      & 'cdiGribIterator_getDoubleArray') result(c_result)
+        import c_char, c_double, c_int, c_ptr, c_size_t
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        real(c_double), intent(inout) :: value_dummy
+        integer(c_size_t), intent(inout) :: array_size_dummy
+      end function lib_cdiGribIterator_getDoubleArray
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_getDoubleArray(me_dummy%ptr, key_temp,&
+    & value_dummy, array_size_dummy)
+  end function cdiGribIterator_getDoubleArray
+
+  function cdiGribIterator_inqEdition(me_dummy) result(f_result)
+    integer(c_int) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    interface
+      function lib_cdiGribIterator_inqEdition(me_dummy) bind(c, name =&
+      & 'cdiGribIterator_inqEdition') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        type(c_ptr), value :: me_dummy
+      end function lib_cdiGribIterator_inqEdition
+    end interface
+    f_result = lib_cdiGribIterator_inqEdition(me_dummy%ptr)
+  end function cdiGribIterator_inqEdition
+
+  function cdiGribIterator_inqLongValue(me_dummy, key_dummy) result(f_result)
+    integer(c_long) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_inqLongValue(me_dummy, key_dummy) bind(c,&
+      & name = 'cdiGribIterator_inqLongValue') result(c_result)
+        import c_char, c_long, c_ptr
+        integer(c_long) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+      end function lib_cdiGribIterator_inqLongValue
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_inqLongValue(me_dummy%ptr, key_temp)
+  end function cdiGribIterator_inqLongValue
+
+  function cdiGribIterator_inqLongDefaultValue(me_dummy, key_dummy,&
+  & defaultValue_dummy) result(f_result)
+    integer(c_long) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_long), value :: defaultValue_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_inqLongDefaultValue(me_dummy, key_dummy,&
+      & defaultValue_dummy) bind(c, name =&
+      & 'cdiGribIterator_inqLongDefaultValue') result(c_result)
+        import c_char, c_long, c_ptr
+        integer(c_long) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_long), value :: defaultValue_dummy
+      end function lib_cdiGribIterator_inqLongDefaultValue
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_inqLongDefaultValue(me_dummy%ptr, key_temp,&
+    & defaultValue_dummy)
+  end function cdiGribIterator_inqLongDefaultValue
+
+  function cdiGribIterator_inqDoubleValue(me_dummy, key_dummy) result(f_result)
+    real(c_double) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_inqDoubleValue(me_dummy, key_dummy) bind(c,&
+      & name = 'cdiGribIterator_inqDoubleValue') result(c_result)
+        import c_char, c_double, c_ptr
+        real(c_double) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+      end function lib_cdiGribIterator_inqDoubleValue
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_inqDoubleValue(me_dummy%ptr, key_temp)
+  end function cdiGribIterator_inqDoubleValue
+
+  function cdiGribIterator_inqDoubleDefaultValue(me_dummy, key_dummy,&
+  & defaultValue_dummy) result(f_result)
+    real(c_double) :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    real(c_double), value :: defaultValue_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_cdiGribIterator_inqDoubleDefaultValue(me_dummy, key_dummy,&
+      & defaultValue_dummy) bind(c, name =&
+      & 'cdiGribIterator_inqDoubleDefaultValue') result(c_result)
+        import c_char, c_double, c_ptr
+        real(c_double) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+        real(c_double), value :: defaultValue_dummy
+      end function lib_cdiGribIterator_inqDoubleDefaultValue
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_cdiGribIterator_inqDoubleDefaultValue(me_dummy%ptr,&
+    & key_temp, defaultValue_dummy)
+  end function cdiGribIterator_inqDoubleDefaultValue
+
+  function cdiGribIterator_inqStringValue(me_dummy, key_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    type(t_CdiGribIterator), intent(in) :: me_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_cdiGribIterator_inqStringValue(me_dummy, key_dummy) bind(c,&
+      & name = 'cdiGribIterator_inqStringValue') result(c_result)
+        import c_char, c_ptr
+        type(c_ptr) :: c_result
+        type(c_ptr), value :: me_dummy
+        character(kind = c_char) :: key_dummy(*)
+      end function lib_cdiGribIterator_inqStringValue
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    cString = lib_cdiGribIterator_inqStringValue(me_dummy%ptr, key_temp)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function cdiGribIterator_inqStringValue
+
+  subroutine vlistDefVarName(vlistID_dummy, varID_dummy, name_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      subroutine lib_vlistDefVarName(vlistID_dummy, varID_dummy, name_dummy)&
+      & bind(c, name = 'vlistDefVarName')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end subroutine lib_vlistDefVarName
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    call lib_vlistDefVarName(vlistID_dummy, varID_dummy, name_temp)
+  end subroutine vlistDefVarName
+
+  subroutine vlistInqVarName(vlistID_dummy, varID_dummy, name_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(inout) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      subroutine lib_vlistInqVarName(vlistID_dummy, varID_dummy, name_dummy)&
+      & bind(c, name = 'vlistInqVarName')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end subroutine lib_vlistInqVarName
+    end interface
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do name_i = len(name_dummy), 1, -1
+      if(name_dummy(name_i:name_i) /= ' ') exit
+      name_temp(name_i) = c_null_char
+    end do
+    do name_i = name_i, 1, -1
+        name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    call lib_vlistInqVarName(vlistID_dummy, varID_dummy, name_temp)
+    do name_i = 1, len(name_dummy)
+      if(name_temp(name_i) == c_null_char) exit
+      name_dummy(name_i:name_i) = name_temp(name_i)
+    end do
+    do name_i = name_i, len(name_dummy)
+      name_dummy(name_i:name_i) = ' '
+    end do
+  end subroutine vlistInqVarName
+
+  function vlistCopyVarName(vlistId_dummy, varId_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: vlistId_dummy
+    integer(c_int), value :: varId_dummy
+    type(c_ptr) :: cString
+    integer :: rv_shape(1)
+    character(kind = c_char), dimension(:), pointer :: temp
+    interface
+      function lib_vlistCopyVarName(vlistId_dummy, varId_dummy) bind(c, name =&
+      & 'vlistCopyVarName') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: vlistId_dummy
+        integer(c_int), value :: varId_dummy
+      end function lib_vlistCopyVarName
+    end interface
+    cString = lib_vlistCopyVarName(vlistId_dummy, varId_dummy)
+    if(c_associated(cString)) then
+      rv_shape(1) = int(lib_strlen(cString))
+      call c_f_pointer(cString, temp, rv_shape)
+      allocate(f_result(rv_shape(1)))
+      f_result = temp
+      call lib_free(cString)
+    else
+      f_result => null()
+    end if
+  end function vlistCopyVarName
+
+  subroutine vlistDefVarStdname(vlistID_dummy, varID_dummy, stdname_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: stdname_dummy
+    character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1)
+    integer :: stdname_i
+    interface
+      subroutine lib_vlistDefVarStdname(vlistID_dummy, varID_dummy,&
+      & stdname_dummy) bind(c, name = 'vlistDefVarStdname')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: stdname_dummy(*)
+      end subroutine lib_vlistDefVarStdname
+    end interface
+    do stdname_i = 1, len(stdname_dummy)
+      stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i)
+    end do
+    stdname_temp(len(stdname_dummy) + 1) = c_null_char
+    call lib_vlistDefVarStdname(vlistID_dummy, varID_dummy, stdname_temp)
+  end subroutine vlistDefVarStdname
+
+  subroutine vlistInqVarStdname(vlistID_dummy, varID_dummy, stdname_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(inout) :: stdname_dummy
+    character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1)
+    integer :: stdname_i
+    interface
+      subroutine lib_vlistInqVarStdname(vlistID_dummy, varID_dummy,&
+      & stdname_dummy) bind(c, name = 'vlistInqVarStdname')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: stdname_dummy(*)
+      end subroutine lib_vlistInqVarStdname
+    end interface
+    stdname_temp(len(stdname_dummy) + 1) = c_null_char
+    do stdname_i = len(stdname_dummy), 1, -1
+      if(stdname_dummy(stdname_i:stdname_i) /= ' ') exit
+      stdname_temp(stdname_i) = c_null_char
+    end do
+    do stdname_i = stdname_i, 1, -1
+        stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i)
+    end do
+    call lib_vlistInqVarStdname(vlistID_dummy, varID_dummy, stdname_temp)
+    do stdname_i = 1, len(stdname_dummy)
+      if(stdname_temp(stdname_i) == c_null_char) exit
+      stdname_dummy(stdname_i:stdname_i) = stdname_temp(stdname_i)
+    end do
+    do stdname_i = stdname_i, len(stdname_dummy)
+      stdname_dummy(stdname_i:stdname_i) = ' '
+    end do
+  end subroutine vlistInqVarStdname
+
+  subroutine vlistDefVarLongname(vlistID_dummy, varID_dummy, longname_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: longname_dummy
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    interface
+      subroutine lib_vlistDefVarLongname(vlistID_dummy, varID_dummy,&
+      & longname_dummy) bind(c, name = 'vlistDefVarLongname')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: longname_dummy(*)
+      end subroutine lib_vlistDefVarLongname
+    end interface
+    do longname_i = 1, len(longname_dummy)
+      longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    call lib_vlistDefVarLongname(vlistID_dummy, varID_dummy, longname_temp)
+  end subroutine vlistDefVarLongname
+
+  subroutine vlistInqVarLongname(vlistID_dummy, varID_dummy, longname_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(inout) :: longname_dummy
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    interface
+      subroutine lib_vlistInqVarLongname(vlistID_dummy, varID_dummy,&
+      & longname_dummy) bind(c, name = 'vlistInqVarLongname')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: longname_dummy(*)
+      end subroutine lib_vlistInqVarLongname
+    end interface
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    do longname_i = len(longname_dummy), 1, -1
+      if(longname_dummy(longname_i:longname_i) /= ' ') exit
+      longname_temp(longname_i) = c_null_char
+    end do
+    do longname_i = longname_i, 1, -1
+        longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    call lib_vlistInqVarLongname(vlistID_dummy, varID_dummy, longname_temp)
+    do longname_i = 1, len(longname_dummy)
+      if(longname_temp(longname_i) == c_null_char) exit
+      longname_dummy(longname_i:longname_i) = longname_temp(longname_i)
+    end do
+    do longname_i = longname_i, len(longname_dummy)
+      longname_dummy(longname_i:longname_i) = ' '
+    end do
+  end subroutine vlistInqVarLongname
+
+  subroutine vlistDefVarUnits(vlistID_dummy, varID_dummy, units_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: units_dummy
+    character(kind = c_char) :: units_temp(len(units_dummy) + 1)
+    integer :: units_i
+    interface
+      subroutine lib_vlistDefVarUnits(vlistID_dummy, varID_dummy, units_dummy)&
+      & bind(c, name = 'vlistDefVarUnits')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: units_dummy(*)
+      end subroutine lib_vlistDefVarUnits
+    end interface
+    do units_i = 1, len(units_dummy)
+      units_temp(units_i) = units_dummy(units_i:units_i)
+    end do
+    units_temp(len(units_dummy) + 1) = c_null_char
+    call lib_vlistDefVarUnits(vlistID_dummy, varID_dummy, units_temp)
+  end subroutine vlistDefVarUnits
+
+  subroutine vlistInqVarUnits(vlistID_dummy, varID_dummy, units_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(inout) :: units_dummy
+    character(kind = c_char) :: units_temp(len(units_dummy) + 1)
+    integer :: units_i
+    interface
+      subroutine lib_vlistInqVarUnits(vlistID_dummy, varID_dummy, units_dummy)&
+      & bind(c, name = 'vlistInqVarUnits')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: units_dummy(*)
+      end subroutine lib_vlistInqVarUnits
+    end interface
+    units_temp(len(units_dummy) + 1) = c_null_char
+    do units_i = len(units_dummy), 1, -1
+      if(units_dummy(units_i:units_i) /= ' ') exit
+      units_temp(units_i) = c_null_char
+    end do
+    do units_i = units_i, 1, -1
+        units_temp(units_i) = units_dummy(units_i:units_i)
+    end do
+    call lib_vlistInqVarUnits(vlistID_dummy, varID_dummy, units_temp)
+    do units_i = 1, len(units_dummy)
+      if(units_temp(units_i) == c_null_char) exit
+      units_dummy(units_i:units_i) = units_temp(units_i)
+    end do
+    do units_i = units_i, len(units_dummy)
+      units_dummy(units_i:units_i) = ' '
+    end do
+  end subroutine vlistInqVarUnits
+
+  subroutine cdiDefAdditionalKey(string_dummy)
+    character(kind = c_char, len = *), intent(in) :: string_dummy
+    character(kind = c_char) :: string_temp(len(string_dummy) + 1)
+    integer :: string_i
+    interface
+      subroutine lib_cdiDefAdditionalKey(string_dummy) bind(c, name =&
+      & 'cdiDefAdditionalKey')
+        import c_char
+        character(kind = c_char) :: string_dummy(*)
+      end subroutine lib_cdiDefAdditionalKey
+    end interface
+    do string_i = 1, len(string_dummy)
+      string_temp(string_i) = string_dummy(string_i:string_i)
+    end do
+    string_temp(len(string_dummy) + 1) = c_null_char
+    call lib_cdiDefAdditionalKey(string_temp)
+  end subroutine cdiDefAdditionalKey
+
+  subroutine vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_dummy,&
+  & value_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: value_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      subroutine lib_vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_dummy,&
+      & value_dummy) bind(c, name = 'vlistDefVarIntKey')
+        import c_char, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: value_dummy
+      end subroutine lib_vlistDefVarIntKey
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    call lib_vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_temp,&
+    & value_dummy)
+  end subroutine vlistDefVarIntKey
+
+  subroutine vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_dummy,&
+  & value_dummy)
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    real(c_double), value :: value_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      subroutine lib_vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_dummy,&
+      & value_dummy) bind(c, name = 'vlistDefVarDblKey')
+        import c_char, c_double, c_int
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        real(c_double), value :: value_dummy
+      end subroutine lib_vlistDefVarDblKey
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    call lib_vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_temp,&
+    & value_dummy)
+  end subroutine vlistDefVarDblKey
+
+  function vlistHasVarKey(vlistID_dummy, varID_dummy, name_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_vlistHasVarKey(vlistID_dummy, varID_dummy, name_dummy)&
+      & bind(c, name = 'vlistHasVarKey') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_vlistHasVarKey
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_vlistHasVarKey(vlistID_dummy, varID_dummy, name_temp)
+  end function vlistHasVarKey
+
+  function vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_dummy)&
+  & result(f_result)
+    real(c_double) :: f_result
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_dummy)&
+      & bind(c, name = 'vlistInqVarDblKey') result(c_result)
+        import c_char, c_double, c_int
+        real(c_double) :: c_result
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_vlistInqVarDblKey
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_temp)
+  end function vlistInqVarDblKey
+
+  function vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: vlistID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_dummy)&
+      & bind(c, name = 'vlistInqVarIntKey') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: vlistID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_vlistInqVarIntKey
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_temp)
+  end function vlistInqVarIntKey
+
+  function cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy, name_dummy,&
+  & typep_dummy, lenp_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    integer(c_int), value :: attrnum_dummy
+    character(kind = c_char, len = *), intent(inout) :: name_dummy
+    integer(c_int), intent(inout) :: typep_dummy
+    integer(c_int), intent(inout) :: lenp_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy,&
+      & name_dummy, typep_dummy, lenp_dummy) bind(c, name = 'cdiInqAtt')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        integer(c_int), value :: attrnum_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), intent(inout) :: typep_dummy
+        integer(c_int), intent(inout) :: lenp_dummy
+      end function lib_cdiInqAtt
+    end interface
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do name_i = len(name_dummy), 1, -1
+      if(name_dummy(name_i:name_i) /= ' ') exit
+      name_temp(name_i) = c_null_char
+    end do
+    do name_i = name_i, 1, -1
+        name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    f_result = lib_cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy,&
+    & name_temp, typep_dummy, lenp_dummy)
+    do name_i = 1, len(name_dummy)
+      if(name_temp(name_i) == c_null_char) exit
+      name_dummy(name_i:name_i) = name_temp(name_i)
+    end do
+    do name_i = name_i, len(name_dummy)
+      name_dummy(name_i:name_i) = ' '
+    end do
+  end function cdiInqAtt
+
+  function cdiInqAttLen(cdiID_dummy, varID_dummy, name_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiInqAttLen(cdiID_dummy, varID_dummy, name_dummy) bind(c,&
+      & name = 'cdiInqAttLen') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_cdiInqAttLen
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiInqAttLen(cdiID_dummy, varID_dummy, name_temp)
+  end function cdiInqAttLen
+
+  function cdiInqAttType(cdiID_dummy, varID_dummy, name_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiInqAttType(cdiID_dummy, varID_dummy, name_dummy) bind(c,&
+      & name = 'cdiInqAttType') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_cdiInqAttType
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiInqAttType(cdiID_dummy, varID_dummy, name_temp)
+  end function cdiInqAttType
+
+  function cdiDelAtt(cdiID_dummy, varID_dummy, name_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiDelAtt(cdiID_dummy, varID_dummy, name_dummy) bind(c, name&
+      & = 'cdiDelAtt') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_cdiDelAtt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiDelAtt(cdiID_dummy, varID_dummy, name_temp)
+  end function cdiDelAtt
+
+  function cdiDefAttInt(cdiID_dummy, varID_dummy, name_dummy, type_dummy,&
+  & len_dummy, ip_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: type_dummy
+    integer(c_int), value :: len_dummy
+    integer(c_int), intent(in) :: ip_dummy(*)
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiDefAttInt(cdiID_dummy, varID_dummy, name_dummy,&
+      & type_dummy, len_dummy, ip_dummy) bind(c, name = 'cdiDefAttInt')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: type_dummy
+        integer(c_int), value :: len_dummy
+        integer(c_int), intent(in) :: ip_dummy(*)
+      end function lib_cdiDefAttInt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiDefAttInt(cdiID_dummy, varID_dummy, name_temp,&
+    & type_dummy, len_dummy, ip_dummy)
+  end function cdiDefAttInt
+
+  function cdiDefAttFlt(cdiID_dummy, varID_dummy, name_dummy, type_dummy,&
+  & len_dummy, dp_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: type_dummy
+    integer(c_int), value :: len_dummy
+    real(c_double), intent(in) :: dp_dummy(*)
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiDefAttFlt(cdiID_dummy, varID_dummy, name_dummy,&
+      & type_dummy, len_dummy, dp_dummy) bind(c, name = 'cdiDefAttFlt')&
+      & result(c_result)
+        import c_char, c_double, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: type_dummy
+        integer(c_int), value :: len_dummy
+        real(c_double), intent(in) :: dp_dummy(*)
+      end function lib_cdiDefAttFlt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiDefAttFlt(cdiID_dummy, varID_dummy, name_temp,&
+    & type_dummy, len_dummy, dp_dummy)
+  end function cdiDefAttFlt
+
+  function cdiDefAttTxt(cdiID_dummy, varID_dummy, name_dummy, len_dummy,&
+  & tp_cbuf_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: len_dummy
+    character(kind = c_char, len = *), intent(in) :: tp_cbuf_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    character(kind = c_char) :: tp_cbuf_temp(len(tp_cbuf_dummy) + 1)
+    integer :: tp_cbuf_i
+    interface
+      function lib_cdiDefAttTxt(cdiID_dummy, varID_dummy, name_dummy,&
+      & len_dummy, tp_cbuf_dummy) bind(c, name = 'cdiDefAttTxt')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: len_dummy
+        character(kind = c_char) :: tp_cbuf_dummy(*)
+      end function lib_cdiDefAttTxt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do tp_cbuf_i = 1, len(tp_cbuf_dummy)
+      tp_cbuf_temp(tp_cbuf_i) = tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i)
+    end do
+    tp_cbuf_temp(len(tp_cbuf_dummy) + 1) = c_null_char
+    f_result = lib_cdiDefAttTxt(cdiID_dummy, varID_dummy, name_temp, len_dummy,&
+    & tp_cbuf_temp)
+  end function cdiDefAttTxt
+
+  function cdiInqAttInt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,&
+  & ip_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: mlen_dummy
+    integer(c_int), intent(inout) :: ip_dummy(*)
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiInqAttInt(cdiID_dummy, varID_dummy, name_dummy,&
+      & mlen_dummy, ip_dummy) bind(c, name = 'cdiInqAttInt') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: mlen_dummy
+        integer(c_int), intent(inout) :: ip_dummy(*)
+      end function lib_cdiInqAttInt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiInqAttInt(cdiID_dummy, varID_dummy, name_temp,&
+    & mlen_dummy, ip_dummy)
+  end function cdiInqAttInt
+
+  function cdiInqAttFlt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,&
+  & dp_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: mlen_dummy
+    real(c_double), intent(inout) :: dp_dummy(*)
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_cdiInqAttFlt(cdiID_dummy, varID_dummy, name_dummy,&
+      & mlen_dummy, dp_dummy) bind(c, name = 'cdiInqAttFlt') result(c_result)
+        import c_char, c_double, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: mlen_dummy
+        real(c_double), intent(inout) :: dp_dummy(*)
+      end function lib_cdiInqAttFlt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_cdiInqAttFlt(cdiID_dummy, varID_dummy, name_temp,&
+    & mlen_dummy, dp_dummy)
+  end function cdiInqAttFlt
+
+  function cdiInqAttTxt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,&
+  & tp_cbuf_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    integer(c_int), value :: mlen_dummy
+    character(kind = c_char, len = *), intent(inout) :: tp_cbuf_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    character(kind = c_char) :: tp_cbuf_temp(len(tp_cbuf_dummy) + 1)
+    integer :: tp_cbuf_i
+    interface
+      function lib_cdiInqAttTxt(cdiID_dummy, varID_dummy, name_dummy,&
+      & mlen_dummy, tp_cbuf_dummy) bind(c, name = 'cdiInqAttTxt')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        character(kind = c_char) :: name_dummy(*)
+        integer(c_int), value :: mlen_dummy
+        character(kind = c_char) :: tp_cbuf_dummy(*)
+      end function lib_cdiInqAttTxt
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    tp_cbuf_temp(len(tp_cbuf_dummy) + 1) = c_null_char
+    do tp_cbuf_i = len(tp_cbuf_dummy), 1, -1
+      if(tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) /= ' ') exit
+      tp_cbuf_temp(tp_cbuf_i) = c_null_char
+    end do
+    do tp_cbuf_i = tp_cbuf_i, 1, -1
+        tp_cbuf_temp(tp_cbuf_i) = tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i)
+    end do
+    f_result = lib_cdiInqAttTxt(cdiID_dummy, varID_dummy, name_temp,&
+    & mlen_dummy, tp_cbuf_temp)
+    do tp_cbuf_i = 1, len(tp_cbuf_dummy)
+      if(tp_cbuf_temp(tp_cbuf_i) == c_null_char) exit
+      tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) = tp_cbuf_temp(tp_cbuf_i)
+    end do
+    do tp_cbuf_i = tp_cbuf_i, len(tp_cbuf_dummy)
+      tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) = ' '
+    end do
+  end function cdiInqAttTxt
+
+  subroutine gridName(gridtype_dummy, gridname_dummy)
+    integer(c_int), value :: gridtype_dummy
+    character(kind = c_char, len = *), intent(inout) :: gridname_dummy
+    character(kind = c_char) :: gridname_temp(len(gridname_dummy) + 1)
+    integer :: gridname_i
+    interface
+      subroutine lib_gridName(gridtype_dummy, gridname_dummy) bind(c, name =&
+      & 'gridName')
+        import c_char, c_int
+        integer(c_int), value :: gridtype_dummy
+        character(kind = c_char) :: gridname_dummy(*)
+      end subroutine lib_gridName
+    end interface
+    gridname_temp(len(gridname_dummy) + 1) = c_null_char
+    do gridname_i = len(gridname_dummy), 1, -1
+      if(gridname_dummy(gridname_i:gridname_i) /= ' ') exit
+      gridname_temp(gridname_i) = c_null_char
+    end do
+    do gridname_i = gridname_i, 1, -1
+        gridname_temp(gridname_i) = gridname_dummy(gridname_i:gridname_i)
+    end do
+    call lib_gridName(gridtype_dummy, gridname_temp)
+    do gridname_i = 1, len(gridname_dummy)
+      if(gridname_temp(gridname_i) == c_null_char) exit
+      gridname_dummy(gridname_i:gridname_i) = gridname_temp(gridname_i)
+    end do
+    do gridname_i = gridname_i, len(gridname_dummy)
+      gridname_dummy(gridname_i:gridname_i) = ' '
+    end do
+  end subroutine gridName
+
+  function gridNamePtr(gridtype_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: gridtype_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_gridNamePtr(gridtype_dummy) bind(c, name = 'gridNamePtr')&
+      & result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: gridtype_dummy
+      end function lib_gridNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_gridNamePtr(gridtype_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function gridNamePtr
+
+  function cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy, string_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    integer(c_int), value :: key_dummy
+    character(kind = c_char, len = *), intent(in) :: string_dummy
+    character(kind = c_char) :: string_temp(len(string_dummy) + 1)
+    integer :: string_i
+    interface
+      function lib_cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy,&
+      & string_dummy) bind(c, name = 'cdiDefKeyString') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        integer(c_int), value :: key_dummy
+        character(kind = c_char) :: string_dummy(*)
+      end function lib_cdiDefKeyString
+    end interface
+    do string_i = 1, len(string_dummy)
+      string_temp(string_i) = string_dummy(string_i:string_i)
+    end do
+    string_temp(len(string_dummy) + 1) = c_null_char
+    f_result = lib_cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy,&
+    & string_temp)
+  end function cdiDefKeyString
+
+  function cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy, string_dummy,&
+  & length_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: cdiID_dummy
+    integer(c_int), value :: varID_dummy
+    integer(c_int), value :: key_dummy
+    character(kind = c_char, len = *), intent(inout) :: string_dummy
+    integer(c_int), intent(inout) :: length_dummy
+    character(kind = c_char) :: string_temp(len(string_dummy) + 1)
+    integer :: string_i
+    interface
+      function lib_cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy,&
+      & string_dummy, length_dummy) bind(c, name = 'cdiInqKeyString')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: cdiID_dummy
+        integer(c_int), value :: varID_dummy
+        integer(c_int), value :: key_dummy
+        character(kind = c_char) :: string_dummy(*)
+        integer(c_int), intent(inout) :: length_dummy
+      end function lib_cdiInqKeyString
+    end interface
+    string_temp(len(string_dummy) + 1) = c_null_char
+    do string_i = len(string_dummy), 1, -1
+      if(string_dummy(string_i:string_i) /= ' ') exit
+      string_temp(string_i) = c_null_char
+    end do
+    do string_i = string_i, 1, -1
+        string_temp(string_i) = string_dummy(string_i:string_i)
+    end do
+    f_result = lib_cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy,&
+    & string_temp, length_dummy)
+    do string_i = 1, len(string_dummy)
+      if(string_temp(string_i) == c_null_char) exit
+      string_dummy(string_i:string_i) = string_temp(string_i)
+    end do
+    do string_i = string_i, len(string_dummy)
+      string_dummy(string_i:string_i) = ' '
+    end do
+  end function cdiInqKeyString
+
+  subroutine gridDefXname(gridID_dummy, xname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: xname_dummy
+    character(kind = c_char) :: xname_temp(len(xname_dummy) + 1)
+    integer :: xname_i
+    interface
+      subroutine lib_gridDefXname(gridID_dummy, xname_dummy) bind(c, name =&
+      & 'gridDefXname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xname_dummy(*)
+      end subroutine lib_gridDefXname
+    end interface
+    do xname_i = 1, len(xname_dummy)
+      xname_temp(xname_i) = xname_dummy(xname_i:xname_i)
+    end do
+    xname_temp(len(xname_dummy) + 1) = c_null_char
+    call lib_gridDefXname(gridID_dummy, xname_temp)
+  end subroutine gridDefXname
+
+  subroutine gridInqXname(gridID_dummy, xname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: xname_dummy
+    character(kind = c_char) :: xname_temp(len(xname_dummy) + 1)
+    integer :: xname_i
+    interface
+      subroutine lib_gridInqXname(gridID_dummy, xname_dummy) bind(c, name =&
+      & 'gridInqXname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xname_dummy(*)
+      end subroutine lib_gridInqXname
+    end interface
+    xname_temp(len(xname_dummy) + 1) = c_null_char
+    do xname_i = len(xname_dummy), 1, -1
+      if(xname_dummy(xname_i:xname_i) /= ' ') exit
+      xname_temp(xname_i) = c_null_char
+    end do
+    do xname_i = xname_i, 1, -1
+        xname_temp(xname_i) = xname_dummy(xname_i:xname_i)
+    end do
+    call lib_gridInqXname(gridID_dummy, xname_temp)
+    do xname_i = 1, len(xname_dummy)
+      if(xname_temp(xname_i) == c_null_char) exit
+      xname_dummy(xname_i:xname_i) = xname_temp(xname_i)
+    end do
+    do xname_i = xname_i, len(xname_dummy)
+      xname_dummy(xname_i:xname_i) = ' '
+    end do
+  end subroutine gridInqXname
+
+  subroutine gridDefXlongname(gridID_dummy, xlongname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: xlongname_dummy
+    character(kind = c_char) :: xlongname_temp(len(xlongname_dummy) + 1)
+    integer :: xlongname_i
+    interface
+      subroutine lib_gridDefXlongname(gridID_dummy, xlongname_dummy) bind(c,&
+      & name = 'gridDefXlongname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xlongname_dummy(*)
+      end subroutine lib_gridDefXlongname
+    end interface
+    do xlongname_i = 1, len(xlongname_dummy)
+      xlongname_temp(xlongname_i) = xlongname_dummy(xlongname_i:xlongname_i)
+    end do
+    xlongname_temp(len(xlongname_dummy) + 1) = c_null_char
+    call lib_gridDefXlongname(gridID_dummy, xlongname_temp)
+  end subroutine gridDefXlongname
+
+  subroutine gridInqXlongname(gridID_dummy, xlongname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: xlongname_dummy
+    character(kind = c_char) :: xlongname_temp(len(xlongname_dummy) + 1)
+    integer :: xlongname_i
+    interface
+      subroutine lib_gridInqXlongname(gridID_dummy, xlongname_dummy) bind(c,&
+      & name = 'gridInqXlongname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xlongname_dummy(*)
+      end subroutine lib_gridInqXlongname
+    end interface
+    xlongname_temp(len(xlongname_dummy) + 1) = c_null_char
+    do xlongname_i = len(xlongname_dummy), 1, -1
+      if(xlongname_dummy(xlongname_i:xlongname_i) /= ' ') exit
+      xlongname_temp(xlongname_i) = c_null_char
+    end do
+    do xlongname_i = xlongname_i, 1, -1
+        xlongname_temp(xlongname_i) = xlongname_dummy(xlongname_i:xlongname_i)
+    end do
+    call lib_gridInqXlongname(gridID_dummy, xlongname_temp)
+    do xlongname_i = 1, len(xlongname_dummy)
+      if(xlongname_temp(xlongname_i) == c_null_char) exit
+      xlongname_dummy(xlongname_i:xlongname_i) = xlongname_temp(xlongname_i)
+    end do
+    do xlongname_i = xlongname_i, len(xlongname_dummy)
+      xlongname_dummy(xlongname_i:xlongname_i) = ' '
+    end do
+  end subroutine gridInqXlongname
+
+  subroutine gridDefXunits(gridID_dummy, xunits_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: xunits_dummy
+    character(kind = c_char) :: xunits_temp(len(xunits_dummy) + 1)
+    integer :: xunits_i
+    interface
+      subroutine lib_gridDefXunits(gridID_dummy, xunits_dummy) bind(c, name =&
+      & 'gridDefXunits')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xunits_dummy(*)
+      end subroutine lib_gridDefXunits
+    end interface
+    do xunits_i = 1, len(xunits_dummy)
+      xunits_temp(xunits_i) = xunits_dummy(xunits_i:xunits_i)
+    end do
+    xunits_temp(len(xunits_dummy) + 1) = c_null_char
+    call lib_gridDefXunits(gridID_dummy, xunits_temp)
+  end subroutine gridDefXunits
+
+  subroutine gridInqXunits(gridID_dummy, xunits_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: xunits_dummy
+    character(kind = c_char) :: xunits_temp(len(xunits_dummy) + 1)
+    integer :: xunits_i
+    interface
+      subroutine lib_gridInqXunits(gridID_dummy, xunits_dummy) bind(c, name =&
+      & 'gridInqXunits')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: xunits_dummy(*)
+      end subroutine lib_gridInqXunits
+    end interface
+    xunits_temp(len(xunits_dummy) + 1) = c_null_char
+    do xunits_i = len(xunits_dummy), 1, -1
+      if(xunits_dummy(xunits_i:xunits_i) /= ' ') exit
+      xunits_temp(xunits_i) = c_null_char
+    end do
+    do xunits_i = xunits_i, 1, -1
+        xunits_temp(xunits_i) = xunits_dummy(xunits_i:xunits_i)
+    end do
+    call lib_gridInqXunits(gridID_dummy, xunits_temp)
+    do xunits_i = 1, len(xunits_dummy)
+      if(xunits_temp(xunits_i) == c_null_char) exit
+      xunits_dummy(xunits_i:xunits_i) = xunits_temp(xunits_i)
+    end do
+    do xunits_i = xunits_i, len(xunits_dummy)
+      xunits_dummy(xunits_i:xunits_i) = ' '
+    end do
+  end subroutine gridInqXunits
+
+  subroutine gridDefYname(gridID_dummy, yname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: yname_dummy
+    character(kind = c_char) :: yname_temp(len(yname_dummy) + 1)
+    integer :: yname_i
+    interface
+      subroutine lib_gridDefYname(gridID_dummy, yname_dummy) bind(c, name =&
+      & 'gridDefYname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: yname_dummy(*)
+      end subroutine lib_gridDefYname
+    end interface
+    do yname_i = 1, len(yname_dummy)
+      yname_temp(yname_i) = yname_dummy(yname_i:yname_i)
+    end do
+    yname_temp(len(yname_dummy) + 1) = c_null_char
+    call lib_gridDefYname(gridID_dummy, yname_temp)
+  end subroutine gridDefYname
+
+  subroutine gridInqYname(gridID_dummy, yname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: yname_dummy
+    character(kind = c_char) :: yname_temp(len(yname_dummy) + 1)
+    integer :: yname_i
+    interface
+      subroutine lib_gridInqYname(gridID_dummy, yname_dummy) bind(c, name =&
+      & 'gridInqYname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: yname_dummy(*)
+      end subroutine lib_gridInqYname
+    end interface
+    yname_temp(len(yname_dummy) + 1) = c_null_char
+    do yname_i = len(yname_dummy), 1, -1
+      if(yname_dummy(yname_i:yname_i) /= ' ') exit
+      yname_temp(yname_i) = c_null_char
+    end do
+    do yname_i = yname_i, 1, -1
+        yname_temp(yname_i) = yname_dummy(yname_i:yname_i)
+    end do
+    call lib_gridInqYname(gridID_dummy, yname_temp)
+    do yname_i = 1, len(yname_dummy)
+      if(yname_temp(yname_i) == c_null_char) exit
+      yname_dummy(yname_i:yname_i) = yname_temp(yname_i)
+    end do
+    do yname_i = yname_i, len(yname_dummy)
+      yname_dummy(yname_i:yname_i) = ' '
+    end do
+  end subroutine gridInqYname
+
+  subroutine gridDefYlongname(gridID_dummy, ylongname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: ylongname_dummy
+    character(kind = c_char) :: ylongname_temp(len(ylongname_dummy) + 1)
+    integer :: ylongname_i
+    interface
+      subroutine lib_gridDefYlongname(gridID_dummy, ylongname_dummy) bind(c,&
+      & name = 'gridDefYlongname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: ylongname_dummy(*)
+      end subroutine lib_gridDefYlongname
+    end interface
+    do ylongname_i = 1, len(ylongname_dummy)
+      ylongname_temp(ylongname_i) = ylongname_dummy(ylongname_i:ylongname_i)
+    end do
+    ylongname_temp(len(ylongname_dummy) + 1) = c_null_char
+    call lib_gridDefYlongname(gridID_dummy, ylongname_temp)
+  end subroutine gridDefYlongname
+
+  subroutine gridInqYlongname(gridID_dummy, ylongname_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: ylongname_dummy
+    character(kind = c_char) :: ylongname_temp(len(ylongname_dummy) + 1)
+    integer :: ylongname_i
+    interface
+      subroutine lib_gridInqYlongname(gridID_dummy, ylongname_dummy) bind(c,&
+      & name = 'gridInqYlongname')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: ylongname_dummy(*)
+      end subroutine lib_gridInqYlongname
+    end interface
+    ylongname_temp(len(ylongname_dummy) + 1) = c_null_char
+    do ylongname_i = len(ylongname_dummy), 1, -1
+      if(ylongname_dummy(ylongname_i:ylongname_i) /= ' ') exit
+      ylongname_temp(ylongname_i) = c_null_char
+    end do
+    do ylongname_i = ylongname_i, 1, -1
+        ylongname_temp(ylongname_i) = ylongname_dummy(ylongname_i:ylongname_i)
+    end do
+    call lib_gridInqYlongname(gridID_dummy, ylongname_temp)
+    do ylongname_i = 1, len(ylongname_dummy)
+      if(ylongname_temp(ylongname_i) == c_null_char) exit
+      ylongname_dummy(ylongname_i:ylongname_i) = ylongname_temp(ylongname_i)
+    end do
+    do ylongname_i = ylongname_i, len(ylongname_dummy)
+      ylongname_dummy(ylongname_i:ylongname_i) = ' '
+    end do
+  end subroutine gridInqYlongname
+
+  subroutine gridDefYunits(gridID_dummy, yunits_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: yunits_dummy
+    character(kind = c_char) :: yunits_temp(len(yunits_dummy) + 1)
+    integer :: yunits_i
+    interface
+      subroutine lib_gridDefYunits(gridID_dummy, yunits_dummy) bind(c, name =&
+      & 'gridDefYunits')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: yunits_dummy(*)
+      end subroutine lib_gridDefYunits
+    end interface
+    do yunits_i = 1, len(yunits_dummy)
+      yunits_temp(yunits_i) = yunits_dummy(yunits_i:yunits_i)
+    end do
+    yunits_temp(len(yunits_dummy) + 1) = c_null_char
+    call lib_gridDefYunits(gridID_dummy, yunits_temp)
+  end subroutine gridDefYunits
+
+  subroutine gridInqYunits(gridID_dummy, yunits_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: yunits_dummy
+    character(kind = c_char) :: yunits_temp(len(yunits_dummy) + 1)
+    integer :: yunits_i
+    interface
+      subroutine lib_gridInqYunits(gridID_dummy, yunits_dummy) bind(c, name =&
+      & 'gridInqYunits')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: yunits_dummy(*)
+      end subroutine lib_gridInqYunits
+    end interface
+    yunits_temp(len(yunits_dummy) + 1) = c_null_char
+    do yunits_i = len(yunits_dummy), 1, -1
+      if(yunits_dummy(yunits_i:yunits_i) /= ' ') exit
+      yunits_temp(yunits_i) = c_null_char
+    end do
+    do yunits_i = yunits_i, 1, -1
+        yunits_temp(yunits_i) = yunits_dummy(yunits_i:yunits_i)
+    end do
+    call lib_gridInqYunits(gridID_dummy, yunits_temp)
+    do yunits_i = 1, len(yunits_dummy)
+      if(yunits_temp(yunits_i) == c_null_char) exit
+      yunits_dummy(yunits_i:yunits_i) = yunits_temp(yunits_i)
+    end do
+    do yunits_i = yunits_i, len(yunits_dummy)
+      yunits_dummy(yunits_i:yunits_i) = ' '
+    end do
+  end subroutine gridInqYunits
+
+  subroutine gridDefReference(gridID_dummy, reference_dummy)
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(in) :: reference_dummy
+    character(kind = c_char) :: reference_temp(len(reference_dummy) + 1)
+    integer :: reference_i
+    interface
+      subroutine lib_gridDefReference(gridID_dummy, reference_dummy) bind(c,&
+      & name = 'gridDefReference')
+        import c_char, c_int
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: reference_dummy(*)
+      end subroutine lib_gridDefReference
+    end interface
+    do reference_i = 1, len(reference_dummy)
+      reference_temp(reference_i) = reference_dummy(reference_i:reference_i)
+    end do
+    reference_temp(len(reference_dummy) + 1) = c_null_char
+    call lib_gridDefReference(gridID_dummy, reference_temp)
+  end subroutine gridDefReference
+
+  function gridInqReference(gridID_dummy, reference_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: gridID_dummy
+    character(kind = c_char, len = *), intent(inout) :: reference_dummy
+    character(kind = c_char) :: reference_temp(len(reference_dummy) + 1)
+    integer :: reference_i
+    interface
+      function lib_gridInqReference(gridID_dummy, reference_dummy) bind(c, name&
+      & = 'gridInqReference') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: gridID_dummy
+        character(kind = c_char) :: reference_dummy(*)
+      end function lib_gridInqReference
+    end interface
+    reference_temp(len(reference_dummy) + 1) = c_null_char
+    do reference_i = len(reference_dummy), 1, -1
+      if(reference_dummy(reference_i:reference_i) /= ' ') exit
+      reference_temp(reference_i) = c_null_char
+    end do
+    do reference_i = reference_i, 1, -1
+        reference_temp(reference_i) = reference_dummy(reference_i:reference_i)
+    end do
+    f_result = lib_gridInqReference(gridID_dummy, reference_temp)
+    do reference_i = 1, len(reference_dummy)
+      if(reference_temp(reference_i) == c_null_char) exit
+      reference_dummy(reference_i:reference_i) = reference_temp(reference_i)
+    end do
+    do reference_i = reference_i, len(reference_dummy)
+      reference_dummy(reference_i:reference_i) = ' '
+    end do
+  end function gridInqReference
+
+  subroutine zaxisName(zaxistype_dummy, zaxisname_dummy)
+    integer(c_int), value :: zaxistype_dummy
+    character(kind = c_char, len = *), intent(inout) :: zaxisname_dummy
+    character(kind = c_char) :: zaxisname_temp(len(zaxisname_dummy) + 1)
+    integer :: zaxisname_i
+    interface
+      subroutine lib_zaxisName(zaxistype_dummy, zaxisname_dummy) bind(c, name =&
+      & 'zaxisName')
+        import c_char, c_int
+        integer(c_int), value :: zaxistype_dummy
+        character(kind = c_char) :: zaxisname_dummy(*)
+      end subroutine lib_zaxisName
+    end interface
+    zaxisname_temp(len(zaxisname_dummy) + 1) = c_null_char
+    do zaxisname_i = len(zaxisname_dummy), 1, -1
+      if(zaxisname_dummy(zaxisname_i:zaxisname_i) /= ' ') exit
+      zaxisname_temp(zaxisname_i) = c_null_char
+    end do
+    do zaxisname_i = zaxisname_i, 1, -1
+        zaxisname_temp(zaxisname_i) = zaxisname_dummy(zaxisname_i:zaxisname_i)
+    end do
+    call lib_zaxisName(zaxistype_dummy, zaxisname_temp)
+    do zaxisname_i = 1, len(zaxisname_dummy)
+      if(zaxisname_temp(zaxisname_i) == c_null_char) exit
+      zaxisname_dummy(zaxisname_i:zaxisname_i) = zaxisname_temp(zaxisname_i)
+    end do
+    do zaxisname_i = zaxisname_i, len(zaxisname_dummy)
+      zaxisname_dummy(zaxisname_i:zaxisname_i) = ' '
+    end do
+  end subroutine zaxisName
+
+  function zaxisNamePtr(leveltype_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: leveltype_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_zaxisNamePtr(leveltype_dummy) bind(c, name = 'zaxisNamePtr')&
+      & result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: leveltype_dummy
+      end function lib_zaxisNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_zaxisNamePtr(leveltype_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function zaxisNamePtr
+
+  subroutine zaxisDefName(zaxisID_dummy, name)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), optional, intent(in) :: name
+    character(kind = c_char), allocatable, target :: name_temp(:)
+    integer :: name_i
+    type(c_ptr) :: name_cptr
+    interface
+      subroutine lib_zaxisDefName(zaxisID_dummy, name) bind(c, name =&
+      & 'zaxisDefName')
+        import c_int, c_ptr
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: name
+      end subroutine lib_zaxisDefName
+    end interface
+    if (present(name)) then
+      allocate(name_temp(len(name) + 1))
+      name_temp(len(name) + 1) = c_null_char
+      do name_i = len(name), 1, -1
+        if(name(name_i:name_i) /= ' ') exit
+        name_temp(name_i) = c_null_char
+      end do
+      do name_i = name_i, 1, -1
+          name_temp(name_i) = name(name_i:name_i)
+      end do
+      name_cptr = c_loc(name_temp)
+    else
+      name_cptr = c_null_ptr
+    end if
+    call lib_zaxisDefName(zaxisID_dummy, name_cptr)
+  end subroutine zaxisDefName
+
+  subroutine zaxisInqName(zaxisID_dummy, name_dummy)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), intent(inout) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      subroutine lib_zaxisInqName(zaxisID_dummy, name_dummy) bind(c, name =&
+      & 'zaxisInqName')
+        import c_char, c_int
+        integer(c_int), value :: zaxisID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end subroutine lib_zaxisInqName
+    end interface
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do name_i = len(name_dummy), 1, -1
+      if(name_dummy(name_i:name_i) /= ' ') exit
+      name_temp(name_i) = c_null_char
+    end do
+    do name_i = name_i, 1, -1
+        name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    call lib_zaxisInqName(zaxisID_dummy, name_temp)
+    do name_i = 1, len(name_dummy)
+      if(name_temp(name_i) == c_null_char) exit
+      name_dummy(name_i:name_i) = name_temp(name_i)
+    end do
+    do name_i = name_i, len(name_dummy)
+      name_dummy(name_i:name_i) = ' '
+    end do
+  end subroutine zaxisInqName
+
+  subroutine zaxisDefLongname(zaxisID_dummy, longname)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), optional, intent(in) :: longname
+    character(kind = c_char), allocatable, target :: longname_temp(:)
+    integer :: longname_i
+    type(c_ptr) :: longname_cptr
+    interface
+      subroutine lib_zaxisDefLongname(zaxisID_dummy, longname) bind(c, name =&
+      & 'zaxisDefLongname')
+        import c_int, c_ptr
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: longname
+      end subroutine lib_zaxisDefLongname
+    end interface
+    if (present(longname)) then
+      allocate(longname_temp(len(longname) + 1))
+      longname_temp(len(longname) + 1) = c_null_char
+      do longname_i = len(longname), 1, -1
+        if(longname(longname_i:longname_i) /= ' ') exit
+        longname_temp(longname_i) = c_null_char
+      end do
+      do longname_i = longname_i, 1, -1
+          longname_temp(longname_i) = longname(longname_i:longname_i)
+      end do
+      longname_cptr = c_loc(longname_temp)
+    else
+      longname_cptr = c_null_ptr
+    end if
+    call lib_zaxisDefLongname(zaxisID_dummy, longname_cptr)
+  end subroutine zaxisDefLongname
+
+  subroutine zaxisInqLongname(zaxisID_dummy, longname_dummy)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), intent(inout) :: longname_dummy
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    interface
+      subroutine lib_zaxisInqLongname(zaxisID_dummy, longname_dummy) bind(c,&
+      & name = 'zaxisInqLongname')
+        import c_char, c_int
+        integer(c_int), value :: zaxisID_dummy
+        character(kind = c_char) :: longname_dummy(*)
+      end subroutine lib_zaxisInqLongname
+    end interface
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    do longname_i = len(longname_dummy), 1, -1
+      if(longname_dummy(longname_i:longname_i) /= ' ') exit
+      longname_temp(longname_i) = c_null_char
+    end do
+    do longname_i = longname_i, 1, -1
+        longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    call lib_zaxisInqLongname(zaxisID_dummy, longname_temp)
+    do longname_i = 1, len(longname_dummy)
+      if(longname_temp(longname_i) == c_null_char) exit
+      longname_dummy(longname_i:longname_i) = longname_temp(longname_i)
+    end do
+    do longname_i = longname_i, len(longname_dummy)
+      longname_dummy(longname_i:longname_i) = ' '
+    end do
+  end subroutine zaxisInqLongname
+
+  subroutine zaxisDefUnits(zaxisID_dummy, units)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), optional, intent(in) :: units
+    character(kind = c_char), allocatable, target :: units_temp(:)
+    integer :: units_i
+    type(c_ptr) :: units_cptr
+    interface
+      subroutine lib_zaxisDefUnits(zaxisID_dummy, units) bind(c, name =&
+      & 'zaxisDefUnits')
+        import c_int, c_ptr
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: units
+      end subroutine lib_zaxisDefUnits
+    end interface
+    if (present(units)) then
+      allocate(units_temp(len(units) + 1))
+      units_temp(len(units) + 1) = c_null_char
+      do units_i = len(units), 1, -1
+        if(units(units_i:units_i) /= ' ') exit
+        units_temp(units_i) = c_null_char
+      end do
+      do units_i = units_i, 1, -1
+          units_temp(units_i) = units(units_i:units_i)
+      end do
+      units_cptr = c_loc(units_temp)
+    else
+      units_cptr = c_null_ptr
+    end if
+    call lib_zaxisDefUnits(zaxisID_dummy, units_cptr)
+  end subroutine zaxisDefUnits
+
+  subroutine zaxisInqUnits(zaxisID_dummy, units_dummy)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), intent(inout) :: units_dummy
+    character(kind = c_char) :: units_temp(len(units_dummy) + 1)
+    integer :: units_i
+    interface
+      subroutine lib_zaxisInqUnits(zaxisID_dummy, units_dummy) bind(c, name =&
+      & 'zaxisInqUnits')
+        import c_char, c_int
+        integer(c_int), value :: zaxisID_dummy
+        character(kind = c_char) :: units_dummy(*)
+      end subroutine lib_zaxisInqUnits
+    end interface
+    units_temp(len(units_dummy) + 1) = c_null_char
+    do units_i = len(units_dummy), 1, -1
+      if(units_dummy(units_i:units_i) /= ' ') exit
+      units_temp(units_i) = c_null_char
+    end do
+    do units_i = units_i, 1, -1
+        units_temp(units_i) = units_dummy(units_i:units_i)
+    end do
+    call lib_zaxisInqUnits(zaxisID_dummy, units_temp)
+    do units_i = 1, len(units_dummy)
+      if(units_temp(units_i) == c_null_char) exit
+      units_dummy(units_i:units_i) = units_temp(units_i)
+    end do
+    do units_i = units_i, len(units_dummy)
+      units_dummy(units_i:units_i) = ' '
+    end do
+  end subroutine zaxisInqUnits
+
+  subroutine zaxisInqStdname(zaxisID_dummy, stdname_dummy)
+    integer(c_int), value :: zaxisID_dummy
+    character(kind = c_char, len = *), intent(inout) :: stdname_dummy
+    character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1)
+    integer :: stdname_i
+    interface
+      subroutine lib_zaxisInqStdname(zaxisID_dummy, stdname_dummy) bind(c, name&
+      & = 'zaxisInqStdname')
+        import c_char, c_int
+        integer(c_int), value :: zaxisID_dummy
+        character(kind = c_char) :: stdname_dummy(*)
+      end subroutine lib_zaxisInqStdname
+    end interface
+    stdname_temp(len(stdname_dummy) + 1) = c_null_char
+    do stdname_i = len(stdname_dummy), 1, -1
+      if(stdname_dummy(stdname_i:stdname_i) /= ' ') exit
+      stdname_temp(stdname_i) = c_null_char
+    end do
+    do stdname_i = stdname_i, 1, -1
+        stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i)
+    end do
+    call lib_zaxisInqStdname(zaxisID_dummy, stdname_temp)
+    do stdname_i = 1, len(stdname_dummy)
+      if(stdname_temp(stdname_i) == c_null_char) exit
+      stdname_dummy(stdname_i:stdname_i) = stdname_temp(stdname_i)
+    end do
+    do stdname_i = stdname_i, len(stdname_dummy)
+      stdname_dummy(stdname_i:stdname_i) = ' '
+    end do
+  end subroutine zaxisInqStdname
+
+  function zaxisInqLbounds(zaxisID_dummy, lbounds) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: zaxisID_dummy
+    real(c_double), target, optional, intent(inout) :: lbounds(*)
+    type(c_ptr) :: lbounds_cptr
+    interface
+      function lib_zaxisInqLbounds(zaxisID_dummy, lbounds) bind(c, name =&
+      & 'zaxisInqLbounds') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: lbounds
+      end function lib_zaxisInqLbounds
+    end interface
+    lbounds_cptr = c_null_ptr
+    if(present(lbounds)) lbounds_cptr = c_loc(lbounds)
+    f_result = lib_zaxisInqLbounds(zaxisID_dummy, lbounds_cptr)
+  end function zaxisInqLbounds
+
+  function zaxisInqUbounds(zaxisID_dummy, ubounds) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: zaxisID_dummy
+    real(c_double), target, optional, intent(inout) :: ubounds(*)
+    type(c_ptr) :: ubounds_cptr
+    interface
+      function lib_zaxisInqUbounds(zaxisID_dummy, ubounds) bind(c, name =&
+      & 'zaxisInqUbounds') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: ubounds
+      end function lib_zaxisInqUbounds
+    end interface
+    ubounds_cptr = c_null_ptr
+    if(present(ubounds)) ubounds_cptr = c_loc(ubounds)
+    f_result = lib_zaxisInqUbounds(zaxisID_dummy, ubounds_cptr)
+  end function zaxisInqUbounds
+
+  function zaxisInqWeights(zaxisID_dummy, weights) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: zaxisID_dummy
+    real(c_double), target, optional, intent(inout) :: weights(*)
+    type(c_ptr) :: weights_cptr
+    interface
+      function lib_zaxisInqWeights(zaxisID_dummy, weights) bind(c, name =&
+      & 'zaxisInqWeights') result(c_result)
+        import c_int, c_ptr
+        integer(c_int) :: c_result
+        integer(c_int), value :: zaxisID_dummy
+        type(c_ptr), value :: weights
+      end function lib_zaxisInqWeights
+    end interface
+    weights_cptr = c_null_ptr
+    if(present(weights)) weights_cptr = c_loc(weights)
+    f_result = lib_zaxisInqWeights(zaxisID_dummy, weights_cptr)
+  end function zaxisInqWeights
+
+  function taxisNamePtr(taxisID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: taxisID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_taxisNamePtr(taxisID_dummy) bind(c, name = 'taxisNamePtr')&
+      & result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: taxisID_dummy
+      end function lib_taxisNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_taxisNamePtr(taxisID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function taxisNamePtr
+
+  function tunitNamePtr(tunitID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: tunitID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_tunitNamePtr(tunitID_dummy) bind(c, name = 'tunitNamePtr')&
+      & result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: tunitID_dummy
+      end function lib_tunitNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_tunitNamePtr(tunitID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function tunitNamePtr
+
+  function institutDef(center_dummy, subcenter_dummy, name_dummy,&
+  & longname_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: center_dummy
+    integer(c_int), value :: subcenter_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char, len = *), intent(in) :: longname_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    interface
+      function lib_institutDef(center_dummy, subcenter_dummy, name_dummy,&
+      & longname_dummy) bind(c, name = 'institutDef') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: center_dummy
+        integer(c_int), value :: subcenter_dummy
+        character(kind = c_char) :: name_dummy(*)
+        character(kind = c_char) :: longname_dummy(*)
+      end function lib_institutDef
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do longname_i = 1, len(longname_dummy)
+      longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    f_result = lib_institutDef(center_dummy, subcenter_dummy, name_temp,&
+    & longname_temp)
+  end function institutDef
+
+  function institutInq(center_dummy, subcenter_dummy, name_dummy,&
+  & longname_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: center_dummy
+    integer(c_int), value :: subcenter_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char, len = *), intent(in) :: longname_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    interface
+      function lib_institutInq(center_dummy, subcenter_dummy, name_dummy,&
+      & longname_dummy) bind(c, name = 'institutInq') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: center_dummy
+        integer(c_int), value :: subcenter_dummy
+        character(kind = c_char) :: name_dummy(*)
+        character(kind = c_char) :: longname_dummy(*)
+      end function lib_institutInq
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do longname_i = 1, len(longname_dummy)
+      longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    f_result = lib_institutInq(center_dummy, subcenter_dummy, name_temp,&
+    & longname_temp)
+  end function institutInq
+
+  function institutInqNamePtr(instID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: instID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_institutInqNamePtr(instID_dummy) bind(c, name =&
+      & 'institutInqNamePtr') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: instID_dummy
+      end function lib_institutInqNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_institutInqNamePtr(instID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function institutInqNamePtr
+
+  function institutInqLongnamePtr(instID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: instID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_institutInqLongnamePtr(instID_dummy) bind(c, name =&
+      & 'institutInqLongnamePtr') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: instID_dummy
+      end function lib_institutInqLongnamePtr
+    end interface
+    f_result => null()
+    ptr = lib_institutInqLongnamePtr(instID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function institutInqLongnamePtr
+
+  function modelDef(instID_dummy, modelgribID_dummy, name_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: instID_dummy
+    integer(c_int), value :: modelgribID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_modelDef(instID_dummy, modelgribID_dummy, name_dummy)&
+      & bind(c, name = 'modelDef') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: instID_dummy
+        integer(c_int), value :: modelgribID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_modelDef
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_modelDef(instID_dummy, modelgribID_dummy, name_temp)
+  end function modelDef
+
+  function modelInq(instID_dummy, modelgribID_dummy, name_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: instID_dummy
+    integer(c_int), value :: modelgribID_dummy
+    character(kind = c_char, len = *), intent(in) :: name_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    interface
+      function lib_modelInq(instID_dummy, modelgribID_dummy, name_dummy)&
+      & bind(c, name = 'modelInq') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: instID_dummy
+        integer(c_int), value :: modelgribID_dummy
+        character(kind = c_char) :: name_dummy(*)
+      end function lib_modelInq
+    end interface
+    do name_i = 1, len(name_dummy)
+      name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    name_temp(len(name_dummy) + 1) = c_null_char
+    f_result = lib_modelInq(instID_dummy, modelgribID_dummy, name_temp)
+  end function modelInq
+
+  function modelInqNamePtr(modelID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: modelID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_modelInqNamePtr(modelID_dummy) bind(c, name =&
+      & 'modelInqNamePtr') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: modelID_dummy
+      end function lib_modelInqNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_modelInqNamePtr(modelID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function modelInqNamePtr
+
+  subroutine tableWrite(filename_dummy, tableID_dummy)
+    character(kind = c_char, len = *), intent(in) :: filename_dummy
+    integer(c_int), value :: tableID_dummy
+    character(kind = c_char) :: filename_temp(len(filename_dummy) + 1)
+    integer :: filename_i
+    interface
+      subroutine lib_tableWrite(filename_dummy, tableID_dummy) bind(c, name =&
+      & 'tableWrite')
+        import c_char, c_int
+        character(kind = c_char) :: filename_dummy(*)
+        integer(c_int), value :: tableID_dummy
+      end subroutine lib_tableWrite
+    end interface
+    do filename_i = 1, len(filename_dummy)
+      filename_temp(filename_i) = filename_dummy(filename_i:filename_i)
+    end do
+    filename_temp(len(filename_dummy) + 1) = c_null_char
+    call lib_tableWrite(filename_temp, tableID_dummy)
+  end subroutine tableWrite
+
+  function tableRead(tablefile_dummy) result(f_result)
+    integer(c_int) :: f_result
+    character(kind = c_char, len = *), intent(in) :: tablefile_dummy
+    character(kind = c_char) :: tablefile_temp(len(tablefile_dummy) + 1)
+    integer :: tablefile_i
+    interface
+      function lib_tableRead(tablefile_dummy) bind(c, name = 'tableRead')&
+      & result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        character(kind = c_char) :: tablefile_dummy(*)
+      end function lib_tableRead
+    end interface
+    do tablefile_i = 1, len(tablefile_dummy)
+      tablefile_temp(tablefile_i) = tablefile_dummy(tablefile_i:tablefile_i)
+    end do
+    tablefile_temp(len(tablefile_dummy) + 1) = c_null_char
+    f_result = lib_tableRead(tablefile_temp)
+  end function tableRead
+
+  function tableDef(modelID_dummy, tablenum_dummy, tablename_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: modelID_dummy
+    integer(c_int), value :: tablenum_dummy
+    character(kind = c_char, len = *), intent(in) :: tablename_dummy
+    character(kind = c_char) :: tablename_temp(len(tablename_dummy) + 1)
+    integer :: tablename_i
+    interface
+      function lib_tableDef(modelID_dummy, tablenum_dummy, tablename_dummy)&
+      & bind(c, name = 'tableDef') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: modelID_dummy
+        integer(c_int), value :: tablenum_dummy
+        character(kind = c_char) :: tablename_dummy(*)
+      end function lib_tableDef
+    end interface
+    do tablename_i = 1, len(tablename_dummy)
+      tablename_temp(tablename_i) = tablename_dummy(tablename_i:tablename_i)
+    end do
+    tablename_temp(len(tablename_dummy) + 1) = c_null_char
+    f_result = lib_tableDef(modelID_dummy, tablenum_dummy, tablename_temp)
+  end function tableDef
+
+  function tableInqNamePtr(tableID_dummy) result(f_result)
+    character(kind = c_char), dimension(:), pointer :: f_result
+    integer(c_int), value :: tableID_dummy
+    type(c_ptr) :: ptr
+    integer :: rv_shape(1)
+    interface
+      function lib_tableInqNamePtr(tableID_dummy) bind(c, name =&
+      & 'tableInqNamePtr') result(c_result)
+        import c_int, c_ptr
+        type(c_ptr) :: c_result
+        integer(c_int), value :: tableID_dummy
+      end function lib_tableInqNamePtr
+    end interface
+    f_result => null()
+    ptr = lib_tableInqNamePtr(tableID_dummy)
+    if(c_associated(ptr)) then
+      rv_shape(1) = int(lib_strlen(ptr))
+      call c_f_pointer(ptr, f_result, rv_shape)
+    end if
+  end function tableInqNamePtr
+
+  function tableInq(modelID_dummy, tablenum_dummy, tablename_dummy)&
+  & result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: modelID_dummy
+    integer(c_int), value :: tablenum_dummy
+    character(kind = c_char, len = *), intent(in) :: tablename_dummy
+    character(kind = c_char) :: tablename_temp(len(tablename_dummy) + 1)
+    integer :: tablename_i
+    interface
+      function lib_tableInq(modelID_dummy, tablenum_dummy, tablename_dummy)&
+      & bind(c, name = 'tableInq') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: modelID_dummy
+        integer(c_int), value :: tablenum_dummy
+        character(kind = c_char) :: tablename_dummy(*)
+      end function lib_tableInq
+    end interface
+    do tablename_i = 1, len(tablename_dummy)
+      tablename_temp(tablename_i) = tablename_dummy(tablename_i:tablename_i)
+    end do
+    tablename_temp(len(tablename_dummy) + 1) = c_null_char
+    f_result = lib_tableInq(modelID_dummy, tablenum_dummy, tablename_temp)
+  end function tableInq
+
+  subroutine tableInqEntry(tableID_dummy, id_dummy, ltype_dummy, name_dummy,&
+  & longname_dummy, units_dummy)
+    integer(c_int), value :: tableID_dummy
+    integer(c_int), value :: id_dummy
+    integer(c_int), value :: ltype_dummy
+    character(kind = c_char, len = *), intent(inout) :: name_dummy
+    character(kind = c_char, len = *), intent(inout) :: longname_dummy
+    character(kind = c_char, len = *), intent(inout) :: units_dummy
+    character(kind = c_char) :: name_temp(len(name_dummy) + 1)
+    integer :: name_i
+    character(kind = c_char) :: longname_temp(len(longname_dummy) + 1)
+    integer :: longname_i
+    character(kind = c_char) :: units_temp(len(units_dummy) + 1)
+    integer :: units_i
+    interface
+      subroutine lib_tableInqEntry(tableID_dummy, id_dummy, ltype_dummy,&
+      & name_dummy, longname_dummy, units_dummy) bind(c, name =&
+      & 'tableInqEntry')
+        import c_char, c_int
+        integer(c_int), value :: tableID_dummy
+        integer(c_int), value :: id_dummy
+        integer(c_int), value :: ltype_dummy
+        character(kind = c_char) :: name_dummy(*)
+        character(kind = c_char) :: longname_dummy(*)
+        character(kind = c_char) :: units_dummy(*)
+      end subroutine lib_tableInqEntry
+    end interface
+    name_temp(len(name_dummy) + 1) = c_null_char
+    do name_i = len(name_dummy), 1, -1
+      if(name_dummy(name_i:name_i) /= ' ') exit
+      name_temp(name_i) = c_null_char
+    end do
+    do name_i = name_i, 1, -1
+        name_temp(name_i) = name_dummy(name_i:name_i)
+    end do
+    longname_temp(len(longname_dummy) + 1) = c_null_char
+    do longname_i = len(longname_dummy), 1, -1
+      if(longname_dummy(longname_i:longname_i) /= ' ') exit
+      longname_temp(longname_i) = c_null_char
+    end do
+    do longname_i = longname_i, 1, -1
+        longname_temp(longname_i) = longname_dummy(longname_i:longname_i)
+    end do
+    units_temp(len(units_dummy) + 1) = c_null_char
+    do units_i = len(units_dummy), 1, -1
+      if(units_dummy(units_i:units_i) /= ' ') exit
+      units_temp(units_i) = c_null_char
+    end do
+    do units_i = units_i, 1, -1
+        units_temp(units_i) = units_dummy(units_i:units_i)
+    end do
+    call lib_tableInqEntry(tableID_dummy, id_dummy, ltype_dummy, name_temp,&
+    & longname_temp, units_temp)
+    do name_i = 1, len(name_dummy)
+      if(name_temp(name_i) == c_null_char) exit
+      name_dummy(name_i:name_i) = name_temp(name_i)
+    end do
+    do name_i = name_i, len(name_dummy)
+      name_dummy(name_i:name_i) = ' '
+    end do
+    do longname_i = 1, len(longname_dummy)
+      if(longname_temp(longname_i) == c_null_char) exit
+      longname_dummy(longname_i:longname_i) = longname_temp(longname_i)
+    end do
+    do longname_i = longname_i, len(longname_dummy)
+      longname_dummy(longname_i:longname_i) = ' '
+    end do
+    do units_i = 1, len(units_dummy)
+      if(units_temp(units_i) == c_null_char) exit
+      units_dummy(units_i:units_i) = units_temp(units_i)
+    end do
+    do units_i = units_i, len(units_dummy)
+      units_dummy(units_i:units_i) = ' '
+    end do
+  end subroutine tableInqEntry
+
+  function subtypeInqAttribute(subtypeID_dummy, index_dummy, key_dummy,&
+  & outValue_dummy) result(f_result)
+    integer(c_int) :: f_result
+    integer(c_int), value :: subtypeID_dummy
+    integer(c_int), value :: index_dummy
+    character(kind = c_char, len = *), intent(in) :: key_dummy
+    integer(c_int), intent(inout) :: outValue_dummy
+    character(kind = c_char) :: key_temp(len(key_dummy) + 1)
+    integer :: key_i
+    interface
+      function lib_subtypeInqAttribute(subtypeID_dummy, index_dummy, key_dummy,&
+      & outValue_dummy) bind(c, name = 'subtypeInqAttribute') result(c_result)
+        import c_char, c_int
+        integer(c_int) :: c_result
+        integer(c_int), value :: subtypeID_dummy
+        integer(c_int), value :: index_dummy
+        character(kind = c_char) :: key_dummy(*)
+        integer(c_int), intent(inout) :: outValue_dummy
+      end function lib_subtypeInqAttribute
+    end interface
+    do key_i = 1, len(key_dummy)
+      key_temp(key_i) = key_dummy(key_i:key_i)
+    end do
+    key_temp(len(key_dummy) + 1) = c_null_char
+    f_result = lib_subtypeInqAttribute(subtypeID_dummy, index_dummy, key_temp,&
+    & outValue_dummy)
+  end function subtypeInqAttribute
+
+  subroutine cdf_def_var_filter(ncid_dummy, ncvarID_dummy, filterSpec_dummy)
+    integer(c_int), value :: ncid_dummy
+    integer(c_int), value :: ncvarID_dummy
+    character(kind = c_char, len = *), intent(in) :: filterSpec_dummy
+    character(kind = c_char) :: filterSpec_temp(len(filterSpec_dummy) + 1)
+    integer :: filterSpec_i
+    interface
+      subroutine lib_cdf_def_var_filter(ncid_dummy, ncvarID_dummy,&
+      & filterSpec_dummy) bind(c, name = 'cdf_def_var_filter')
+        import c_char, c_int
+        integer(c_int), value :: ncid_dummy
+        integer(c_int), value :: ncvarID_dummy
+        character(kind = c_char) :: filterSpec_dummy(*)
+      end subroutine lib_cdf_def_var_filter
+    end interface
+    do filterSpec_i = 1, len(filterSpec_dummy)
+      filterSpec_temp(filterSpec_i) =&
+      & filterSpec_dummy(filterSpec_i:filterSpec_i)
+    end do
+    filterSpec_temp(len(filterSpec_dummy) + 1) = c_null_char
+    call lib_cdf_def_var_filter(ncid_dummy, ncvarID_dummy, filterSpec_temp)
+  end subroutine cdf_def_var_filter
+
+end module mo_cdi
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 000000000..24a83d314
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,1678 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = calendar_test1$(EXEEXT) cksum_verify$(EXEEXT) pio_write.run \
+	pio_write_deco2d.run test_byteswap.run test_cdf_const.run \
+	test_cdf_transformation.run test_cksum_ext.run \
+	test_cksum_grb.run test_cksum_grb2.run test_cksum_ieg.run \
+	test_cksum_nc.run test_cksum_nc2.run test_cksum_nc4.run \
+	test_cksum_nc_chunk.run test_cksum_srv.run test_f2003.run \
+	test_grib.run test_month_adjust$(EXEEXT) \
+	test_resource_copy.run test_table.run pio_cksum_asynch.run \
+	pio_cksum_fpguard.run pio_cksum_grb2.run \
+	pio_cksum_mpi_fw_at_all.run pio_cksum_mpi_fw_at_reblock.run \
+	pio_cksum_mpi_fw_ordered.run pio_cksum_mpinonb.run \
+	pio_cksum_nc.run pio_cksum_nc2.run pio_cksum_nc4.run \
+	pio_cksum_writer.run pio_write.parallel.run \
+	pio_write_deco2d.parallel.run pio_write_dist_array.run \
+	test_resource_copy.parallel.run
+@ENABLE_NETCDF_TRUE@am__append_1 = \
+@ENABLE_NETCDF_TRUE@  test_cdf_read \
+@ENABLE_NETCDF_TRUE@  test_cdf_write
+
+@ENABLE_MPI_TRUE@am__append_2 = \
+@ENABLE_MPI_TRUE@  pio_write.parallel \
+@ENABLE_MPI_TRUE@  pio_write_deco2d.parallel \
+@ENABLE_MPI_TRUE@  test_resource_copy.parallel
+
+@with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_3)
+@with_on_demand_check_programs_FALSE@noinst_PROGRAMS =  \
+@with_on_demand_check_programs_FALSE@	$(am__EXEEXT_3)
+@ENABLE_ALL_STATIC_TRUE@am__append_3 = -all-static
+subdir = tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps =  \
+	$(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \
+	$(top_srcdir)/m4/acx_c_package.m4 \
+	$(top_srcdir)/m4/acx_cfortran_flags.m4 \
+	$(top_srcdir)/m4/acx_check_cfortran.m4 \
+	$(top_srcdir)/m4/acx_check_strptr_convert.m4 \
+	$(top_srcdir)/m4/acx_execinfo.m4 \
+	$(top_srcdir)/m4/acx_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_fortran_include_flag.m4 \
+	$(top_srcdir)/m4/acx_fortran_package.m4 \
+	$(top_srcdir)/m4/acx_lang_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_package.m4 \
+	$(top_srcdir)/m4/acx_lt_problems.m4 \
+	$(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \
+	$(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \
+	$(top_srcdir)/m4/acx_option_search_libs.m4 \
+	$(top_srcdir)/m4/acx_options.m4 \
+	$(top_srcdir)/m4/acx_prog_cc_posix.m4 \
+	$(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \
+	$(top_srcdir)/m4/acx_sl_mod_suffix.m4 \
+	$(top_srcdir)/m4/acx_tls_xlc_retry.m4 \
+	$(top_srcdir)/m4/acx_use_libtool_configuration.m4 \
+	$(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \
+	$(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \
+	$(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \
+	$(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/m4/ac_lang_program_fortran.m4 \
+	$(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \
+	$(top_srcdir)/m4/acx_lang_c_check_include.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = test_cksum_base pio_cksum_asynch.run \
+	pio_cksum_fpguard.run pio_cksum_grb2.run \
+	pio_cksum_mpi_fw_at_all.run pio_cksum_mpi_fw_at_reblock.run \
+	pio_cksum_mpi_fw_ordered.run pio_cksum_mpinonb.run \
+	pio_cksum_nc.run pio_cksum_nc2.run pio_cksum_nc4.run \
+	pio_cksum_writer.run pio_write.parallel.run pio_write.run \
+	pio_write_deco2d.parallel.run pio_write_deco2d.run \
+	pio_write_dist_array.run test_byteswap.run test_cdf_const.run \
+	test_cdf_transformation.run test_cksum_ext.run \
+	test_cksum_grb.run test_cksum_grb2.run test_cksum_ieg.run \
+	test_cksum_nc.run test_cksum_nc2.run test_cksum_nc4.run \
+	test_cksum_nc_chunk.run test_cksum_srv.run test_f2003.run \
+	test_grib.run test_resource_copy.parallel.run \
+	test_resource_copy.run test_table.run
+CONFIG_CLEAN_VPATH_FILES =
+@ENABLE_NETCDF_TRUE@am__EXEEXT_1 = test_cdf_read$(EXEEXT) \
+@ENABLE_NETCDF_TRUE@	test_cdf_write$(EXEEXT)
+@ENABLE_MPI_TRUE@am__EXEEXT_2 = pio_write.parallel$(EXEEXT) \
+@ENABLE_MPI_TRUE@	pio_write_deco2d.parallel$(EXEEXT) \
+@ENABLE_MPI_TRUE@	test_resource_copy.parallel$(EXEEXT)
+am__EXEEXT_3 = calendar_test1$(EXEEXT) cksum_read$(EXEEXT) \
+	cksum_verify$(EXEEXT) cksum_write$(EXEEXT) \
+	cksum_write_chunk$(EXEEXT) pio_write$(EXEEXT) \
+	pio_write_deco2d$(EXEEXT) test_byteswap$(EXEEXT) \
+	test_grib$(EXEEXT) test_month_adjust$(EXEEXT) \
+	test_resource_copy$(EXEEXT) test_table$(EXEEXT) \
+	$(am__EXEEXT_1) $(am__EXEEXT_2)
+PROGRAMS = $(noinst_PROGRAMS)
+am_calendar_test1_OBJECTS = calendar_test1.$(OBJEXT)
+calendar_test1_OBJECTS = $(am_calendar_test1_OBJECTS)
+calendar_test1_LDADD = $(LDADD)
+calendar_test1_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 =
+am_cksum_read_OBJECTS = cksum_read.$(OBJEXT) \
+	ensure_array_size.$(OBJEXT) stream_cksum.$(OBJEXT) \
+	var_cksum.$(OBJEXT)
+cksum_read_OBJECTS = $(am_cksum_read_OBJECTS)
+cksum_read_LDADD = $(LDADD)
+cksum_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cksum_verify_OBJECTS = cksum_verify.$(OBJEXT)
+cksum_verify_OBJECTS = $(am_cksum_verify_OBJECTS)
+cksum_verify_LDADD = $(LDADD)
+cksum_verify_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cksum_write_OBJECTS = cksum_write.$(OBJEXT) \
+	simple_model_helper.$(OBJEXT)
+cksum_write_OBJECTS = $(am_cksum_write_OBJECTS)
+cksum_write_LDADD = $(LDADD)
+cksum_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_cksum_write_chunk_OBJECTS = cksum_write_chunk.$(OBJEXT) \
+	simple_model_helper.$(OBJEXT)
+cksum_write_chunk_OBJECTS = $(am_cksum_write_chunk_OBJECTS)
+cksum_write_chunk_LDADD = $(LDADD)
+cksum_write_chunk_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_pio_write_OBJECTS = pio_write.$(OBJEXT) \
+	pio_write_setup_grid.$(OBJEXT) simple_model.$(OBJEXT) \
+	simple_model_helper.$(OBJEXT)
+pio_write_OBJECTS = $(am_pio_write_OBJECTS)
+pio_write_LDADD = $(LDADD)
+pio_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am__objects_1 = pio_write.parallel.$(OBJEXT) \
+	pio_write_setup_grid.parallel.$(OBJEXT) \
+	simple_model.parallel.$(OBJEXT) \
+	simple_model_helper.parallel.$(OBJEXT)
+nodist_pio_write_parallel_OBJECTS = $(am__objects_1)
+pio_write_parallel_OBJECTS = $(nodist_pio_write_parallel_OBJECTS)
+am__DEPENDENCIES_1 =
+pio_write_parallel_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(LDADD)
+am_pio_write_deco2d_OBJECTS = deco2d_model.$(OBJEXT) \
+	pio_write.$(OBJEXT) pio_write_setup_grid.$(OBJEXT) \
+	simple_model_helper.$(OBJEXT)
+pio_write_deco2d_OBJECTS = $(am_pio_write_deco2d_OBJECTS)
+pio_write_deco2d_LDADD = $(LDADD)
+pio_write_deco2d_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am__objects_2 = deco2d_model.parallel.$(OBJEXT) \
+	pio_write.parallel.$(OBJEXT) \
+	pio_write_setup_grid.parallel.$(OBJEXT) \
+	simple_model_helper.parallel.$(OBJEXT)
+nodist_pio_write_deco2d_parallel_OBJECTS = $(am__objects_2)
+pio_write_deco2d_parallel_OBJECTS =  \
+	$(nodist_pio_write_deco2d_parallel_OBJECTS)
+pio_write_deco2d_parallel_DEPENDENCIES =  \
+	$(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(LDADD)
+am_test_byteswap_OBJECTS = test_byteswap.$(OBJEXT)
+test_byteswap_OBJECTS = $(am_test_byteswap_OBJECTS)
+test_byteswap_LDADD = $(LDADD)
+test_byteswap_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_test_cdf_read_OBJECTS = test_cdf_read.$(OBJEXT)
+test_cdf_read_OBJECTS = $(am_test_cdf_read_OBJECTS)
+test_cdf_read_LDADD = $(LDADD)
+test_cdf_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_test_cdf_write_OBJECTS = simple_model_helper.$(OBJEXT) \
+	test_cdf_write.$(OBJEXT)
+test_cdf_write_OBJECTS = $(am_test_cdf_write_OBJECTS)
+test_cdf_write_LDADD = $(LDADD)
+test_cdf_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_test_grib_OBJECTS = test_grib.$(OBJEXT)
+test_grib_OBJECTS = $(am_test_grib_OBJECTS)
+test_grib_LDADD = $(LDADD)
+test_grib_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_test_month_adjust_OBJECTS = test_month_adjust.$(OBJEXT)
+test_month_adjust_OBJECTS = $(am_test_month_adjust_OBJECTS)
+test_month_adjust_LDADD = $(LDADD)
+test_month_adjust_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+am_test_resource_copy_OBJECTS = test_resource_copy.$(OBJEXT)
+test_resource_copy_OBJECTS = $(am_test_resource_copy_OBJECTS)
+test_resource_copy_DEPENDENCIES =  \
+	$(top_builddir)/src/libcdiresunpack.la
+am__objects_3 = test_resource_copy.parallel.$(OBJEXT)
+nodist_test_resource_copy_parallel_OBJECTS = $(am__objects_3)
+test_resource_copy_parallel_OBJECTS =  \
+	$(nodist_test_resource_copy_parallel_OBJECTS)
+test_resource_copy_parallel_DEPENDENCIES =  \
+	$(top_builddir)/src/libcdipio.la $(LDADD)
+am_test_table_OBJECTS = test_table.$(OBJEXT)
+test_table_OBJECTS = $(am_test_table_OBJECTS)
+test_table_LDADD = $(LDADD)
+test_table_DEPENDENCIES = $(top_builddir)/src/libcdi.la
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/config/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/calendar_test1.Po \
+	./$(DEPDIR)/cksum_read.Po ./$(DEPDIR)/cksum_verify.Po \
+	./$(DEPDIR)/cksum_write.Po ./$(DEPDIR)/cksum_write_chunk.Po \
+	./$(DEPDIR)/deco2d_model.Po \
+	./$(DEPDIR)/deco2d_model.parallel.Po \
+	./$(DEPDIR)/ensure_array_size.Po ./$(DEPDIR)/pio_write.Po \
+	./$(DEPDIR)/pio_write.parallel.Po \
+	./$(DEPDIR)/pio_write_setup_grid.Po \
+	./$(DEPDIR)/pio_write_setup_grid.parallel.Po \
+	./$(DEPDIR)/simple_model.Po \
+	./$(DEPDIR)/simple_model.parallel.Po \
+	./$(DEPDIR)/simple_model_helper.Po \
+	./$(DEPDIR)/simple_model_helper.parallel.Po \
+	./$(DEPDIR)/stream_cksum.Po ./$(DEPDIR)/test_byteswap.Po \
+	./$(DEPDIR)/test_cdf_read.Po ./$(DEPDIR)/test_cdf_write.Po \
+	./$(DEPDIR)/test_grib.Po ./$(DEPDIR)/test_month_adjust.Po \
+	./$(DEPDIR)/test_resource_copy.Po \
+	./$(DEPDIR)/test_resource_copy.parallel.Po \
+	./$(DEPDIR)/test_table.Po ./$(DEPDIR)/var_cksum.Po
+am__mv = mv -f
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 =
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 =
+SOURCES = $(calendar_test1_SOURCES) $(cksum_read_SOURCES) \
+	$(cksum_verify_SOURCES) $(cksum_write_SOURCES) \
+	$(cksum_write_chunk_SOURCES) $(pio_write_SOURCES) \
+	$(nodist_pio_write_parallel_SOURCES) \
+	$(pio_write_deco2d_SOURCES) \
+	$(nodist_pio_write_deco2d_parallel_SOURCES) \
+	$(test_byteswap_SOURCES) $(test_cdf_read_SOURCES) \
+	$(test_cdf_write_SOURCES) $(test_grib_SOURCES) \
+	$(test_month_adjust_SOURCES) $(test_resource_copy_SOURCES) \
+	$(nodist_test_resource_copy_parallel_SOURCES) \
+	$(test_table_SOURCES)
+DIST_SOURCES = $(calendar_test1_SOURCES) $(cksum_read_SOURCES) \
+	$(cksum_verify_SOURCES) $(cksum_write_SOURCES) \
+	$(cksum_write_chunk_SOURCES) $(pio_write_SOURCES) \
+	$(pio_write_deco2d_SOURCES) $(test_byteswap_SOURCES) \
+	$(test_cdf_read_SOURCES) $(test_cdf_write_SOURCES) \
+	$(test_grib_SOURCES) $(test_month_adjust_SOURCES) \
+	$(test_resource_copy_SOURCES) $(test_table_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__extra_recursive_targets = examples-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.run.log=.log)
+RUN_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
+RUN_LOG_COMPILE = $(RUN_LOG_COMPILER) $(AM_RUN_LOG_FLAGS) \
+	$(RUN_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+	$(srcdir)/pio_cksum_asynch.run.in \
+	$(srcdir)/pio_cksum_fpguard.run.in \
+	$(srcdir)/pio_cksum_grb2.run.in \
+	$(srcdir)/pio_cksum_mpi_fw_at_all.run.in \
+	$(srcdir)/pio_cksum_mpi_fw_at_reblock.run.in \
+	$(srcdir)/pio_cksum_mpi_fw_ordered.run.in \
+	$(srcdir)/pio_cksum_mpinonb.run.in \
+	$(srcdir)/pio_cksum_nc.run.in $(srcdir)/pio_cksum_nc2.run.in \
+	$(srcdir)/pio_cksum_nc4.run.in \
+	$(srcdir)/pio_cksum_writer.run.in \
+	$(srcdir)/pio_write.parallel.run.in $(srcdir)/pio_write.run.in \
+	$(srcdir)/pio_write_deco2d.parallel.run.in \
+	$(srcdir)/pio_write_deco2d.run.in \
+	$(srcdir)/pio_write_dist_array.run.in \
+	$(srcdir)/test_byteswap.run.in $(srcdir)/test_cdf_const.run.in \
+	$(srcdir)/test_cdf_transformation.run.in \
+	$(srcdir)/test_cksum_base.in $(srcdir)/test_cksum_ext.run.in \
+	$(srcdir)/test_cksum_grb.run.in \
+	$(srcdir)/test_cksum_grb2.run.in \
+	$(srcdir)/test_cksum_ieg.run.in $(srcdir)/test_cksum_nc.run.in \
+	$(srcdir)/test_cksum_nc2.run.in \
+	$(srcdir)/test_cksum_nc4.run.in \
+	$(srcdir)/test_cksum_nc_chunk.run.in \
+	$(srcdir)/test_cksum_srv.run.in $(srcdir)/test_f2003.run.in \
+	$(srcdir)/test_grib.run.in \
+	$(srcdir)/test_resource_copy.parallel.run.in \
+	$(srcdir)/test_resource_copy.run.in \
+	$(srcdir)/test_table.run.in $(top_srcdir)/config/depcomp \
+	$(top_srcdir)/config/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DCE_UUIDROOT = @DCE_UUIDROOT@
+DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@
+DCE_UUID_C_LIB = @DCE_UUID_C_LIB@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECCODES_INCLUDE = @ECCODES_INCLUDE@
+ECCODES_LIBS = @ECCODES_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_ACROSS = @ENABLE_ACROSS@
+ENABLE_CDI_LIB = @ENABLE_CDI_LIB@
+ENABLE_CGRIBEX = @ENABLE_CGRIBEX@
+ENABLE_EXTRA = @ENABLE_EXTRA@
+ENABLE_GRIB = @ENABLE_GRIB@
+ENABLE_IEG = @ENABLE_IEG@
+ENABLE_MPI = @ENABLE_MPI@
+ENABLE_NC2 = @ENABLE_NC2@
+ENABLE_NC4 = @ENABLE_NC4@
+ENABLE_NC4HDF5 = @ENABLE_NC4HDF5@
+ENABLE_NC4SZLIB = @ENABLE_NC4SZLIB@
+ENABLE_NETCDF = @ENABLE_NETCDF@
+ENABLE_SERVICE = @ENABLE_SERVICE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCMODCASE = @FCMODCASE@
+FCMODEXT = @FCMODEXT@
+FC_DEFINE = @FC_DEFINE@
+FC_MOD_FLAG = @FC_MOD_FLAG@
+FC_OPTINC = @FC_OPTINC@
+FDB5_INCLUDE = @FDB5_INCLUDE@
+FDB5_LIBS = @FDB5_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBRT = @LIBRT@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPIROOT = @MPIROOT@
+MPI_C_INCLUDE = @MPI_C_INCLUDE@
+MPI_C_LIB = @MPI_C_LIB@
+MPI_FC_LIB = @MPI_FC_LIB@
+MPI_FC_MOD = @MPI_FC_MOD@
+MPI_LAUNCH = @MPI_LAUNCH@
+NC_CONFIG = @NC_CONFIG@
+NETCDF_INCLUDE = @NETCDF_INCLUDE@
+NETCDF_LIBS = @NETCDF_LIBS@
+NETCDF_ROOT = @NETCDF_ROOT@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OPENMP_CFLAGS = @OPENMP_CFLAGS@
+OSSP_UUIDROOT = @OSSP_UUIDROOT@
+OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@
+OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@
+PPM_CORE_C_LIB = @PPM_CORE_C_LIB@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_CXX = @PTHREAD_CXX@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@
+PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@
+PYTHON_LIBS = @PYTHON_LIBS@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_SITE_PKG = @PYTHON_SITE_PKG@
+PYTHON_VERSION = @PYTHON_VERSION@
+RANLIB = @RANLIB@
+RUBY = @RUBY@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+SWIG = @SWIG@
+SYSTEM_TYPE = @SYSTEM_TYPE@
+SZLIB_INCLUDE = @SZLIB_INCLUDE@
+SZLIB_LIBS = @SZLIB_LIBS@
+THREADS_INCLUDE = @THREADS_INCLUDE@
+THREADS_LIBS = @THREADS_LIBS@
+UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@
+UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@
+UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@
+UUID_C_INCLUDE = @UUID_C_INCLUDE@
+UUID_C_LIB = @UUID_C_LIB@
+VERSION = @VERSION@
+YAXT_C_INCLUDE = @YAXT_C_INCLUDE@
+YAXT_C_LIB = @YAXT_C_LIB@
+YAXT_FC_LIB = @YAXT_FC_LIB@
+YAXT_FC_MOD = @YAXT_FC_MOD@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+TEST_EXTENSIONS = @EXEEXT@ .run
+
+# Update test_cksum_base before running tests that source it:
+test_cksum_TEST_LOGS_ = \
+  test_cksum_ext.log \
+  test_cksum_grb.log \
+  test_cksum_grb2.log \
+  test_cksum_ieg.log \
+  test_cksum_nc.log \
+  test_cksum_nc2.log \
+  test_cksum_nc4.log \
+  test_cksum_srv.log
+
+
+# Update pio_write_dist_array.run before running tests that source it:
+pio_write_dist_array_TEST_LOGS_ = \
+  pio_cksum_asynch.log \
+  pio_cksum_fpguard.log \
+  pio_cksum_grb2.log \
+  pio_cksum_mpi_fw_at_all.log \
+  pio_cksum_mpi_fw_at_reblock.log \
+  pio_cksum_mpi_fw_ordered.log \
+  pio_cksum_mpinonb.log \
+  pio_cksum_nc.log \
+  pio_cksum_nc2.log \
+  pio_cksum_nc4.log \
+  pio_cksum_writer.log
+
+
+# Update pio_write.run before running tests that source it:
+pio_write_TEST_LOGS_ = \
+  $(pio_write_dist_array_TEST_LOGS_) \
+  pio_write.parallel.log \
+  pio_write_deco2d.log \
+  pio_write_deco2d.parallel.log \
+  pio_write_dist_array.log
+
+test_PROGRAMS_ = calendar_test1 cksum_read cksum_verify cksum_write \
+	cksum_write_chunk pio_write pio_write_deco2d test_byteswap \
+	test_grib test_month_adjust test_resource_copy test_table \
+	$(am__append_1) $(am__append_2)
+AM_CPPFLAGS = -I$(top_srcdir)/src
+
+# Avoid compiling twice by running Libtool with '-static'
+#   This is safe because all Libtool libraries in this directory are
+#   static-only and contain PIC objects:
+AM_CFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) \
+	-static
+AM_LDFLAGS = $(am__append_3)
+LDADD = $(top_builddir)/src/libcdi.la
+calendar_test1_SOURCES = calendar_test1.c
+cksum_read_SOURCES = \
+  cksum_read.c \
+  ensure_array_size.c \
+  ensure_array_size.h \
+  stream_cksum.c \
+  stream_cksum.h \
+  var_cksum.c \
+  var_cksum.h
+
+cksum_verify_SOURCES = cksum_verify.c
+cksum_write_SOURCES = \
+  cksum_write.c \
+  simple_model_helper.c \
+  simple_model_helper.h
+
+cksum_write_chunk_SOURCES = \
+  cksum_write_chunk.c \
+  simple_model_helper.c \
+  simple_model_helper.h
+
+pio_write_SOURCES = \
+  pio_write.c \
+  pio_write.h \
+  pio_write_setup_grid.c \
+  pio_write_setup_grid.h \
+  simple_model.c \
+  simple_model_helper.c \
+  simple_model_helper.h
+
+nodist_pio_write_parallel_SOURCES = $(pio_write_SOURCES:.c=.parallel.c)
+pio_write_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD)
+pio_write_deco2d_SOURCES = \
+  deco2d_model.c \
+  pio_write.c \
+  pio_write.h \
+  pio_write_setup_grid.c \
+  pio_write_setup_grid.h \
+  simple_model_helper.c \
+  simple_model_helper.h
+
+nodist_pio_write_deco2d_parallel_SOURCES = $(pio_write_deco2d_SOURCES:.c=.parallel.c)
+pio_write_deco2d_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD)
+test_byteswap_SOURCES = test_byteswap.c
+test_grib_SOURCES = test_grib.c
+test_month_adjust_SOURCES = test_month_adjust.c
+test_resource_copy_SOURCES = test_resource_copy.c
+test_resource_copy_LDADD = $(top_builddir)/src/libcdiresunpack.la
+nodist_test_resource_copy_parallel_SOURCES = $(test_resource_copy_SOURCES:.c=.parallel.c)
+test_resource_copy_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(LDADD)
+test_table_SOURCES = test_table.c
+test_cdf_read_SOURCES = test_cdf_read.c
+test_cdf_write_SOURCES = \
+  simple_model_helper.c \
+  simple_model_helper.h \
+  test_cdf_write.c
+
+AUTOMAKE_OPTIONS = color-tests
+
+# Compile programs using Libtool:
+COMPILE = $(LTCOMPILE)
+FCCOMPILE = $(LTFCCOMPILE)
+PPFCCOMPILE = $(LTPPFCCOMPILE)
+CXXCOMPILE = $(LTCXXCOMPILE)
+
+# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler
+# and might not be compatible with the Fortran compiler:
+LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+        $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
+
+AM_FCFLAGS = -static
+AM_CXXFLAGS = -static
+
+# Generate source files for parallel versions of the programs. We do this to
+# avoid target-specific flags, which result into rules that do not use the
+# compilation commands above.
+SUFFIXES = .parallel.c
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .parallel.c .c .lo .log .o .obj .run .run$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tests/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+test_cksum_base: $(top_builddir)/config.status $(srcdir)/test_cksum_base.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_asynch.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_asynch.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_fpguard.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_fpguard.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_grb2.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_grb2.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_mpi_fw_at_all.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_at_all.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_mpi_fw_at_reblock.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_at_reblock.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_mpi_fw_ordered.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_ordered.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_mpinonb.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpinonb.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_nc.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_nc2.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc2.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_nc4.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc4.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_cksum_writer.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_writer.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_write.parallel.run: $(top_builddir)/config.status $(srcdir)/pio_write.parallel.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_write.run: $(top_builddir)/config.status $(srcdir)/pio_write.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_write_deco2d.parallel.run: $(top_builddir)/config.status $(srcdir)/pio_write_deco2d.parallel.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_write_deco2d.run: $(top_builddir)/config.status $(srcdir)/pio_write_deco2d.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+pio_write_dist_array.run: $(top_builddir)/config.status $(srcdir)/pio_write_dist_array.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_byteswap.run: $(top_builddir)/config.status $(srcdir)/test_byteswap.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cdf_const.run: $(top_builddir)/config.status $(srcdir)/test_cdf_const.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cdf_transformation.run: $(top_builddir)/config.status $(srcdir)/test_cdf_transformation.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_ext.run: $(top_builddir)/config.status $(srcdir)/test_cksum_ext.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_grb.run: $(top_builddir)/config.status $(srcdir)/test_cksum_grb.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_grb2.run: $(top_builddir)/config.status $(srcdir)/test_cksum_grb2.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_ieg.run: $(top_builddir)/config.status $(srcdir)/test_cksum_ieg.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_nc.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_nc2.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc2.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_nc4.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc4.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_nc_chunk.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc_chunk.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_cksum_srv.run: $(top_builddir)/config.status $(srcdir)/test_cksum_srv.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_f2003.run: $(top_builddir)/config.status $(srcdir)/test_f2003.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_grib.run: $(top_builddir)/config.status $(srcdir)/test_grib.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_resource_copy.parallel.run: $(top_builddir)/config.status $(srcdir)/test_resource_copy.parallel.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_resource_copy.run: $(top_builddir)/config.status $(srcdir)/test_resource_copy.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_table.run: $(top_builddir)/config.status $(srcdir)/test_table.run.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+calendar_test1$(EXEEXT): $(calendar_test1_OBJECTS) $(calendar_test1_DEPENDENCIES) $(EXTRA_calendar_test1_DEPENDENCIES)
+	@rm -f calendar_test1$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(calendar_test1_OBJECTS) $(calendar_test1_LDADD) $(LIBS)
+
+cksum_read$(EXEEXT): $(cksum_read_OBJECTS) $(cksum_read_DEPENDENCIES) $(EXTRA_cksum_read_DEPENDENCIES)
+	@rm -f cksum_read$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cksum_read_OBJECTS) $(cksum_read_LDADD) $(LIBS)
+
+cksum_verify$(EXEEXT): $(cksum_verify_OBJECTS) $(cksum_verify_DEPENDENCIES) $(EXTRA_cksum_verify_DEPENDENCIES)
+	@rm -f cksum_verify$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cksum_verify_OBJECTS) $(cksum_verify_LDADD) $(LIBS)
+
+cksum_write$(EXEEXT): $(cksum_write_OBJECTS) $(cksum_write_DEPENDENCIES) $(EXTRA_cksum_write_DEPENDENCIES)
+	@rm -f cksum_write$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cksum_write_OBJECTS) $(cksum_write_LDADD) $(LIBS)
+
+cksum_write_chunk$(EXEEXT): $(cksum_write_chunk_OBJECTS) $(cksum_write_chunk_DEPENDENCIES) $(EXTRA_cksum_write_chunk_DEPENDENCIES)
+	@rm -f cksum_write_chunk$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cksum_write_chunk_OBJECTS) $(cksum_write_chunk_LDADD) $(LIBS)
+
+pio_write$(EXEEXT): $(pio_write_OBJECTS) $(pio_write_DEPENDENCIES) $(EXTRA_pio_write_DEPENDENCIES)
+	@rm -f pio_write$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(pio_write_OBJECTS) $(pio_write_LDADD) $(LIBS)
+
+pio_write.parallel$(EXEEXT): $(pio_write_parallel_OBJECTS) $(pio_write_parallel_DEPENDENCIES) $(EXTRA_pio_write_parallel_DEPENDENCIES)
+	@rm -f pio_write.parallel$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(pio_write_parallel_OBJECTS) $(pio_write_parallel_LDADD) $(LIBS)
+
+pio_write_deco2d$(EXEEXT): $(pio_write_deco2d_OBJECTS) $(pio_write_deco2d_DEPENDENCIES) $(EXTRA_pio_write_deco2d_DEPENDENCIES)
+	@rm -f pio_write_deco2d$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(pio_write_deco2d_OBJECTS) $(pio_write_deco2d_LDADD) $(LIBS)
+
+pio_write_deco2d.parallel$(EXEEXT): $(pio_write_deco2d_parallel_OBJECTS) $(pio_write_deco2d_parallel_DEPENDENCIES) $(EXTRA_pio_write_deco2d_parallel_DEPENDENCIES)
+	@rm -f pio_write_deco2d.parallel$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(pio_write_deco2d_parallel_OBJECTS) $(pio_write_deco2d_parallel_LDADD) $(LIBS)
+
+test_byteswap$(EXEEXT): $(test_byteswap_OBJECTS) $(test_byteswap_DEPENDENCIES) $(EXTRA_test_byteswap_DEPENDENCIES)
+	@rm -f test_byteswap$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_byteswap_OBJECTS) $(test_byteswap_LDADD) $(LIBS)
+
+test_cdf_read$(EXEEXT): $(test_cdf_read_OBJECTS) $(test_cdf_read_DEPENDENCIES) $(EXTRA_test_cdf_read_DEPENDENCIES)
+	@rm -f test_cdf_read$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_cdf_read_OBJECTS) $(test_cdf_read_LDADD) $(LIBS)
+
+test_cdf_write$(EXEEXT): $(test_cdf_write_OBJECTS) $(test_cdf_write_DEPENDENCIES) $(EXTRA_test_cdf_write_DEPENDENCIES)
+	@rm -f test_cdf_write$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_cdf_write_OBJECTS) $(test_cdf_write_LDADD) $(LIBS)
+
+test_grib$(EXEEXT): $(test_grib_OBJECTS) $(test_grib_DEPENDENCIES) $(EXTRA_test_grib_DEPENDENCIES)
+	@rm -f test_grib$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_grib_OBJECTS) $(test_grib_LDADD) $(LIBS)
+
+test_month_adjust$(EXEEXT): $(test_month_adjust_OBJECTS) $(test_month_adjust_DEPENDENCIES) $(EXTRA_test_month_adjust_DEPENDENCIES)
+	@rm -f test_month_adjust$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_month_adjust_OBJECTS) $(test_month_adjust_LDADD) $(LIBS)
+
+test_resource_copy$(EXEEXT): $(test_resource_copy_OBJECTS) $(test_resource_copy_DEPENDENCIES) $(EXTRA_test_resource_copy_DEPENDENCIES)
+	@rm -f test_resource_copy$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_resource_copy_OBJECTS) $(test_resource_copy_LDADD) $(LIBS)
+
+test_resource_copy.parallel$(EXEEXT): $(test_resource_copy_parallel_OBJECTS) $(test_resource_copy_parallel_DEPENDENCIES) $(EXTRA_test_resource_copy_parallel_DEPENDENCIES)
+	@rm -f test_resource_copy.parallel$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_resource_copy_parallel_OBJECTS) $(test_resource_copy_parallel_LDADD) $(LIBS)
+
+test_table$(EXEEXT): $(test_table_OBJECTS) $(test_table_DEPENDENCIES) $(EXTRA_test_table_DEPENDENCIES)
+	@rm -f test_table$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_table_OBJECTS) $(test_table_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calendar_test1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_verify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_write_chunk.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deco2d_model.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deco2d_model.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ensure_array_size.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write_setup_grid.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write_setup_grid.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model_helper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model_helper.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cksum.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_byteswap.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cdf_read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cdf_write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_grib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_month_adjust.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_resource_copy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_resource_copy.parallel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_table.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/var_cksum.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+examples-local:
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+	@list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
+	@list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+	exit $$?;
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+calendar_test1.log: calendar_test1$(EXEEXT)
+	@p='calendar_test1$(EXEEXT)'; \
+	b='calendar_test1'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cksum_verify.log: cksum_verify$(EXEEXT)
+	@p='cksum_verify$(EXEEXT)'; \
+	b='cksum_verify'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_month_adjust.log: test_month_adjust$(EXEEXT)
+	@p='test_month_adjust$(EXEEXT)'; \
+	b='test_month_adjust'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.run.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.run$(EXEEXT).log:
+@am__EXEEXT_TRUE@	@p='$<'; \
+@am__EXEEXT_TRUE@	$(am__set_b); \
+@am__EXEEXT_TRUE@	$(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \
+@am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
+	clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/calendar_test1.Po
+	-rm -f ./$(DEPDIR)/cksum_read.Po
+	-rm -f ./$(DEPDIR)/cksum_verify.Po
+	-rm -f ./$(DEPDIR)/cksum_write.Po
+	-rm -f ./$(DEPDIR)/cksum_write_chunk.Po
+	-rm -f ./$(DEPDIR)/deco2d_model.Po
+	-rm -f ./$(DEPDIR)/deco2d_model.parallel.Po
+	-rm -f ./$(DEPDIR)/ensure_array_size.Po
+	-rm -f ./$(DEPDIR)/pio_write.Po
+	-rm -f ./$(DEPDIR)/pio_write.parallel.Po
+	-rm -f ./$(DEPDIR)/pio_write_setup_grid.Po
+	-rm -f ./$(DEPDIR)/pio_write_setup_grid.parallel.Po
+	-rm -f ./$(DEPDIR)/simple_model.Po
+	-rm -f ./$(DEPDIR)/simple_model.parallel.Po
+	-rm -f ./$(DEPDIR)/simple_model_helper.Po
+	-rm -f ./$(DEPDIR)/simple_model_helper.parallel.Po
+	-rm -f ./$(DEPDIR)/stream_cksum.Po
+	-rm -f ./$(DEPDIR)/test_byteswap.Po
+	-rm -f ./$(DEPDIR)/test_cdf_read.Po
+	-rm -f ./$(DEPDIR)/test_cdf_write.Po
+	-rm -f ./$(DEPDIR)/test_grib.Po
+	-rm -f ./$(DEPDIR)/test_month_adjust.Po
+	-rm -f ./$(DEPDIR)/test_resource_copy.Po
+	-rm -f ./$(DEPDIR)/test_resource_copy.parallel.Po
+	-rm -f ./$(DEPDIR)/test_table.Po
+	-rm -f ./$(DEPDIR)/var_cksum.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+examples: examples-am
+
+examples-am: examples-local
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/calendar_test1.Po
+	-rm -f ./$(DEPDIR)/cksum_read.Po
+	-rm -f ./$(DEPDIR)/cksum_verify.Po
+	-rm -f ./$(DEPDIR)/cksum_write.Po
+	-rm -f ./$(DEPDIR)/cksum_write_chunk.Po
+	-rm -f ./$(DEPDIR)/deco2d_model.Po
+	-rm -f ./$(DEPDIR)/deco2d_model.parallel.Po
+	-rm -f ./$(DEPDIR)/ensure_array_size.Po
+	-rm -f ./$(DEPDIR)/pio_write.Po
+	-rm -f ./$(DEPDIR)/pio_write.parallel.Po
+	-rm -f ./$(DEPDIR)/pio_write_setup_grid.Po
+	-rm -f ./$(DEPDIR)/pio_write_setup_grid.parallel.Po
+	-rm -f ./$(DEPDIR)/simple_model.Po
+	-rm -f ./$(DEPDIR)/simple_model.parallel.Po
+	-rm -f ./$(DEPDIR)/simple_model_helper.Po
+	-rm -f ./$(DEPDIR)/simple_model_helper.parallel.Po
+	-rm -f ./$(DEPDIR)/stream_cksum.Po
+	-rm -f ./$(DEPDIR)/test_byteswap.Po
+	-rm -f ./$(DEPDIR)/test_cdf_read.Po
+	-rm -f ./$(DEPDIR)/test_cdf_write.Po
+	-rm -f ./$(DEPDIR)/test_grib.Po
+	-rm -f ./$(DEPDIR)/test_month_adjust.Po
+	-rm -f ./$(DEPDIR)/test_resource_copy.Po
+	-rm -f ./$(DEPDIR)/test_resource_copy.parallel.Po
+	-rm -f ./$(DEPDIR)/test_table.Po
+	-rm -f ./$(DEPDIR)/var_cksum.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+	check-am clean clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-local clean-noinstPROGRAMS cscopelist-am ctags ctags-am \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am \
+	examples-am examples-local html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+	uninstall-am
+
+.PRECIOUS: Makefile
+
+$(test_cksum_TEST_LOGS_): test_cksum_base
+$(pio_write_dist_array_TEST_LOGS_): pio_write_dist_array.run
+$(pio_write_TEST_LOGS_): pio_write.run
+
+@with_concurrent_mpi_checks_FALSE@pio_cksum_fpguard.log: pio_cksum_asynch.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_grb2.log: pio_cksum_fpguard.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_at_all.log: pio_cksum_grb2.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_at_reblock.log: pio_cksum_mpi_fw_at_all.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_ordered.log: pio_cksum_mpi_fw_at_reblock.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_mpinonb.log: pio_cksum_mpi_fw_ordered.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_nc.log: pio_cksum_mpinonb.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_nc2.log: pio_cksum_nc.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_nc4.log: pio_cksum_nc2.log
+@with_concurrent_mpi_checks_FALSE@pio_cksum_writer.log: pio_cksum_nc4.log
+@with_concurrent_mpi_checks_FALSE@pio_write.parallel.log: pio_cksum_writer.log
+@with_concurrent_mpi_checks_FALSE@pio_write_deco2d.parallel.log: pio_write.parallel.log
+@with_concurrent_mpi_checks_FALSE@pio_write_dist_array.log: pio_write_deco2d.parallel.log
+@with_concurrent_mpi_checks_FALSE@test_resource_copy.parallel.log: pio_write_dist_array.log
+
+clean-local:
+	-rm -f *.parallel.c
+	-rm -f *.grb *.grb2 *.nc *.nc2 *.nc4 *.srv *.ext *.cksum *.ieg *.stderr *.stdout
+	-rm -rf *.dSYM
+
+.c.parallel.c:
+	$(AM_V_GEN):;{ \
+	  echo '#define USE_MPI 1'; \
+	  echo '#include "$<"'; \
+	  } >$@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
-- 
GitLab